在正式项目当中我们一般是使用react-redux这个库提供的 Provider 和connect这两个库来关联react和redux,但是我们也可以使用手动关联,在学习过程当中不要求接近,理解最原始的方法更有助于我们学习和进步

手动关联

使用react来展示界面,使用redux的store来存储数据,在react当中使用store.getState() 来获取当前的数据,并且展示子啊界面上

初学者一般喜欢这样写(以计数器为例子,其他例子也一样):

const reducer = (preState = { value: 0 }, action) => { // 定义reducerswitch (action.type) {case 'incre':return { value: preState.value + action.value }case 'decre':return { value: preState.value - action.value }default:return preState}
}const store = createStore(reducer) // 根据reducers创建storeconst Counter = ({ // 定义一个组件value,onInCrement,
}) => {return (<div className="App">{value}<button onClick={onIncrement}> + </button></div>)
}
const render = () => {ReactDOM.render(<Counter value={store.getState().value} onInCrement={() => store.dispatch({ type: 'incre', value: 1})}/>,document.getElementById('root'))
}store.subscribe(render) // 当store当中的状态发生改变时, 触发render函数

在这个例子中每当store发生改变都会触发一次ReactDOM的render方法,下面来看一下该进的方法

const reducer = (preState = { value: 0 }, action) => {switch (action.type) {case 'incre':return { value: preState.value + action.value }case 'decre':return { value: preState.value - action.value }default:return preState}
}const store = createStore(reducer)const Counter = ({value,onInCrement,
}) => {return (<div className="App">{value}<button onClick={onIncrement}> + </button></div>)
}class App extends Component {constructor (props) {super(props)}componentDidMount () {this.unMount = store.subscribe(() => this.forceUpdate())}render() {return (<Counter value={store.getState().value} onInCrement={() => store.dispatch({ type: 'incre', value: 1})}/>)}}ReactDOM.render(<App />,document.getElementById('root'))

在改进的方法中,我们只在最开始的时候调用一次ReactDOM的render方法,我们把当store状态发生改变之后的监听绑定到react提供的一个主动触发更新的forceUpdate()方法,也就是调用一次forceUpdate就再刷新一次,我们刷新的时候store的状态已经改变了因此获取到的也是最新的数据

使用connet关联

const reducer = (preState = { value: 0 }, action) => {switch (action.type) {case 'incre':return { value: preState.value + action.value }case 'decre':return { value: preState.value - action.value }default:return preState}
}
const store = createStore(reducer)const App = ({value,onIncrement,
}) => {return (<div className="App">{value} <button onClick={onIncrement}> + </button></div>)
}
const mapStateToProps = (state) => ({ value: state.value })
const mapDispatchToProps = (dispatch) => ({onIncrement: () => {dispatch({type: 'incre',value: 1,})}
})
const AppContainer = connect(mapStateToProps, mapDispatchToProps)(App)ReactDOM.render(<Provider store={store}><AppContainer /></Provider>,document.getElementById('root'))

在上面我们定义了一个无状态组件,并且使用connet方法将App 和我们所需要的props连接起来,相当于我们使用connect把App需要的props传进去,而且相对于前面手动关联而言,我们不需要手动去触发react组件去刷新,使用connect之后,当store发生改变,props会跟着变,不需要我们手动刷新。

Provider

这个接受一个store参数,代表我们要绑定到组件的store,使用connect的时候我们需要在我们的组件的最外层套上Provider,这样connect才能够获取到store的数据

ReactDOM.render(<Provider store={store}><AppContainer /></Provider>,document.getElementById('root'))

connect

connect接受四个参数:[mapStateToProps], [mapDispatchToProps], [mergeProps], [options],下面分别来介绍

  • mapStateToProps(state, ownProps): (Function)

    当这个参数被指定的时候,只要store的数据一更新,这个方法就会被调用,如果不需要可以传null或者undefined

其中state代表当前store的state,ownProps代表传递给组件的props

  • mapDispatchToProps(dispatch, ownProps): (Object or Function)

当传递的是一个对象的时候

当传递的是一个function的时候,它接受一个dispatch 和 ownProps参数,如果指定了ownProps参数,每当被关联的组件收到      新的Props的时候都会触发这个函数

如果不传递这个参数,那么会默认将dispatch注入到我们的组件当中

  • mergeProps(statedispatchPropsownProps): (Function)

