• react-mobx-1


    import {observable} from 'mobx';
    
    var appState = observable({
        timer: 0
    });
    import {observer} from 'mobx-react';
    
    @observer
    class TimerView extends React.Component {
        render() {
            return (
                <button onClick={this.onReset.bind(this)}>
                    Seconds passed: {this.props.appState.timer}
                </button>
            );
        }
    
        onReset() {
            this.props.appState.resetTimer();
        }
    };
    
    ReactDOM.render(<TimerView appState={appState} />, document.body);
    appState.resetTimer = action(function reset() {
        appState.timer = 0;
    });
    
    setInterval(action(function tick() {
        appState.timer += 1;
    }), 1000);
    1. State(状态)
    状态 是驱动应用的数据, 就像是有数据的excel表格。
    2. Derivations(衍生)
    任何源自状态并且不会再有任何进一步的相互作用的东西就是衍生。 
    
    用户界面
    衍生数据,比如剩下的待办事项的数量。
    后端集成,比如把变化发送到服务器端。
    MobX 区分了两种类型的衍生:
    Computed values(计算值) - 它们是永远可以使用纯函数(pure function)从当前可观察状态中衍生出的值。
    
    Reactions(反应) - Reactions 是当状态改变时需要自动发生的副作用。
    需要有一个桥梁来连接命令式编程(imperative programming)和响应式编程(reactive programming)。
    它们最终都需要实现I / O 操作。
    黄金法则: 如果你想创建一个基于当前状态的值时,请使用 computed。
    3. Actions(动作)
    动作 可以改变状态的代码。用户事件、后端数据推送、预定事件、等等。
    如果是在严格模式下使用 MobX的话,MobX 会强制只有在动作之中才可以修改状态。

    原则:

    MobX 支持单向数据流,也就是动作改变状态,而状态的改变会更新所有受影响的视图。
    
    当状态改变时,所有衍生都会进行原子级的自动更新,所有衍生默认都是同步更新。
    
    计算值 是延迟更新的,所有的计算值都应该是纯净的。它们不应该用来改变状态

    eg:

    import {observable, autorun} from 'mobx';
    
    var todoStore = observable({
        /* 一些观察的状态 */
        todos: [],
    
        /* 推导值 */
        get completedCount() {
            return this.todos.filter(todo => todo.completed).length;
        }
    });
    
    /* 观察状态改变的函数 */
    autorun(function() {
        console.log("Completed %d of %d items",
            todoStore.completedCount,
            todoStore.todos.length
        );
    });
    
    /* ..以及一些改变状态的动作 */
    todoStore.todos[0] = {
        title: "Take a walk",
        completed: false
    };
    // -> 同步打印 'Completed 0 of 1 items'
    
    todoStore.todos[0].completed = true;
    // -> 同步打印 'Completed 1 of 1 items'
  • 相关阅读:
    微信小程序 request请求封装
    JavaScript中使用比较多的两种创建对象的方式
    angularjs中audio/video 路径赋值问题
    ajax渲染swiper问题
    angularjs与vue循环数组对象是区别
    gulp安装搭建前端项目自动化
    vue中-webkit-box-orient:vertical打包放到线上不显示
    Redis高级客户端Lettuce详解
    redis单点、redis主从、redis哨兵 sentinel,redis集群cluster配置搭建与使用
    Java线程、线程池ThreadPoolExecutor详细剖析
  • 原文地址:https://www.cnblogs.com/avidya/p/11589877.html
Copyright © 2020-2023  润新知