美文网首页
15.首页组件拆分+专题区域布局+reducer的设计19-06

15.首页组件拆分+专题区域布局+reducer的设计19-06

作者: 你坤儿姐 | 来源:发表于2019-06-20 15:46 被阅读0次

代码见https://gitee.com/XiaoKunErGe/JianShu.git历史版本第15次提交。
一.创建一个pages文件夹,并在文件夹下创建两个home和detail两个文件夹,并分别在里面创建index.js文件,填写基本代码

import React, { Component } from 'react';
class Home extends Component {
  render(){
    return(
      <div>Home~</div>
    )
  }
}
export default Home;

二.将home和detail天加到使用react-router-dom创建路由中

<BrowserRouter>
          <Route path='/' exact component={Home}/>
          <Route path='/detail' exact component={Detail}/>
        </BrowserRouter>

三.到home文件夹下,根据页面大小布局创建组件
index.js

import React, { Component } from 'react';
import {
  HomeWrapper,
  HomeLeft,
  HomeRight
} from './style'
class Home extends Component {
  render(){
    return(
     <HomeWrapper>
        <HomeLeft> 
           <img className='banner-img' src="//upload.jianshu.io/admin_banners/web_images/4660/224da83c76e01d5deff07e163615921233af5c82.jpg?imageMogr2/auto-orient/strip|imageView2/1/w/1250/h/540"/>
        </HomeLeft>
        <HomeRight>
        </HomeRight>
     </HomeWrapper>
    )
  }
}
export default Home;

style.js

import styled from 'styled-components';

export const HomeWrapper = styled.div`
  width: 960px;
  margin: 0 auto;
  height: 300px;
  // background: gray;
`;
export const HomeLeft = styled.div`
  float: left;
  margin-left: 15px;
  padding-top: 30px;
  width: 625px;
  // background: yellow;
  .banner-img {
     width: 625px;
     height: 270px;
   }
`;
export const HomeRight = styled.div`
  width: 240px;
  float: right;
  background: yellow;
`;
export const TopicWrapper = styled.div`
  overflow: hidden;
  padding: 20px 0 10px 0;
  // background: red;
  margin-left: -18px;
`;
四.在home文件夹下创建components文件夹,根据简书的布局创建组件 屏幕快照 2019-06-20 11.21.30.png

先分别在组件中填入基本代码

import React, { Component } from 'react';
class List extends Component {
  render(){
    return(
      <div>List</div>
    )
  }
}
export default List;

到Topic.js中填写添加更多热门组件,因为这个Topic实际功能特别少,所以他的样式写在home最外层的style里
Topic.js

import React, { Component } from 'react';
import { TopicWrapper,TopicItem } from '../style';
//引用最home外层的style
class Topic extends Component {
  render(){
    return(
      <TopicWrapper>
        <TopicItem>
          <img
            className='topic-pic'
            src='//wx1.sinaimg.cn/orj360/933aae1agy1frwojshgg9j20j60j6tcw.jpg'/>
           社会热点
        </TopicItem>
      </TopicWrapper>
      //这个Topic组件实际功能特别少,所以他的样式写在home最外层的style里
    )
  }
}
export default Topic;

style.js

export const TopicWrapper = styled.div`
  overflow: hidden;
  padding: 20px 0 10px 0;
  // background: red;
  margin-left: -18px;
`;
export const TopicItem = styled.div`
  float: left;
  height: 32px;
  line-height: 32px;
  margin-left: 18px;
   margin-bottom: 18px;
  padding-right: 10px;
  background: #f7f7f7;
  font-size: 14px;
  color: #000;
  border: 1px solid #dcdcdc;
  border-radius: 4px;
  .topic-pic {
    display: block;
    float:left;
    width: 32px;
    height: 32px;
    margin-right: 10px;
  }  
`;
这样就把热门推荐里的item基本样式实现了,多添加几个<TopicItem>就是如图效果 屏幕快照 2019-06-20 11.30.52.png
上半部分我们用实现了热门推荐的基本样式,下面我们用reducer为这个样式添加数据

一.在home文件夹下创建一个store文件夹,并在store文件夹下创建reducer和index。
reducer.js

