VueX详解及如何实现持久化_vue vuex 实现持久化 dispatch,阿里内部核心前端进阶手册

30 阅读1分钟
 // 专用修改state方法,其他修改state方法均是非法修改
this.\_withCommit(() => {
  entry.forEach(function commitIterator (handler) {
    handler(payload)
  })
})
// 订阅者函数遍历执行,传入当前的mutation对象和当前的state
this._subscribers
  .slice() // shallow copy to prevent iterator invalidation if subscriber synchronously calls unsubscribe
  .forEach(sub => sub(mutation, this.state))

if (
  __DEV__ &&
  options && options.silent
) {
  console.warn(
    `[vuex] mutation type: ${type}. Silent option has been removed. ` +
    'Use the filter functionality in the vue-devtools'
  )
}

}


## Action:


涉及改变数据的,使用mutations 存在业务逻辑的 就用actions  
 action 的提交类似于mutation,但是不同点在于 action不是直接改变状态,而提交的是mutation。 且action 可以包含任意异步操作。


action 函数接受一个 与store 实例具有相同方法和属性的 context 对象


Action 通过 store.dispatch 方法触发:


* 标准写法:



actions: { increment (context) { context.commit('increment') } }


* 常态写法:  
 用到参数解构 来简化代码



actions: { increment ({ commit }) { commit('increment') } }


##### dispatch 源码:



dispatch (_type, _payload) { // check object-style dispatch const { type, payload } = unifyObjectStyle(_type, _payload)

const action = { type, payload }
const entry = this._actions[type]
if (!entry) {
  if (__DEV__) {
    console.error(`[vuex] unknown action type: ${type}`)
  }
  return
}

try {
  this._actionSubscribers
    .slice() // shallow copy to prevent iterator invalidation if subscriber synchronously calls unsubscribe
    .filter(sub => sub.before)
    .forEach(sub => sub.before(action, this.state))
} catch (e) {
  if (__DEV__) {
    console.warn(`[vuex] error in before action subscribers: `)
    console.error(e)
  }
}

const result = entry.length > 1
  ? Promise.all(entry.map(handler => handler(payload)))
  : entry[0](payload)

return new Promise((resolve, reject) => {
  result.then(res => {
    try {
      this._actionSubscribers
        .filter(sub => sub.after)
        .forEach(sub => sub.after(action, this.state))
    } catch (e) {
      if (__DEV__) {
        console.warn(`[vuex] error in after action subscribers: `)
        console.error(e)
      }
    }
    resolve(res)
  }, error => {
    try {
      this._actionSubscribers
        .filter(sub => sub.error)
        .forEach(sub => sub.error(action, this.state, error))
    } catch (e) {
      if (__DEV__) {
        console.warn(`[vuex] error in error action subscribers: `)
        console.error(e)
      }
    }
    reject(error)
  })
})

}


### 持久化构建:



const store = new Vuex.Store({ state: { isPlayed: false, }, mutations: { changeState(state) { //改变state state.isPlayed = true; //设置localstorage window.localStorage.isPlayed = JSON.stringify(true); },

setPlayStatus(state, status) {
  state.isPlayed = status;

React

  • 介绍一下react

  • React单项数据流

  • react生命周期函数和react组件的生命周期

  • react和Vue的原理,区别,亮点,作用

  • reactJs的组件交流

  • 有了解过react的虚拟DOM吗,虚拟DOM是怎么对比的呢

  • 项目里用到了react,为什么要选择react,react有哪些好处

  • 怎么获取真正的dom

  • 选择react的原因

  • react的生命周期函数

  • setState之后的流程

  • react高阶组件知道吗?

  • React的jsx,函数式编程

  • react的组件是通过什么去判断是否刷新的

  • 如何配置React-Router

  • 路由的动态加载模块

  • Redux中间件是什么东西,接受几个参数

  • redux请求中间件如何处理并发

开源分享:docs.qq.com/doc/DSmRnRG…