react状态管理方案有很多,其中最简单的最常用的是redux。

redux实现

redux做状态管理,是利用reducer和action实现的state的更新。 如果想要用redux,需要几个步骤

  1. actions

创建actions.js

// actions.js
export const SET_NAME = 'SET_NAME';
export const setName = (name) => {
return {
type: SET_NAME,
name,
}
}
  1. 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;
  1. 入口文

项目的入口文件

// 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')
)
  1. 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') || '无名氏'
});

完整示例

  1. 入口文件

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'));
  1. 组件内

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状态管理方案的更多相关文章

  1. Redux/Mobx/Akita/Vuex对比 - 选择更适合低代码场景的状态管理方案

    近期准备开发一个数据分析 SDK,定位是作为数据中台向外输出数据分析能力的载体,前端的功能表现类似低代码平台的各种拖拉拽.作为中台能力的载体,SDK 未来很大概率会需要支持多种视图层框架,比如Vue2 ...

  2. React状态管理相关

    关于React状态管理的一些想法 我最开始使用React的时候,那个时候版本还比较低(16版本以前),所以状态管理都是靠React自身API去进行管理,但当时最大的问题就是跨组件通信以及状态同步和状态 ...

  3. 纯粹极简的react状态管理组件unstated

    简介 unstated是一个极简的状态管理组件 看它的简介:State so simple, it goes without saying 对比 对比redux: 更加灵活(相对的缺点是缺少规则,需要 ...

  4. (转)flutter 新状态管理方案 Provide (一)-使用

    flutter 新状态管理方案 Provide (一)-使用     版权声明:本文为博主原创文章,基于CC4.0协议,首发于https://kikt.top ,同步发于csdn,转载必须注明出处! ...

  5. vuex-- Vue.的中心化状态管理方案(vue 组件之间的通信简化机制)

    vuex-- Vue.的中心化状态管理方案(vue 组件之间的通信简化机制) 如果你在使用 vue.js , 那么我想你可能会对 vue 组件之间的通信感到崩溃 .vuex就是为了解决组件通信问题的. ...

  6. react状态管理器之mobx

    react有几种状态管理器,今天先来整理一下mobx状态管理器,首先了解一下什么是mobx 1.mobx成员: observable action 可以干嘛: MobX 的理念是通过观察者模式对数据做 ...

  7. vue3 自己做一个轻量级状态管理,带跟踪功能,知道是谁改的,还能定位代码。

    上一篇 https://www.cnblogs.com/jyk/p/14706005.html 介绍了一个自己做的轻量级的状态管理,好多网友说,状态最重要的是跟踪功能,不能跟踪算啥状态管理? 因为vu ...

  8. React状态管理之redux

    其实和vue对应的vuex都是差不多的东西,这里稍微提一下(安装Redux略过): import { createStore, combineReducers, applyMiddleware } f ...

  9. 微信小程序里使用 Redux 状态管理

    微信小程序里使用 Redux 状态管理 前言 前阵子一直在做小程序开发,采用的是官方给的框架 wepy , 如果还不了解的同学可以去他的官网查阅相关资料学习:不得不说的是,这个框架确相比于传统小程序开 ...

随机推荐

  1. loadrunner手动生成脚本函数

    1.点击insert

  2. spring扩展点之二:spring中关于bean初始化、销毁等使用汇总,ApplicationContextAware将ApplicationContext注入

    <spring扩展点之二:spring中关于bean初始化.销毁等使用汇总,ApplicationContextAware将ApplicationContext注入> <spring ...

  3. LAMP 1.4 PHP编译安装

    1.下载                                                                                                 ...

  4. play的job执行方式

    除了使用Quartz CRON trigger, 还可以写一个action来专门触发job,这样子就可以随时启动job的开始,而且还能并行其他的任务.较方便.

  5. Android的系统结构简述

    (该图片来自网络) Android系统结构主要分为四层,从上到下依次为,Application层,Application Framework层,lib层,Linux kernel层,下面对这四层进行简 ...

  6. day18-事务与连接池 4.事务特性

  7. 全文检索技术---solr

    1       Solr介绍 1.1   什么是solr Solr 是Apache下的一个顶级开源项目,采用Java开发,它是基于Lucene的全文搜索服务器.Solr可以独立运行在Jetty.Tom ...

  8. 微信 python搭建服务器

    1. 搭建服务以web.py网络框,python,腾讯云服务器为例介绍. 1)安装/更新需要用到的软件 安装python2.7版本以上 安装web.py pip install web.py sudo ...

  9. hadoop slf4j-api 1.6.x (or later) is incompatible with this binding

    hadoop slf4j-api 1.6.x (or later) is incompatible with this binding 解决方法: 在POM文件最前面加入: <dependenc ...

  10. p2590&bzoj1036 树的统计

    传送门(洛谷) 传送门(bzoj) 题目 一棵树上有n个节点,编号分别为1到n,每个节点都有一个权值w.我们将以下面的形式来要求你对这棵树完成一些操作: I. CHANGE u t : 把结点u的权值 ...