三个参数分别代表mapStateProps(),mapDispatchToProps()执行的结果和父组件的props, 如果不返回一个对象那么默认是将         Object.assign({}, ownProps, stateProps, dispatchProps) 将他们合并并且返回

使用connet或者手动关联react和redux相关推荐

  1. [react] 《深入浅出React和Redux》 读书笔记

    随书代码 1 React 新的前端思维方式 npm i create-react-app -g create-react-app first_react_app npm start//执行eject则 ...

  2. 使用Flow检查React,Redux和React-Redux的全面指南

    by Fabian Terh 由Fabian Terh 使用Flow检查React,Redux和React-Redux的全面指南 (A comprehensive guide to type chec ...

  3. 使用React,Redux和Router进行真正的集成测试

    by Marcelo Lotif 通过马塞洛·洛蒂夫(Marcelo Lotif) 使用React,Redux和Router进行真正的集成测试 (Real integration tests with ...

  4. Rekit Studio简介:用于React和Redux开发的真实IDE

    by Nate Wang 内特·王 Rekit Studio简介:用于React和Redux开发的真实IDE (Introducing Rekit Studio: a real IDE for Rea ...

  5. 带有Node,React和Redux 1的Retrogames库:服务器API和React前端

    2017/03/29 Update: Fixed the versions of react-router and react-hot-loader. 2017/03/20 Update: Webpa ...

  6. 为什么我在2018年从Angular切换到React和Redux

    http://blog.workshape.io 提示:不是因为炒作 我在相当长的一段时间内一直与Angular建立这种爱恨交加的关系. 这很有趣,因为当我陷入困境时,我正在学习并且正在制作一个简单的 ...

  7. angular和react_为什么我在2018年从Angular切换到React和Redux

    angular和react http://blog.workshape.io 提示:不是因为炒作 我与Angular建立了这种爱恨交加的关系已有相当一段时间了. 这很有趣,因为当我陷入困境时,我正在学 ...

  8. React和redux,ES6等前端开发经验记录总结(都是干货,看到是你的运气)

    React和redux,ES6等前端开发经验记录总结(都是干货,看到是你的运气) React和redux,ES6等前端开发经验记录总结(都是干货,看到是你的运气) 前言 箭头函数this指向 有趣的r ...

  9. LoadRunner 技巧之 手动关联与预关联

    上一节介绍了关联的原理与自动关联,除了自动关联还有另外两种关联方式:手动关联与 预关联. 手动关联                                                   ...

最新文章

  1. 《网络安全协议》课程实验大纲
  2. cuda win10安装
  3. C#语音朗读文本 — TTS的实现
  4. UVA 11210 Chinese Mahjong
  5. BmpEncrypt v3.20.1017 ++ 加密器
  6. java.lang.UnsupportedOperationException 异常分析
  7. 一日一技:一文搞懂Python错误和异常
  8. 最新《大规模机器学习》2020综述论文
  9. 在基于数据库的任务派发系统中利用SQL Server 2005 中新的查询提示来提高系统的效率...
  10. Laplacian surface editing
  11. cr2格式缩略图不显示,怎么把raw格式显示出缩略图
  12. 实现一个简易的教师管理系统(一)
  13. VS2010出现“automation服务器不能创建对象“
  14. 17 线性方程组——线性方程组解的结构、解的性质、解空间、基础解系、基础解系存在性
  15. 中移动入侵防御设备集采,总限价1.6亿;爱立信斩获95个5G商用合同
  16. matlab马赫带,学习实现马赫带效果
  17. 微信浪漫告白小程序java_微信表白小程序有哪些?微信小程序520表白神器推荐...
  18. 图解 pci pci-x pci-e
  19. 为什么百度搜索引擎优化比以前更难?
  20. 数据模型工具--powerDesigner下载分享

热门文章

  1. canvas动画--一个会移动的饭团
  2. python set集合 交集,并集,差集,对称差集
  3. Linux内核参数值vga的意义,关于传递给Linux内核的vga参数的值的意义
  4. 中兴霸道女总裁何雪梅投案自首 案发前净身出户
  5. vuecli添加和移除插件_7 款优秀 Vim 插件帮你打造完美 IDE!
  6. (车内网IDS-CAN)读书笔记——Scission
  7. java 操作pdf 模板_java使用模板生成PDF
  8. ROS学习(3)——仿真平台搭建
  9. 最新国家智能工厂政策解读:数字化成为重点趋势
  10. 健康天天报(企业微信)安卓2021.4.2