美文网首页
React之Flux简单总结

React之Flux简单总结

作者: 查桐宁 | 来源:发表于2017-12-14 12:15 被阅读0次

    React不适合来管理应用数据,而Redux就是管理应用状态的框架。Flux是单向数据流框架的始祖,而Redux是Flux理念的更强实现。所以理解Flux有助于对Redux更好的理解与使用。
    MVC框架中,view层与model层直接交互会让他们之间的依赖关系变得复杂。Flux的严格数据流控制能让视图与数据之间的依赖关系清晰可见,降低耦合,增加可读性与可维护性。
    下面是Flux的流程图。

    Flux流程图

    从流程图中我们很容易看出,现在更改数据的唯一方式就是Actions。这样对数据流的方向进行了严格控制。

    四个概念
    • Action: 驱动dispatcher
    • Dispatcher: 分发器,维护Store的状态
    • View:视图,显示用户界面
    • Store: 存储数据,处理数据逻辑
    javascript具体的实现思路如下:

    1、 引入Flux框架,实例化一个分发器(AppDispatcher)。

    import { Dispatcher } from 'flux'
    const AppDispatcher =  new Dispatcher()
    

    2、 定义action的行为。

    const doSomething = (params) => {
        AppDispatcher.dispatch()
    }
    // dispatch函数接受对象类型的参数,一般包含type属性,用来标识该行为,如
    const increment = () => {
        AppDispatcher.dispatch({
            type: 'increment'
        })
    }
    

    3、 定义Store
    Store决定着view层的数据来源,Flux的Store与Redux的Store是这两个框架最重要的区别。在Flux中,一般会存在多个Store(如果需要数据处理,一般一个组件创建一个Store)。当Action触发时,这个动作会派发给所有Store,引起Store对象的状态改变。
    定义Store的时候需要注意的是:一般会把Store定义成EventEmitter的实例,因为需要Store监听并分发事件。通俗地说就是,当Action触发了Store状态改变时,Store会向外通知该变化(emit),然后监听器(on)就能通知到某个执行程序(函数),函数会执行实现响应。

    const doSomethingStore = Object.assign({}, EventEmitter, {
        // getStoreValue方法向外暴露当前Store的状态,也是外部获取该Store状态的唯一方法
        getStoreValue: function () {
            return doSomethingStore.values
        },
        // 监听器,Store内部状态变化时,callback执行
        addEventListener (callback) {
            this.on(event, callback)
        },
         // 内部Store变化,向外通知变化
        emitEvent () {
            this.emit(event)
        },
        // 移除监听器
        removeEventListener(callback) {
            this.removeListener(event, callback)
        }
    })
    

    4、注册行为
    注册action就是调用 register 方法,返回值作为该Store的唯一标识,可用于其他Store对该Store的引用。

    doSomethingStore.dispatchToken = AppDispatcher.register((action) => {
        // if...else... || switch
        // 通过action的type确定当前行为,并将状态的改变emit出去。
        // doSomethingStore.emitEvent()
    })
    
    //因为action会触发所有Store,用waitFor可以决定Store状态改变的先后顺序:
    AppDispatcher.waitFor([doSomethingStore.dispatchToken])
    doOtherthingStore.emitEvent()   // 先改变doSomethingStore状态,再改变doOtherthingStore的状态
    
    总结

    Flux严格地控制了数据的传递方向,让view层与model层之间的逻辑清晰易懂。但是Flux也存在Store之间的显性依赖(waitFor),不能用于后端等缺点。

    相关文章

      网友评论

          本文标题:React之Flux简单总结

          本文链接:https://www.haomeiwen.com/subject/sgkzixtx.html