原生实现一个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 相关文章推荐
escape、encodeURI 和 encodeURIComponent 的区别
Mar 02 Javascript
Javascript和Ajax中文乱码吐血版解决方案
Dec 21 Javascript
jquery获取URL中参数解决中文乱码问题的两种方法
Dec 18 Javascript
JavaScript中的console.time()函数详细介绍
Dec 29 Javascript
14个有用的Jquery技巧分享
Jan 08 Javascript
JavaScript设计模式之工厂模式和构造器模式
Feb 11 Javascript
JavaScript实现点击按钮切换网页背景色的方法
Oct 17 Javascript
JavaScript实现跑马灯抽奖活动实例代码解析与优化(一)
Feb 16 Javascript
原生js获取iframe中dom元素--父子页面相互获取对方dom元素的方法
Aug 05 Javascript
BootStrap网页中代码显示用法详解
Oct 21 Javascript
JavaScript实现数组降维详解
Jan 05 Javascript
基于p5.js 2D图像接口的扩展(交互实现)
Nov 30 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 FLEA中二叉树数组的遍历输出
2012/09/26 PHP
PHP实现从上往下打印二叉树的方法
2018/01/18 PHP
JavaScript对象学习经验整理
2013/10/12 Javascript
jquery实现邮箱自动补全功能示例分享
2014/02/17 Javascript
JS设置网页图片vspace和hspace属性的方法
2015/04/01 Javascript
js获取数组的最后一个元素
2015/04/14 Javascript
js实现完美兼容各大浏览器的人民币大小写相互转换
2015/10/29 Javascript
js实现导航栏中英文切换效果
2017/01/16 Javascript
vue-router的使用方法及含参数的配置方法
2018/11/13 Javascript
基于Vue.js与WordPress Rest API构建单页应用详解
2019/09/16 Javascript
Vue使用虚拟dom进行渲染view的方法
2019/12/26 Javascript
Vue路由切换页面不更新问题解决方案
2020/07/10 Javascript
Vue 实现可视化拖拽页面编辑器
2021/02/01 Vue.js
[00:37]DOTA2上海特级锦标赛 Secert 战队宣传片
2016/03/03 DOTA
在Python中使用lambda高效操作列表的教程
2015/04/24 Python
python使用xlrd实现检索excel中某列含有指定字符串记录的方法
2015/05/09 Python
Python开发SQLite3数据库相关操作详解【连接,查询,插入,更新,删除,关闭等】
2017/07/27 Python
python保存二维数组到txt文件中的方法
2018/11/15 Python
树莓派使用USB摄像头和motion实现监控
2019/06/22 Python
pycharm运行程序时看不到任何结果显示的解决
2020/02/21 Python
python使用html2text库实现从HTML转markdown的方法详解
2020/02/21 Python
python GUI库图形界面开发之PyQt5复选框控件QCheckBox详细使用方法与实例
2020/02/28 Python
在Python IDLE 下调用anaconda中的库教程
2020/03/09 Python
什么是python的函数体
2020/06/19 Python
Python with语句用法原理详解
2020/07/03 Python
如何在Canvas中添加事件的方法示例
2019/05/21 HTML / CSS
会计助理的岗位职责
2013/11/29 职场文书
公司授权委托书范文
2014/08/02 职场文书
教师查摆问题自查报告
2014/10/11 职场文书
武夷山导游词
2015/02/03 职场文书
2014年度个人总结范文
2015/03/09 职场文书
大客户经理岗位职责
2015/04/09 职场文书
PHP解决高并发问题
2021/04/01 PHP
关于maven依赖 ${xxx.version}报错问题
2022/01/18 Java/Android
解决Vmware虚拟机安装centos8报错“Section %Packages Does Not End With %End. Pane Is Dead”
2022/06/01 Servers
IDEA中sout快捷键无效问题的解决方法
2022/07/23 Java/Android