借鉴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 , 如果还不了解的同学可以去他的官网查阅相关资料学习:不得不说的是,这个框架确相比于传统小程序开 ...
随机推荐
- 转载:oracle用户创建及权限设置
权限: create session create table unlimited tablespace connect resource dba 例: #sqlplus /nolog SQL> ...
- windows修改远程桌面RDP连接数
windows 2003在默认情况下最多只允许两个用户进行远程终端连接,当达到两个远程桌面连接的到时候,再有人尝试连接,就会提示已经达到最大终端数,无法连上了. 一.windows2003终端连接数修 ...
- 想要table表格垂直滚动,加点CSS即可
<style> /*设置 tbody高度大于400px时 出现滚动条*/ table tbody { display: block; height: 400px; overflow-y: ...
- sql server 2008 开启1433端口,开启远程连接
通常情况下只需要设置两处
- oracle sql 语句 示例
--oracle 用户对象的导入导出 exp devimage/oracle@172.xx.x.xx/TESTDB owner='devimage' file=d:/devimage.dmp log= ...
- mysql数据库之表与表之间的关系
表1 foreign key 表2 则表1的多条记录对应表2的一条记录,即多对一 利用foreign key的原理我们可以制作两张表的多对多,一对一关系 多对多: 表1的多条记录可以对应表2的一条记录 ...
- Ruby环境搭建与“Hello World”
Ruby的环境搭建比较简单,在http://rubyinstaller.org/downloads/可以得到Ruby的安装包, 安装过程没什么问题.安装完成之后需要配置一下环境变量: 在PATH中填入 ...
- hive查询ncdc天气数据
使用hive查询ncdc天气数据 在hive中将ncdc天气数据导入,然后执行查询shell,可以让hive自动生成mapredjob,快速去的想要的数据结果. 1. 在hive中创建ncdc表,这个 ...
- 实现Unity对Dictionary的序列化
若有尝试过想在unity的inspector检视面板中像List或者数组那样可以编辑Dictionary变量的童鞋应该知道,Dictionary变量不会出现在inspector中,unity并不会直接 ...
- (转载)Windows无法安装到GPT分区形式磁盘解决办法
之前使用的是windows7 + ubuntu18.04双系统,硬盘分区采用的是GPT格式.重装windows系统时,提示“windows无法安装到这个磁盘.选中的磁盘采用GPT分区形式”,导致安装失 ...