原生实现一个react-redux的代码示例


Posted in Javascript onJune 08, 2018

自己动手实现一个react-redux

之前试过自己动手实现一个redux,这篇blog主要记录动手实现一个react-redux的过程。

这个react-redux还有一点点小瑕疵,我以一个计数器作为例子来实现的。

这是目录结构:

这里的connect.js文件就是react-redux。

├─component
│   connect.js
│   counter.js
│
└─store
    index.js

index.js:

import React from "react";
import ReactDom,{render} from "react-dom";
import Couter from "./component/counter";
import {Provider} from "./component/connect" import store from "./store/index"  ReactDom.render(<Provider store={store}><Couter/></Provider>,document.getElementById("root"));

./store/index.js:

import {createStore} from "redux";
function reducer(state={number:0},action) {
  switch (action.type){
    case "add":
      return {number:state.number+action.count}
    default:
      return state;
  }
}

export default createStore(reducer);

./component/connect.js:

import React from "react";
import PropTypes from "prop-types";
//Provider是一个组件 接受一个store属性 将其内容挂载在上下文context //这样后代才可以都有办法拿到 class Provider extends React.Component{

  static childContextTypes={
    //设置上下文的类型是对象
 store:PropTypes.object
 }

  getChildContext(){
    //获取并设置后代上下文的内容
 return {store:this.props.store}
  }
  render(){
    return this.props.children
 }
}

let connect=(mapStateToProps,mapDispatchToProps)=>(comp)=>{
  return class Proxy extends React.Component{
    static contextTypes={
      store:PropTypes.object
 }
    constructor(props,context){
      super(props);
      //将参数mapStateToProps 的解构赋值 代理组件的状态
 this.setState=mapStateToProps(context.store.getState())
    }
    componentDidMount(){
      this.context.store.subscribe(()=>{
        this.setState(mapStateToProps(this.context.store.getState()))
      })
    }
    render(){
      return <comp {...this.state} {...mapDispatchToProps(this.context.store.dispatch)}/>
    }
  }
}

export {Provider,connect}

./component/counter.js:

import React from "react";
import {connect} from "./connect";
export default class Counter extends React.Component{
  constructor(props){
    super(props);
  }

  render(){
    return (
      <div>
        <button onClick={()=>{
          this.props.add(5);
        }}>+</button>
        {this.props.n}
      </div>
    )
  }
}

let mapStateToProps=(state)=>{
  return {n:state.number}
};
let mapDispatchToProps=(dispatch)=>{
  return {
    add:(count)=>{
      dispatch({type:"add",count:count})
    }
  }
}

export default connect(mapStateToProps,mapDispatchToProps)(Counter)

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
javascript脚本编程解决考试分数统计问题
Oct 18 Javascript
JavaScript数组各种常见用法实例分析
Aug 04 Javascript
基于Angularjs实现分页功能
May 30 Javascript
AngularJS中如何使用echart插件示例详解
Oct 26 Javascript
JavaScript中三种常见的排序方法
Feb 24 Javascript
js学使用setTimeout实现轮循动画
Jul 17 Javascript
微信小程序 转发功能的实现
Aug 04 Javascript
VueJs组件prop验证简单介绍
Sep 12 Javascript
Vue+SpringBoot开发V部落博客管理平台
Dec 27 Javascript
浅入深出Vue之自动化路由
Aug 06 Javascript
Jquery实现获取子元素的方法分析
Aug 24 jQuery
vue多个元素的样式选择器问题
Nov 29 Javascript
vue项目中使用百度地图的方法
Jun 08 #Javascript
浅谈Vue路由快照实现思路及其问题
Jun 07 #Javascript
JavaScript中click和onclick本质区别与用法分析
Jun 07 #Javascript
jQuery动态移除与增加onclick属性的方法详解
Jun 07 #jQuery
使用Vue-cli 3.0搭建Vue项目的方法
Jun 07 #Javascript
vue 国际化 vue-i18n 双语言 语言包
Jun 07 #Javascript
vue cli2.0单页面title修改方法
Jun 07 #Javascript
You might like
centos 5.6 升级php到5.3的方法
2011/05/14 PHP
浅析PHP绘图技术
2013/07/03 PHP
C#静态方法与非静态方法实例分析
2014/09/22 PHP
ThinkPHP打开验证码页面显示乱码的解决方法
2014/12/18 PHP
yii2使用GridView实现数据全选及批量删除按钮示例
2017/03/01 PHP
Laravel框架模板继承操作示例
2018/06/11 PHP
Aster vs Newbee BO5 第三场2.19
2021/03/10 DOTA
Js动态添加复选框Checkbox的实例方法
2013/04/08 Javascript
JavaScript 继承详解(五)
2016/10/11 Javascript
BootStrap实现手机端轮播图左右滑动事件
2016/10/13 Javascript
jquery 追加元素append、prepend、before、after用法与区别分析
2016/12/02 Javascript
js实现百度搜索提示框
2017/02/05 Javascript
详解webpack 如何集成第三方js库
2017/06/29 Javascript
mui开发中获取单选按钮、复选框的值(实例讲解)
2017/07/24 Javascript
nodeJs实现基于连接池连接mysql的方法示例
2018/02/10 NodeJs
如何通过shell脚本自动生成vue文件详解
2019/09/10 Javascript
js编写简易的计算器
2020/07/29 Javascript
JS实现简易图片自动轮播
2020/10/16 Javascript
JavaScript语法约定和程序调试原理解析
2020/11/03 Javascript
python实现比较两段文本不同之处的方法
2015/05/30 Python
Python实现调用另一个路径下py文件中的函数方法总结
2018/06/07 Python
小白入门篇使用Python搭建点击率预估模型
2018/10/12 Python
Python面向对象原理与基础语法详解
2020/01/02 Python
Python3利用scapy局域网实现自动多线程arp扫描功能
2021/01/21 Python
Python 里最强的地图绘制神器
2021/03/01 Python
奥地利汽车配件店:Pkwteile.at
2017/03/10 全球购物
W Hamond官网:始于1979年的钻石专家
2020/07/20 全球购物
摄影实习自我鉴定
2013/09/20 职场文书
大学生先进事迹材料
2014/02/16 职场文书
小学语文国培感言
2014/03/04 职场文书
党员干部2014全国两会学习心得体会
2014/03/10 职场文书
联欢晚会主持词
2014/03/25 职场文书
老干部工作先进集体事迹材料
2014/05/21 职场文书
有关西游记的读书笔记
2015/06/25 职场文书
使用pandas模块实现数据的标准化操作
2021/05/14 Python
MySQL七种JOIN类型小结
2021/10/24 MySQL