借鉴redux,实现一个react状态管理方案
react状态管理方案有很多,其中最简单的最常用的是redux。
redux实现
redux做状态管理,是利用reducer和action实现的state的更新。 如果想要用redux,需要几个步骤
- actions
创建actions.js
// actions.js
export const SET_NAME = 'SET_NAME';
export const setName = (name) => {
return {
type: SET_NAME,
name,
}
}
- reducer
创建reducers.js
// reducers.js
import {SET_NAME} from './actions';
const nameState = (state = '', action) => {
switch(action.type) {
case SET_NAME: {
return action.name;
}
default: {
return state;
}
}
}
export default nameState;
- 入口文
项目的入口文件
// index.js
import React from 'react'
import { render } from 'react-dom'
import { Provider } from 'react-redux'
import { createStore } from 'redux'
import rootReducer from './reducers'
import App from './App' const store = createStore(rootReducer) render(
<Provider store={store}>
<App />
</Provider>,
document.getElementById('root')
)
- App组件
业务组件代码
import React, { Component } from 'react';
import { connect } from 'react-redux';
import {setName} from './actions';
class App extends Component {
constructor(props) {
super(props);
}
handleClick() {
this.props.setName('张三李四')
}
render() {
return (
<div>
{this.props.name}
<button onClick={this.handleClick.bind(this)}>修改name</button>
</div>
)
}
}
const mapStateToProps = (state) => {
return {
name: state.name,
};
};
const mapDispatchToProps = (dispatch) => {
return {
setName(name) {
dispatch(setName(name));
}
}
}
export default connect(mapStateToProps, mapDispatchToProps)(App);
redux实现原理
redux是状态管理工具,react-redux使得react组件能与redux结合。
Provider
Provider是一个高阶组件,他需要在最外层,才能实现store被所有子组件共享。
connect
connect方法是将react组件连接store的方法。connect方法会将组件使用到的state和需要触发的action映射到react组件的属性上。
详解请看react-redux文档
为什么不用redux
redux提供了非常系统完整的state管理方案,用文档里的一句话则是:
通过限制更新发生的时间和方式,Redux 试图让 state 的变化变得可预测.
因为他很完整,所以相对复杂,需要较多的配置。在小的项目中想要更简便的状态管理方案,所以抛弃redux,寻找其他方案。
xudox实现
- 确定用法
- 完整示例
- 原理简介
确定用法
目的就是使用起来最简单,因此我可能会这样用
// 组件中使用
import React, { Component } from 'react';
import {connect} from 'xubox'; class AA extends Component {
constructor(props) {
super(props)
}
handleClick() {
// 给组件挂在setState$方法,在这里直接改变state值
this.props.setState$({
name: '张三李四'
})
}
render() {
return (
<div>
{this.props.name}
<button onClick={this.handleClick.bind(this)}></button>
</div>
)
}
}
// 与redux一样,函数返回组件需要的state
const mapStateToProps = (state) => {
return {
name: state.name,
};
}; // 与redux一样用法,区别是只传递mapStateToProps一个参数
connect(mapStateToProps)(AA);
从代码看上去与redux好像,只不过少了dispatch缓解,改成了直接改变state。那其他设置呢?除了手动设置初始state值,其他不需要任何设置。
设置state的初始值
// 入口文件
import configureState from 'xubox'; configureState({
name: localStorage.getItem('name') || '无名氏'
});
完整示例
- 入口文件
index.js
import React from 'react';
import ReactDOM from 'react-dom';
import App from './app.js'
import configure from 'xudux';
// 初始state
let state = {
name: '无名氏',
}; configure(state);
ReactDOM.render(
<App />
, document.getElementById('root'));
- 组件内
app.js
import React, { Component } from 'react';
import { connect } from 'xudux';
class App extends Component {
constructor(props) {
super(props);
}
handleClick() {
this.props.setState$({
name: '张三李四',
});
}
render() {
return (
<div>
{this.props.name}
<button onClick={this.handleClick.bind(this)}>修改name</button>
</div>
)
}
}
const mapStateToProps = (state) => {
return {
name: state.name,
};
};
export default connect(mapStateToProps)(App);
简单的两部就完成了状态管理。示例为一个组件内state渲染后视图,视图发起事件改变state,state改变引发视图的重新渲染。多组件间的通信同理。
原理简介
简单介绍xudux原理。原理很简单,connect形成高阶组件,在高阶组件内部监听state的变化,如果state变化则引发传入的react组件props发生变化,从而重新渲染。redux大概也是这样的逻辑。
setState$方法:此方法其实是xudux内部更新state的方法,任何组件调用此方法会触发xudux中state更新,state更新会推送给所有组件,每个组件判断自身的state是否改变,从而决定react组件是否更新。
结尾
有兴趣的大佬可以尝试一下 github
借鉴redux,实现一个react状态管理方案的更多相关文章
- Redux/Mobx/Akita/Vuex对比 - 选择更适合低代码场景的状态管理方案
近期准备开发一个数据分析 SDK,定位是作为数据中台向外输出数据分析能力的载体,前端的功能表现类似低代码平台的各种拖拉拽.作为中台能力的载体,SDK 未来很大概率会需要支持多种视图层框架,比如Vue2 ...
- React状态管理相关
关于React状态管理的一些想法 我最开始使用React的时候,那个时候版本还比较低(16版本以前),所以状态管理都是靠React自身API去进行管理,但当时最大的问题就是跨组件通信以及状态同步和状态 ...
- 纯粹极简的react状态管理组件unstated
简介 unstated是一个极简的状态管理组件 看它的简介:State so simple, it goes without saying 对比 对比redux: 更加灵活(相对的缺点是缺少规则,需要 ...
- (转)flutter 新状态管理方案 Provide (一)-使用
flutter 新状态管理方案 Provide (一)-使用 版权声明:本文为博主原创文章,基于CC4.0协议,首发于https://kikt.top ,同步发于csdn,转载必须注明出处! ...
- vuex-- Vue.的中心化状态管理方案(vue 组件之间的通信简化机制)
vuex-- Vue.的中心化状态管理方案(vue 组件之间的通信简化机制) 如果你在使用 vue.js , 那么我想你可能会对 vue 组件之间的通信感到崩溃 .vuex就是为了解决组件通信问题的. ...
- react状态管理器之mobx
react有几种状态管理器,今天先来整理一下mobx状态管理器,首先了解一下什么是mobx 1.mobx成员: observable action 可以干嘛: MobX 的理念是通过观察者模式对数据做 ...
- vue3 自己做一个轻量级状态管理,带跟踪功能,知道是谁改的,还能定位代码。
上一篇 https://www.cnblogs.com/jyk/p/14706005.html 介绍了一个自己做的轻量级的状态管理,好多网友说,状态最重要的是跟踪功能,不能跟踪算啥状态管理? 因为vu ...
- React状态管理之redux
其实和vue对应的vuex都是差不多的东西,这里稍微提一下(安装Redux略过): import { createStore, combineReducers, applyMiddleware } f ...
- 微信小程序里使用 Redux 状态管理
微信小程序里使用 Redux 状态管理 前言 前阵子一直在做小程序开发,采用的是官方给的框架 wepy , 如果还不了解的同学可以去他的官网查阅相关资料学习:不得不说的是,这个框架确相比于传统小程序开 ...
随机推荐
- netty中的ByteBuf
网络数据的基本单位总是字节.Java NIO 提供了 ByteBuffer 作为它 的字节容器,但是这个类使用起来过于复杂,而且也有些繁琐. Netty 的 ByteBuffer 替代品是 ByteB ...
- spark提交模式
spark基本的提交语句: ./bin/spark-submit \ --class <main-class> \ --master <master-url> \ --depl ...
- Wix 使用总结(续)--关于Feature和Component的状态判断安装过程(转)
安装过程中,有时候需要根据用户的设置来进行不同的安装,其中一个方面就是根据用户选择安装的Feature或者Component,来判断下一步的操作. Wix中提供了相关的判断方法和内置的状态值. ...
- RAC环境下ORACLE序列缓存导致序列混乱
目前项目中发现了这样一个问题,在数据库部署了RAC环境之后,偶尔会出现从Oracle Sequence所取出来的数是混乱的,比如第二次比第一次所取的数要小.这样当程序的逻辑依赖于ID的大小来排序时,就 ...
- WCF服务用户名密码访问
有2种方式, 第一直接在程序中指定用户名密码,配置调用 private void BtnSearch_Click(object sender, EventArgs e) { try { var cli ...
- winform 客户端 HTTP协议与服务端通信以及解决中文乱码
本来从来没有仔细研究过Http协议,今天因为公司业务需求,调试了半天,终于现在会Winform用Http协议与服务端通信了,其中常用的有POST和Get方式: 仔细看了人人网和新浪等大部分都是采用GE ...
- Webservice 或者HttpRequest请求的时候提示 “指定的注册表项不存在”错误 解决方案
今天又遇到神奇的事情,在使用WebService的时候居然提示“指定的注册表不存在.” The specified registry key does not exist. Google后发现,原来是 ...
- C/C++中的static用法总结
C中: 1. static修饰函数中的变量(栈变量):改变变量的生存期,作用域不变仍为所在函数. 只被初始化一次. 2. static修饰全局变量:限制全局变量只能被模块内访问,不可以在别的模块中用e ...
- Lxc容器基本用法
你将学到什么 如何安装LXC 如何创建LXC容器 如何管理LXC容器 如何查询进程所属Namespace 如何给LXC容器添加网卡 如何限制LXC容器资源 环境 x64 Ubuntu 14.04.3 ...
- ARC085E(最小割规划【最大流】,Dinic当前弧优化)
#include<bits/stdc++.h>using namespace std;typedef long long ll;const ll inf=0x3f3f3f3f;int cn ...