首页 > 其他分享 >实现 React-redux(三) Provider

实现 React-redux(三) Provider

时间:2024-03-18 09:45:21浏览次数:21  
标签:const import React state PropTypes Provider return redux store

react-redux.js:

  1. import React, { Component } from 'react'
  2. import PropTypes from 'prop-types'
  3. export const connect = (mapStateToProps, mapDispatchToProps) => (WrappedComponent) => {
  4. class Connect extends Component {
  5. static contextTypes = {
  6. store: PropTypes.object
  7. }
  8. constructor () {
  9. super()
  10. this.state = {
  11. allProps: {}
  12. }
  13. }
  14. componentWillMount () {
  15. const { store } = this.context
  16. this._updateProps()
  17. store.subscribe(() => this._updateProps())
  18. }
  19. _updateProps () {
  20. const { store } = this.context
  21. let stateProps = mapStateToProps
  22. ? mapStateToProps(store.getState(), this.props)
  23. : {} // 防止 mapStateToProps 没有传入
  24. let dispatchProps = mapDispatchToProps
  25. ? mapDispatchToProps(store.dispatch, this.props)
  26. : {} // 防止 mapDispatchToProps 没有传入
  27. this.setState({
  28. allProps: {
  29. ...stateProps,
  30. ...dispatchProps,
  31. ...this.props
  32. }
  33. })
  34. }
  35. render () {
  36. return <WrappedComponent {...this.state.allProps} />
  37. }
  38. }
  39. return Connect
  40. }
  41. export class Provider extends Component {
  42. static propTypes = {
  43. store: PropTypes.object,
  44. children: PropTypes.any
  45. }
  46. static childContextTypes = {
  47. store: PropTypes.object
  48. }
  49. getChildContext () {
  50. return {
  51. store: this.props.store
  52. }
  53. }
  54. render () {
  55. return (
  56. <div>{this.props.children}</div>
  57. )
  58. }
  59. }

App.js:

  1. import React, { Component } from 'react';
  2. import PropTypes from 'prop-types'
  3. import Header from './Header'
  4. import { Provider } from './react-redux'
  5. function createStore (reducer) {
  6. let state = null
  7. const listeners = []
  8. const subscribe = (listener) => listeners.push(listener)
  9. const getState = () => state
  10. const dispatch = (action) => {
  11. state = reducer(state, action)
  12. listeners.forEach((listener) => listener())
  13. }
  14. dispatch({}) // 初始化 state
  15. return { getState, dispatch, subscribe }
  16. }
  17. const themeReducer = (state, action) => {
  18. if (!state) return {
  19. themeColor: 'red'
  20. }
  21. switch (action.type) {
  22. case 'CHANGE_COLOR':
  23. return { ...state, themeColor: action.themeColor }
  24. default:
  25. return state
  26. }
  27. }
  28. const store = createStore(themeReducer)
  29. class App extends Component {
  30. render() {
  31. return (
  32. <Provider store={store}>
  33. <Header />
  34. </Provider>
  35. );
  36. }
  37. }
  38. export default App;

 

 

 

 

标签:const,import,React,state,PropTypes,Provider,return,redux,store
From: https://www.cnblogs.com/mounterLove/p/18075912

相关文章

  • 实现 React-redux(二) mapDispatchToProps
     App.js:importReact,{Component}from'react';importPropTypesfrom'prop-types'importHeaderfrom'./Header'functioncreateStore(reducer){letstate=nullconstlisteners=[]constsubscribe=(listener)=>l......
  • 可编辑表格中的两个列分别是用react-hook-form 和antd的inputNumber实现的,需要在开始
    可编辑表格中的两个列分别是用react-hook-form和antd的inputNumber实现的,需要在开始时间的列输入后失焦时,或者按enter键,鼠标聚焦到下一列,即结束时间,该如何设置在React项目中,要实现在一个可编辑表格中,当开始时间列输入后失焦或按下Enter键时,自动将焦点切换至结束时间列,你可以结合......
  • react中setState是同步的还是异步的
    首先说一下setState是同步的还是异步的?1.解读setState工作流 接下来我们就沿着这个流程,逐个在源码中对号入座。首先是setState入口函数:ReactComponent.prototype.setState=function(partialState,callback){this.updater.enqueueSetState(this,partialSta......
  • 【原创】三十分钟实时数据可视化网站前后端教程 Scrapy + Django + React 保姆级教程
    这个本来是想做视频的,所以是以讲稿的形式写的。最后没做视频,但是觉得这篇文还是值得记录一下。真的要多记录,不然一些不常用的东西即使做过几个月又有点陌生了。文章目录爬虫SCRAPYxpath后端DJANGO前端REACTHello大家好这里是小鱼,最近我做了一个前后端分离的实......
  • React — zustand状态管理工具
    zustand是一个用于状态管理的简单而强大的库,它可以与React一起使用。它提供了一种简单的方式来管理组件的状态,并且遵循了ReactHooks的使用规范。使用zustand可以方便地创建和共享状态,同时还能够实现状态的订阅和更新。通过zustand,你可以创建自定义的状态钩子,并在组件中......
  • 前端React篇之React setState 调用的原理、React setState 调用之后发生了什么?是同步
    目录ReactsetState调用的原理ReactsetState调用之后发生了什么?是同步还是异步?ReactsetState调用之后发生了什么?setState是同步还是异步的ReactsetState调用的原理在React中,setState方法是用于更新组件状态的重要方法。当setState被调用时,React会对组件进......
  • 除了Redux能不能使用zustand作为局部作用域的数据统一存储
    当然可以。Zustand作为一个轻量级的状态管理库,非常适合用来作为局部作用域的数据统一存储方案。相较于Redux,它更注重简洁性和易用性,并且充分利用了ReactHooks的特性。在使用Zustand时,你可以创建多个独立的store来管理不同组件或模块的本地状态。每个store都是自包含......
  • React — Class类组件
    一、Class类组件基础模板import'./App.css';import{Component}from'react'classCounterextendsComponent{//编写组件的逻辑代码//1.状态变量事件回调UI//2.定义状态变量state={count:0}setCount=()=>{this.setState({c......
  • 使用useContext和useReducer实现类似于redux的简单状态管理
    useContext和useReducer的联合用法(实现多组件多状态管理)useReduceruseReducer(reducer,initialArg,init?)参数reducer:(state:S,action:A)=>newState:S;用于更新state的纯函数。参数为state和action,返回值是更新后的state。state与action可以是任意合法值。initi......
  • iOS端创建ReactNative容器第一步:打出jsbundle和资源包
    react-native的打包流程是通过执行react-nativebundle指令进行的。 添加构建指令修改RN项目中的package.json文件,先其中添加构建命令build-release-ios和build-debug-ios"scripts":{"android":"react-nativerun-android","ios":"react-nativerun-ios"......