【问题标题】:Vuex: Call getters from actionVuex:从动作中调用 getter
【发布时间】:2019-02-02 13:27:02
【问题描述】:

有没有办法让调度/动作在其中调用 getter?

mutations: {
    setData(state, data) {
        state.data = data;
    }
}
actions: {
    sendDataToServer({ commit }, payload) {
        // call getter (data) and assign to variable
        // do async functions from the data returned
    }
},
getters: {
    getAppData: state => () => {
        return state.data;
    }
}

那么这里的最佳做法是什么?使用突变来更改状态,然后获取状态并将其传递给将执行异步函数的操作,还是我需要重组我的实现?

调用突变 -> 通过 getter 获取数据 -> 调用操作

在动作上做所有事情(对动作进行突变并在不需要 getter 的情况下执行动作/异步方法)?

【问题讨论】:

  • 除了提交之外,动作还有默认注入参数dispatchgettersrootGetters。所以你可以简单地写; sendDataToServer({ commit, getters }, payload) 访问 getter。
  • @Tugayİlik 你应该回答,这样我们才能投票。

标签: javascript ecmascript-6 vuejs2 vuex


【解决方案1】:

动作处理程序接收一个上下文对象,该对象在存储实例上公开相同的方法/属性集,因此您可以调用 context.commit 来提交突变,或通过 context.state 和 context.getters 访问状态和 getter

   actions: {
            sendDataToServer(context, payload) {
                // context object contains state, commit, getters
                context.getters.getAppData
            }
        },

参考文档:https://vuex.vuejs.org/guide/actions.html#dispatching-actions

【讨论】:

    【解决方案2】:

    如果你在vuex中使用nuxt和隔离文件,像这样=

    store -
          |
          |-- index.js
          |
          |-- store.js
          |
          |-- product.js
    

    // store.js
    export const getters = {
      getNameStore: state => state.getNameStore ? state.getNameStore : null
    };

    我希望将store.jsgetNameStore 转换为product.js

    // product.js
    export const actions = {
      setResultSearch({ commit, dispatch }, text) {
        console.log(
          'getNameStore',
          this.getters["store/getNameStore"]
      );
    };

    this.getters["store/getNameStore"]

    【讨论】:

      【解决方案3】:

      您可以在操作中访问getters

      getters: {
         getUser(state){
            return state.user
         }
      }
      
      actions : {
          myAction({ getters }){
             let user = getters.getUser
          }
      }
      

      【讨论】:

        【解决方案4】:

        除了提交之外,动作还有默认注入参数dispatchgettersrootGetters。所以你可以简单地写;

        sendDataToServer({ commit, getters }, payload) 访问 getter。

        【讨论】:

          【解决方案5】:

          在操作中,您会看到第一个参数包含{commit}。同样,您可以传递{commit, state}。这样,您可以直接访问 state.data。

          我认为在您的示例中,您会想要执行该操作,因为您可以使用 commit('setData') 从内部操作本身调用突变。

          第一个参数是供您根据需要使用状态和突变。就我个人而言,我只参与过先执行操作并进行突变以将其存储在应用程序中的项目。例如,如果我想在某处的服务器中存储汽车信息,首先我会执行该操作(并将其保存到远程数据库)。一旦我确认它保存在数据库中,我就会在商店中进行本地变异。这完全取决于具体情况。但好在你可以从动作内部变异

          【讨论】:

          • 实际上可以做更多的突变,不仅setData,我也想更新数据例如。在插入时,我将调用 setData 或在更新时调用 updateData,实际上我的操作是将数据发送到服务器只是为了更新服务器的数据(数据还包括一个 jwt 令牌),然后它将检查是否令牌有效,如果令牌无效,则将用户重定向回第一个插入过程并重复该过程。所以实际上是相反的,async 方法在突变之前先出现。你怎么看?
          • 上述场景的最佳流程是什么?
          • 看起来你是先与服务器打交道。所以,如果我理解正确,异步调用 API -> 如果成功,提交设置/更新。如果没有,请进行另一个 API 调用并从头开始执行相同的步骤。
          • 是的,先生,这是正确的。我实际上得到了我需要的东西,这来自您的解决方案,即在提交{ commit, state } 之后添加一个状态。谢谢!
          猜你喜欢
          • 2016-08-10
          • 2021-08-25
          • 2018-02-22
          • 2020-02-20
          • 2019-06-11
          • 1970-01-01
          • 2018-02-09
          • 2020-05-14
          • 2021-07-15
          相关资源
          最近更新 更多