import {  fromJS } from 'immutable';
const defaultState = fromJS({
  topicList: [{
    id: 1,
    title: "社会热点",
    imgUrl: '//wx1.sinaimg.cn/orj360/933aae1agy1frwojshgg9j20j60j6tcw.jpg',
  },{
    id: 1,
    title: "手绘",
    imgUrl: '//wx1.sinaimg.cn/orj360/933aae1agy1frwojshgg9j20j60j6tcw.jpg',
  }]
});
export default (state = defaultState, action) => {
    switch(action.type){
       default:
           return state;
   }
}

index.js

//在这里将reducer导出
import reducer from './reducer';
export { reducer };

二.然后到src下最外层store的reducer中去集中处理home这个reducer,返回给最外层store,提供给用户

import { combineReducers } from 'redux-immutable';
//redux提供的combineReducers可以把小的reducer合并起来
import {reducer as headerReducer} from '../commen/header/store';
import {reducer as homeReducer}from'../pages/home/store'

const reducer = combineReducers({
  header: headerReducer,
  home: homeReducer,
});
export default reducer;

三.在Topic.js中使用store的数据

在.App.js中只要是在Provider中的组件都可以使用store的数据,Home在Provider中,Topic是Home的子组件所以也可以直接使用store里的数据。

在Topic.js中使用react-redux获取store中的数据
import { connect }from 'react-redux';
让Topic组件和store的数据进行连接
export default connect(mapStateToProps, null)(Topic);
从store中拿到所需数据,

const mapStateToProps  = (state) => ({
  //mapStateToProps指的是从store里拿数据
  list: state.get('home').get('topicList')
});

四.拿到数据改写<TopicItem>组件

<TopicWrapper>
        {
          this.props.list.map((item) => {
            return(
              <TopicItem key={item.get('id')}>
            <img
            className='topic-pic'
            src={item.get('imgUrl')}
            />
                {item.get('title')}
            </TopicItem>
            )
          })
        }
 </TopicWrapper>

这里可以去掉return,将花括号改为小括号,代码更加简洁

<TopicWrapper>
        {
          this.props.list.map((item) => (    
              <TopicItem key={item.get('id')}>
                 <img
                    className='topic-pic'
                    src={item.get('imgUrl')}
                 />
                {item.get('title')}
            </TopicItem>   
          ))
        }
 </TopicWrapper>

刷新,显示


屏幕快照 2019-06-20 15.43.10.png

相关文章

  • 15.首页组件拆分+专题区域布局+reducer的设计19-06

    代码见https://gitee.com/XiaoKunErGe/JianShu.git历史版本第15次提交。一....

  • Flutter布局锦囊---涂鸦风格按钮

    设计给的效果如下: 拿到设计后,先把整体拆分成几个部分: “可点击框”,使用堆栈(Stack)组件布局的可点击区域...

  • 综合实战

    制作有路网首页 有路网首页布局框架制作 划分区域,确定div 测量各个区域的宽高 使用浮动对网页进行布局 整合各章...

  • 综合实战

    制作有路网首页 有路网首页布局框架制作 划分区域,确定div测量各个区域的宽高使用浮动对网页进行布局 整合各章中的...

  • 9-1 动态路由配置及banner布局 9-2

    9-1 动态路由配置及banner布局 动态路由配置 布局 9-2 公用图片画廊组件拆分 布局 Swiper组件配置

  • day1

    制作首页APP组件 完成header区域,使用mint-UI组件 完成底部tabbar区域,使用的是MUI。 MU...

  • iOS组件化(中篇)-拆分业务组件

    在上一篇中对基础组件进行了拆分,接下来会拆分业务组件。业务组件最简单的理解(比如,有3个tabbar专题、...

  • <S-Blog> 博客首页界面设计

    在设计完了登录界面以后,继续使用flex布局设计一下博客首页。 首先,来设计一下首页的界面。 圣杯布局 在css ...

  • Flutter 仿纵横中文网

    代码 GITHUB 介绍 仿纵横中文网WAP页面 主要工作 路由 界面布局 组件拆分 组件 Container:背...

  • 从零到一搭建 react 项目系列之(十)

    本文将介绍 Reducer 的拆分。 Reducer 函数负责生成 State。但由于整个 Web 应用只有一个 ...

网友评论

      本文标题:15.首页组件拆分+专题区域布局+reducer的设计19-06

      本文链接:https://www.haomeiwen.com/subject/uitkqctx.html