借鉴redux,一个简单的react状态管理方案

react状态管理方案有不少,其中最简单的最经常使用的是redux。javascript

redux实现

redux作状态管理,是利用reducer和action实现的state的更新。 若是想要用redux,须要几个步骤java

  1. actions

建立actions.jsreact

// actions.js
export const SET_NAME = 'SET_NAME';
export const setName = (name) => {
    return {
        type: SET_NAME,
        name,
    }
}
复制代码
  1. reducer

建立reducers.jsgit

// 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. 入口文

项目的入口文件github

// 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组件

业务组件代码redux

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结合。app

Provider

Provider是一个高阶组件,他须要在最外层,才能实现store被全部子组件共享。dom

connect

connect方法是将react组件链接store的方法。connect方法会将组件使用到的state和须要触发的action映射到react组件的属性上。ide

详解请看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

相关文章
相关标签/搜索