原生实现一个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 表格排序和表头浮动效果(扩展SortTable)
Apr 07 Javascript
jquery 查找iframe父级页面元素的实现代码
Aug 28 Javascript
使用JavaScript动态设置样式实现代码(2)
Jan 25 Javascript
Enter转换为Tab的小例子(兼容IE,Firefox)
Nov 14 Javascript
基于mouseout和mouseover等类似事件的冒泡问题解决方法
Nov 18 Javascript
使用js判断控件是否获得焦点
Jan 03 Javascript
深入理解jQuery之事件移除
Jun 02 Javascript
vue制作加载更多功能的正确打开方式
Oct 12 Javascript
基于angular实现模拟微信小程序swiper组件
Jun 11 Javascript
Vue项目自动转换 px 为 rem的实现方法
Oct 29 Javascript
node之本地服务器图片上传的方法示例
Mar 26 Javascript
JavaScript如何利用Promise控制并发请求个数
May 14 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
php获取网页内容方法总结
2008/12/04 PHP
PHP命名空间(namespace)的动态访问及使用技巧
2014/08/18 PHP
详解PHP的Yii框架中日志的相关配置及使用
2015/12/08 PHP
thinkPHP5实现的查询数据库并返回json数据实例
2017/10/23 PHP
jquery中dom操作和事件的实例学习-表单验证
2011/11/30 Javascript
js控制滚动条缓慢滚动到顶部实现代码
2013/03/20 Javascript
JS实现时间格式化的方式汇总
2013/10/16 Javascript
Javascript玩转继承(三)
2014/05/08 Javascript
用js读、写、删除Cookie代码续篇
2014/12/03 Javascript
js实现上传图片预览的方法
2015/02/09 Javascript
jQuery对指定元素中指定字符串进行替换的方法
2015/03/17 Javascript
JS判断浏览器是否安装flash插件的简单方法
2016/09/13 Javascript
JS正则匹配URL网址的方法(可匹配www,http开头的一切网址)
2017/01/06 Javascript
Angular获取手机验证码实现移动端登录注册功能
2017/05/17 Javascript
一次围绕setTimeout的前端面试经验分享
2017/06/15 Javascript
利用百度地图API获取当前位置信息的实例
2017/11/06 Javascript
推荐10款扩展Web表单的JS插件
2017/12/25 Javascript
记一次webpack3升级webpack4的踩坑经历
2018/06/12 Javascript
浅析js中mvvm模式实现的原理
2018/10/06 Javascript
PM2自动部署代码步骤流程总结
2018/12/10 Javascript
node.js的Express服务器基本使用教程
2019/01/09 Javascript
Python中文分词工具之结巴分词用法实例总结【经典案例】
2017/04/15 Python
Python基于QRCode实现生成二维码的方法【下载,安装,调用等】
2017/07/11 Python
利用python如何处理nc数据详解
2018/05/23 Python
Python DataFrame 设置输出不显示index(索引)值的方法
2018/06/07 Python
使用CSS3的::selection改变选中文本颜色的方法
2015/09/29 HTML / CSS
法国珠宝店:CLEOR
2017/01/29 全球购物
中专毕业生的自我鉴定
2013/12/01 职场文书
迟到检讨书1000字
2014/01/15 职场文书
某某同志考察材料
2014/05/28 职场文书
医院2014国庆节活动策划方案
2014/09/21 职场文书
领导班子整改方案和个人整改措施
2014/10/25 职场文书
家长反馈意见及建议
2015/06/03 职场文书
法院执行局工作总结
2015/08/11 职场文书
环保主题班会教案
2015/08/13 职场文书
Java org.w3c.dom.Document 类方法引用报错
2021/08/07 Java/Android