中间件

iFlow提供了好几种不同类型的中间件用于控制不同流程下的Action运行和State改变,其中有middleware它是标准中间件API,它包含了所有能使用的五种类型中间件stateWillInitialize/actionWillStart/stateWillChange/stateDidChange/actionDidEnd,支持添加多个不同类型的中间件,而且被添加的同类型的中间件是有序的。

import iFlow from 'iflow'

const pipe = iFlow({
  //deliberately omit state and actions for demo.
}).middleware({
    stateWillInitialize: (...args) => {},
    actionWillStart: (...args) => {},
    stateWillChange: (...args) => {},
    stateDidChange: (...args) => {},
    actionDidEnd: (...args) => {},
})

const store = pipe.create()

如果只需要快速添加单个类型中间件,iFlow允许可以使用其对应的简单API。

  • 中间件对照表如下:
中间件API 直接接口API return return value 异步 说明
stateWillInitialize setInitializeValue 可添加初始化的值 初始化中间件
actionWillStart addInterceptor 可改变action参数 Action前置中间件
stateWillChange addMiddleware 可改变set的值 State Change前置中间件
stateDidChange addObserver - State Change后置通知中间件
actionDidEnd addListener - Action后置通知中间件

标准中间件的API和直接中间件接口的API使用方式是等价的,例如

import iFlow from 'iflow'

const pipe = iFlow({
  //deliberately omit state and actions for demo.
}).middleware({
    actionWillStart: (...args) => {
      // start middleware
    }
})

const store = pipe.create()
import iFlow from 'iflow'

const pipe = iFlow({
  //deliberately omit state and actions for demo.
}).addInterceptor((...args)=>{
  // addInterceptor middleware
})

const store = pipe.create()

上述两种添加一次Action开始执行拦截中间件是等价的,其他对应API也是如此。

用途

iFlow的middleware是强大的,有用的。 例如,我们可以设计一个自定义的middleware ,完成一个持久化中间件插件,我们可以用于调试可以log对应的Store的State Tree快照,或者可以利用middleware完成一个immutable Web库的连接器,等等。

它可以让丰富需求的开发者进行各种中间插件的开发。由于时间仓促,我们后续会对改章节继续补充更详细信息。

示例

TODO例子我们可以为它加上调试中间件,并为加上Undo/Redo功能需要的record state中间件

import iFlow, { getState, setState } from 'iflow'

const pipe = iFlow({
  //deliberately omit state and actions for demo.
  history: [{
    list: [],
    tabStatus: 'All'
  }],
  index: 1,
  record (actionName) {
    if ([
        'add',
        'toggleTodo',
        'clearCompleted',
      ].includes(actionName)) {
      const {
        list,
      } = getState(this)
      this.history.splice(this.index, this.history.length - this.index, {
        list,
      })
      this.index += 1
    }
  },
  doing (index) {
    this.index += index
    const {
      list,
    } = getState(this.history[this.index - 1])
    setState(this, {
      list,
    })
  }
}).addObserver(() => {
  console.log(`log change store:`, pipe.getState())
}).addListener((...args) => {
  const actionName = args.slice(-2, -1)[0]
  actionName !== 'record' && store.record(actionName)
})

const store = pipe.create()

这样我们就简单实现Undostore.doing(-1)和 Redostore.doing(1)操作函数,很简单吧。

results matching ""

    No results matching ""