原生实现一个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 相关文章推荐
Jquery 最近浏览过的商品的功能实现代码
May 14 Javascript
Jquey拖拽控件Draggable使用方法(asp.net环境)
Sep 28 Javascript
js和jquery如何获取图片真实的宽度和高度
Sep 28 Javascript
JavaScript学习笔记之定时器
Jan 22 Javascript
JS实现网页上随机产生超链接地址的方法
Nov 09 Javascript
将JavaScript的jQuery库中表单转化为JSON对象的方法
Nov 17 Javascript
JQuery ZTree使用方法详解
Jan 07 Javascript
easyui-datagrid特殊字符不能显示的处理方法
Apr 12 Javascript
webpack配置的最佳实践分享
Apr 21 Javascript
Node.js实现一个HTTP服务器的方法示例
May 13 Javascript
Vuex实现数据增加和删除功能
Nov 11 Javascript
electron踩坑之dialog中的callback解决
Oct 06 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.ini实现PHP文件上传功能
2014/11/27 PHP
PHP实现图片自动清理的方法
2015/07/08 PHP
joomla组件开发入门教程
2016/05/04 PHP
[全兼容哦]--实用、简洁、炫酷的页面转入效果loing
2007/05/07 Javascript
屏蔽网页右键复制和ctrl+c复制的js代码
2013/01/04 Javascript
Javascript中valueOf与toString区别浅析
2013/03/19 Javascript
有关于eclipse配置spket需要注意的一些地方
2013/04/07 Javascript
JS动态加载当前时间的方法
2015/02/09 Javascript
PhotoShop给图片自动添加边框及EXIF信息的JS脚本
2015/02/15 Javascript
js完美实现@提到好友特效(兼容各大浏览器)
2015/03/16 Javascript
AngularJS ng-mousedown 指令
2016/08/02 Javascript
AngularJS入门教程引导程序
2016/08/18 Javascript
JavaScript中的call和apply的用途以及区别
2017/01/11 Javascript
django使用channels2.x实现实时通讯
2018/11/28 Javascript
vue 添加和编辑用同一个表单,el-form表单提交后清空表单数据操作
2020/08/03 Javascript
vue+elementUI(el-upload)图片压缩,默认同比例压缩操作
2020/08/10 Javascript
JavaScript数组排序的六种常见算法总结
2020/08/18 Javascript
详解如何在vue+element-ui的项目中封装dialog组件
2020/12/11 Vue.js
[40:57]TI4 循环赛第二日 iG vs EG
2014/07/11 DOTA
[00:43]2016完美“圣”典风云人物:单车宣传片
2016/12/02 DOTA
[54:33]2018DOTA2亚洲邀请赛小组赛 A组加赛 Liquid vs Optic
2018/04/03 DOTA
python中日志logging模块的性能及多进程详解
2017/07/18 Python
Python3中关于cookie的创建与保存
2018/10/21 Python
python实现控制台打印的方法
2019/01/12 Python
Python字符串逆序的实现方法【一题多解】
2019/02/18 Python
15行Python代码实现网易云热门歌单实例教程
2019/03/10 Python
利用CSS3实现单选框动画特效示例代码
2016/09/26 HTML / CSS
HTML中fieldset标签概述及使用方法
2013/02/01 HTML / CSS
Stubhub英国:购买体育、演唱会和剧院门票
2018/06/10 全球购物
怎样声明一个匿名的内部类
2016/06/01 面试题
手机被没收检讨书
2014/02/22 职场文书
施工安全标语
2014/06/07 职场文书
银行领导班子四风对照检查材料
2014/09/27 职场文书
护士求职简历自我评价
2015/03/10 职场文书
文艺部部长竞选稿
2015/11/21 职场文书
小学三年级数学教学反思
2016/02/16 职场文书