原生实现一个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 相关文章推荐
EXTJS记事本 当CompositeField遇上RowEditor
Jul 31 Javascript
非常有用的40款jQuery 插件推荐(系列二)
Dec 25 Javascript
详解JavaScript中的4种类型识别方法
Sep 14 Javascript
解决jQuery ajax请求在IE6中莫名中断的问题
Jun 20 Javascript
Javascript es7中比较实用的两个方法示例
Jul 21 Javascript
JsChart组件使用详解
Mar 04 Javascript
使用Vuex实现一个笔记应用的方法
Mar 13 Javascript
JSON.stringify()方法讲解
Jan 31 Javascript
详解微信小程序开发聊天室—实时聊天,支持图片预览
May 20 Javascript
vue.js 打包时出现空白页和路径错误问题及解决方法
Jun 26 Javascript
ES6中的Javascript解构的实现
Oct 30 Javascript
vue2实现provide inject传递响应式
May 21 Vue.js
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
PHP树的深度编历生成迷宫及A*自动寻路算法实例分析
2015/03/10 PHP
PHP+ajax分页实例简析
2015/12/07 PHP
php表单加入Token防止重复提交的方法分析
2016/10/10 PHP
[JS]点出统计器
2020/10/11 Javascript
一些相见恨晚的 JavaScript 技巧
2010/04/25 Javascript
jQuery拖拽排序插件制作拖拽排序效果(附源码下载)
2016/02/23 Javascript
JS实现弹出居中的模式窗口示例
2016/06/20 Javascript
针对后台列表table拖拽比较实用的jquery拖动排序
2016/10/10 Javascript
用move.js库实现百叶窗特效
2017/02/08 Javascript
jQuery简单实现遍历单选框的方法
2017/03/06 Javascript
微信JS-SDK选取手机照片上传功能
2017/04/21 Javascript
jquery实现tab选项卡切换效果(悬停、下方横线动画位移)
2017/05/05 jQuery
JavaScript实现二叉树定义、遍历及查找的方法详解
2017/12/20 Javascript
vue 路由页面之间实现用手指进行滑动的方法
2018/02/23 Javascript
JS动态插入脚本和插入引用外部链接脚本的方法
2018/05/21 Javascript
JavaScript设计模式之观察者模式(发布订阅模式)原理与实现方法示例
2018/07/27 Javascript
详解vue文件中使用echarts.js的两种方式
2018/10/18 Javascript
vue使用el-upload上传文件及Feign服务间传递文件的方法
2019/03/15 Javascript
vue-router为激活的路由设置样式操作
2020/07/18 Javascript
[48:32]VGJ.T vs Fnatic 2018国际邀请赛小组赛BO2 第一场 8.16
2018/08/17 DOTA
python静态方法实例
2015/01/14 Python
举例介绍Python中的25个隐藏特性
2015/03/30 Python
python记录程序运行时间的三种方法
2017/07/14 Python
Python自动化运维_文件内容差异对比分析
2017/12/13 Python
python实现从文件中读取数据并绘制成 x y 轴图形的方法
2018/10/14 Python
python用for循环求和的方法总结
2019/07/08 Python
使用Python实现 学生学籍管理系统
2019/11/26 Python
python创建子类的方法分析
2019/11/28 Python
详解python的super()的作用和原理
2020/10/29 Python
美国销售第一的智能手机和平板电脑保护壳:OtterBox
2017/12/21 全球购物
英国最大的宝石首饰超市:QP Jewellers
2018/09/23 全球购物
linux比较文件内容的命令是什么
2013/03/04 面试题
供货协议书范本
2014/04/22 职场文书
综治维稳工作承诺书
2014/08/30 职场文书
2014年医药代表工作总结
2014/11/22 职场文书
云冈石窟导游词
2015/02/04 职场文书