React-StepPitGuide
  • 封面
  • 前言
  • 基础知识
    • 环境配置
      • WebPack 前端打包工具
      • Babel 编译器
      • Node 环境配置
    • 版本说明
    • JSX
    • 组件
    • Child组件
    • 多组件嵌套
    • 组件生命周期
      • 组件生命周期(React16之前)
    • State属性
    • Props属性
    • 类组件
      • React PropTypes
      • React 可复用组件
      • React 事件与数据的双向绑定
      • React 组件DOM操作
      • React 独立组件间共享 Mixins ⚠
      • React 高阶组件(HOC)
        • 继承方式的高阶组件
        • 代理方式的高阶组件
      • React 无状态组件与PureComponent
      • React 容器组件和展示组件
      • setState
    • 函数组件
      • React 函数子组件
      • React Hook
        • useState
        • useEffect
    • 组件样式
      • CSS內联式样
      • CSS模块化
    • 受控与非受控组件
  • 进阶知识
  • React Context
  • React 顶级API
  • React Portal 传送门
  • 应用知识
    • 路由
      • React-Router2
      • React-router4
        • React-router4 结合React-Redux
    • 服务端渲染
    • 性能优化
      • React 组件优化
        • 定制shouldComponentUpdate
        • PureComponent
        • immutablejs存在的意义和使用
      • Redux性能优化
      • React同构
    • 项目应用
      • React 文件组织方式
      • React 模块接口
      • React 合并reducer
      • React 问题
  • 状态管理
    • Flux
    • Redux
      • Redux 使用
      • Redux 异步
      • Redux Chrome插件使用
      • Redux React-Redux
      • Redux applyMiddleware
      • Redux 结合React
      • Redux 自制Redux
      • Redux 自制React-Redux
      • Redux 自制thunk中间件
      • Redux 自制arr中间件
    • Mobx
      • Mobx 思想
    • RXJS
    • immutable
  • 源码思考
    • 简述
    • SimpleReact
    • 虚拟DOM
      • 虚拟DOM概念(React 16前)
      • 虚拟DOM思考(React 16前)
    • 生命周期
    • 事件
    • Fiber
      • 数据结构
      • Scheduler 调度
      • Concurrent 异步渲染
    • Hooks
      • useState
由 GitBook 提供支持
在本页
  • connect负责链接组件,把redux里的数据放到组件属性中
  • Provider把store放到context里,所有的子元素可以直接取到store
  • 自制React-Redux

这有帮助吗?

  1. 状态管理
  2. Redux

Redux 自制React-Redux

connect负责链接组件,把redux里的数据放到组件属性中

export function connect(){
  //...
}
  1. 负责接受一个组件,把state里的一些数据放进去,返回一个组件

  2. 数据变化的时候,能够通知组件

分析React-Redux中

App = connect(state=>({num:state}),{add,remove})(App)
//state=>() 映射state,map state to props
//{add,remove} 从dispatch,从具体操作函数到属性的映射 ,map dipatch to props

高阶组件写法connect

  • 实现其中的mapStateToProps,mapDispatchToProps参数

//传统写法
export function connect(mapStateToProps,mapDispatchToProps){
  return function (WrapComponent){
    return class ConnectComponent extends React.Component{
    }
  }
}
//采用箭头函数
export const connect = (mapStateToProps=state=>state,mapDispatchToProps={})=>(WrapComponent)=>{
  return class ConnectComponent extends React.Component{
  }
}

Provider把store放到context里,所有的子元素可以直接取到store

class Provider extends React.Component{
  //...
}

自制React-Redux

import React from 'react'
import PropTyps from 'prop-types'
import {bindActionCreators} from './tyrmars-redux.js'
//state=>state
//function (state){
//  return state
//}
//connect
export const connect = (mapStateToProps=state=>state,mapDispatchToProps={})=>(WrapComponent)=>{
  return class ConnectComponent extends React.Component{
    static contextType = {
      store:PropTypes.object
    }
    constructor(props){
      super(props)
      this.state = {
        props:{}
      }
    }
    componentDidMount(){
      const {store} = this.context
      store.subscirbe(()=>this.update())
      this.update()
    }
    update(){
      // 获取mapStateToProps和mapDispatchToProps 放入this.props里
      const {store} = this.context
      const stateProps = mapStateToProps(store.getState())
      //不能直接传递
      // add = ()=> store.dipatch(add())通过dispatch才有意义
      // 在这里其实就是用dispatch把actionCreator包了一层
      const stateDispatch = bindActionCreators(mapDispatchToProps,store.dispatch)
      this.setState(
       props:{
       //一定要把this.state.props放在最上面,因为要覆盖之前的state
        ...this.state.props,
        ...stateProps,
        ...stateDispatch,
       }
      )
    }
    render(){
      return <WrapComponent {...this.state.props}></WrapComponent>
    }
  }
}
//Provider
export class Provider extends React.Component{
  static childContextTypes = {
    store:PropTypes.object
  }
  getChildContext(){
    return {store:this.store}
  }
  constructor(props,context){
    super(props,context)
    this.store = props.store
  }
  render(){
    return this.props.children
  }
}
上一页Redux 自制Redux下一页Redux 自制thunk中间件

最后更新于4年前

这有帮助吗?

import {bindActionCreators} from './tyrmars-redux.js' 查看

自制Redux