原生实现一个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中为String对象添加trim,ltrim,rtrim方法
Sep 22 Javascript
用js实现计算加载页面所用的时间
Apr 02 Javascript
JavaScript中的闭包介绍
Mar 15 Javascript
浅谈JavaScript中数组的增删改查
Jun 20 Javascript
JavaScript与ActionScript3两者的同性与差异性
Sep 22 Javascript
JS重载实现方法分析
Dec 16 Javascript
xmlplus组件设计系列之列表(4)
Apr 26 Javascript
vue富文本框(插入文本、图片、视频)的使用及问题小结
Aug 17 Javascript
详解JWT token心得与使用实例
Aug 02 Javascript
VUEX 数据持久化,刷新后重新获取的例子
Nov 12 Javascript
原生js实现弹窗消息动画
Nov 20 Javascript
jQuery实现tab栏切换效果
Dec 22 jQuery
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中实现图片的锐化
2006/10/09 PHP
php输出表格的实现代码(修正版)
2010/12/29 PHP
解析yahoo邮件用phpmailer发送的实例
2013/06/24 PHP
使用PHP获取汉字的拼音(全部与首字母)
2013/06/27 PHP
PHP set_error_handler()函数使用详解(示例)
2013/11/12 PHP
PHP生成条形码大揭秘
2015/09/24 PHP
input 和 textarea 输入框最大文字限制的jquery插件
2011/10/27 Javascript
JavaScript中两个感叹号的作用说明
2011/12/28 Javascript
图片翻转效果具体实现代码
2014/01/09 Javascript
javascript教程:关于if简写语句优化的方法
2014/05/17 Javascript
JavaScript判断一个字符串是否包含指定子字符串的方法
2015/03/18 Javascript
jquery实现简单的轮换出现效果实例
2015/07/23 Javascript
JS实现无限级网页折叠菜单(类似树形菜单)效果代码
2015/09/17 Javascript
jQuery调用WebMethod(PageMethod) NET2.0的方法
2016/04/15 Javascript
js记录点击某个按钮的次数-刷新次数为初始状态的实例
2017/02/15 Javascript
Angular2入门教程之模块和组件详解
2017/05/28 Javascript
jQuery实现轮播图源码
2019/10/23 jQuery
node实现mock-plugin中间件的方法
2019/12/25 Javascript
微信小程序开发搜索功能实现(前端+后端+数据库)
2020/03/04 Javascript
[01:05:52]DOTA2-DPC中国联赛 正赛 Ehome vs Aster BO3 第一场 2月2日
2021/03/11 DOTA
python 图片验证码代码
2008/12/07 Python
跟老齐学Python之用while来循环
2014/10/02 Python
python树莓派红外反射传感器
2019/01/21 Python
基于python框架Scrapy爬取自己的博客内容过程详解
2019/08/05 Python
python类的实例化问题解决
2019/08/31 Python
Python基础之变量基本用法与进阶详解
2020/01/03 Python
解决Keyerror ''acc'' KeyError: ''val_acc''问题
2020/06/18 Python
HTML5新特性之type=file文件上传功能
2018/02/02 HTML / CSS
法国发饰品牌:Alexandre De Paris
2018/12/04 全球购物
I.T集团香港官方商城:ITeSHOP.com Hong Kong
2019/02/15 全球购物
员工培训邀请函
2014/01/11 职场文书
《少年王冕》教学反思
2014/04/11 职场文书
班主任评语大全
2014/04/26 职场文书
2015学生会文艺部工作总结
2015/04/03 职场文书
MongoDB数据库部署环境准备及使用介绍
2022/03/21 MongoDB
mysql性能优化以及配置连接参数设置
2022/05/06 MySQL