经过手动编写skeleton,在fetch数据时显示skeleton loading,数据拉取成功隐藏skeletonreact
先看下效果图web
在component下建立页面对应的skeleton,而后经过在index.js中export输出,在须要使用skeleton的页面中引入。redux
charity-web |--- components |---Skeleton |---HomeProject.js home页项目列表 |---index.js 导出全部skeleton |---ProjectCard.js 项目列表item |---HomeListing.js 项目列表页 |--- pages |---index.js |---listing.js |--- redux |---app |---project |---index.js |---rootSaga.js
import HomeProjectSkeleton from './HomeProject' import ProjectListingSkeleton from './ProjectListing' import PromotionItemSkeleton from './PromotionItem' export { PromotionItemSkeleton, HomeProjectSkeleton, ProjectListingSkeleton }
import { Col, Row } from 'antd' import React, { Component } from 'react' import styled from 'styled-components' import mediaQuery from '../../utils/mediaQuery' import ProjectCard from './ProjectCard' const Container = styled.div` .projects { padding-top: 32px; ${mediaQuery.tablet} { padding-top: 24px; } ${mediaQuery.mobile} { padding-top: 24px; } } .projectWrapper { padding-bottom: 24px; } ` class HomeProject extends Component { render() { const items = [0, 1, 2, 3, 4] return ( <Container> <div className='projects'> <div className='max-width'> <Row type='flex' justify='start' gutter={24}> {items.map(i => { return ( <Col xs={24} md={12} xl={8} className='projectWrapper' key={`p_${i}`} > <ProjectCard /> </Col> ) })} </Row> </div> </div> </Container> ) } } export default HomeProject
import { Col, Row } from 'antd' import React, { Component } from 'react' import ProjectCard from './ProjectCard' class ProjectListing extends Component { render() { const items = [0, 1, 2, 3, 4] return ( <Row type='flex' justify='start' gutter={24}> {items.map(i => { return ( <Col xs={24} md={24} xl={24} className='projectWrapper' key={`p_${i}`} > <ProjectCard listStyle /> </Col> ) })} </Row> ) } } export default ProjectListing
import React, { Component } from 'react' import styled from 'styled-components' import mediaQuery from '../../utils/mediaQuery' const Container = styled.div` width: 100vw; height: 37.5vw; background-color: #f4f4f4; ${mediaQuery.mobile} { height: 56.25vw; } ` class PromotionItem extends Component { render() { return <Container /> } } export default PromotionItem
一、首先引入skeletonantd
import { HomeProjectSkeleton, PromotionItemSkeleton } from '../components/Skeleton/index'
二、在render函数中,经过 this.props.isFetching判断是否显示skeletonapp
{process.env.usePromoItem ? ( this.props.isFetching ? ( <PromotionItemSkeleton /> ) : ( <Swiper slides={this.props.promoItems} /> ) ) : ( this.renderHeroProject() )} {this.props.isFetching ? ( <HomeProjectSkeleton /> ) : ( (this.renderHighlightedProjects(), this.renderOtherProjects()) )}
三、在reduces.js中,当getHomePageDataRequest拉取数据的时候,设置isFetching为true,getHomePageDataSucceeded获取成功后,将isFetching修改成falseide
import { getHomePageDataRequest, getHomePageDataSucceeded, } from './actions' export const projectInitialState = { fetching: { getHomepageData: false, getSearchListingPageData: false } } const projectReducer = handleActions( { [getHomePageDataRequest]: state => { return { ...state, fetching: { getHomepageData: true } } }, [getHomePageDataSucceeded]: (state, action) => { return { ...state, fetching: { getHomepageData: false } } }, } projectInitialState ) export default projectReducer
四、这样,在页面中mapStateToProps中咱们能够拿到isFetching的状态,从而在数据获取成功以前显示skeleton函数
const mapStateToProps = ({ appState, projectState, paymentState }, props) => ({ isFetching: projectState.fetching.getHomepageData })
以上,就是对skeleton在项目中的应用,固然经过以上这种方式实现的skeleton,有一个很差的地方是,若是页面结构变化,咱们同时也须要更新sekleton的结构,这是比较麻烦的地方。fetch