【问题标题】:How to update API path dynamically in VUEX state如何在 VUEX 状态下动态更新 API 路径
【发布时间】:2021-05-29 23:52:18
【问题描述】:

我正在尝试在我的 Vuex 状态下动态更新 API 路径。 Vuex 必须在页面加载时设置默认路径“example.com/api/datasetA.json”,我想通过用户交互将路径更新为“example.com/api/datasetB.json”并获取新 API立即获取数据。

我的代码相关部分如下(更新代码):

VUEX:

export const state = () => ({
  apiData: [],
  apiId: 'datasetA.json'
});

export const mutations = {
  fillApiData: (state, data) => {state.apiData = data},
  updateApi: (state, newApiId) => {state.apiId = newApiId;}
};

export const actions = {
  async getApiData({commit, state}) {
    const response = await this.$axios.$get('https://example/api/'+state.apiId);
    commit('fillApiData', response); 

然后VUE方法如下:

methods: {

   updateApi(apiId) {
    
      this.$store.commit('updateApi', apiId)
      }

【问题讨论】:

    标签: vue.js nuxt.js vuex


    【解决方案1】:

    创建一个改变 vuex 状态的突变。然后在getApiData函数中运行这个mutation(commit)

    export const state = () => ({
      apiData: [],
      apiId: 'datasetA.json'
    });
    
    export const mutations = {
      updateAPI(state, newApiId ) {
        state.apiId = newApiId;
      }
    };
    
    export const actions = {
      async getApiData({commit, state}) {
        const response = await this.$axios.$get('https://example/api/'+state.apiId);
        commit('updateValue', response);
        commit('updateAPI', 'some.new.datasetB.json');
      }
    }
    

    我可以通过在方法中使用 this.$store.state.apiId = apiId 直接更新状态,但我知道这是不好的做法

    你是对的。但是,如果您希望这种方法在 Vuex 之外更新状态,您可以使用突变来更改 Vuex - 这是一个很好的做法。

    那你就可以了

    this.$store.commit('updateAPI', 'my new value')
    

    【讨论】:

    • 我尝试了更长的方法,我得到以下错误:[vuex] unknown action type: updateAPI after triggering the user action:methods: { updateAPI(apiId) { this.$store.dispatch('updateAPI', apiId) },
    • dispatch - 用于操作。 commit - 用于突变。所以你必须把this.$store.dispatch('updateAPI', apiId)改成this.$store.commit('updateAPI', apiId)
    • 将其更改为提交就可以了。但是,我注意到 API 数据不会自行更新。是否有一种直接的方法可以在提交的同时触发调用以从更新的 url 中获取新的 API 数据?
    • 是的,那么您必须采用我在上面发布的第一种方法;您通过 action getApiData 获取 API 数据,并在该函数中执行 mutation(提交)以更新状态。
    • 我用你的例子更新了我的原始代码到我最初的问题。我不确定我现在是否正确执行此操作,因为在更新 API url 时,用户交互仍然不会触发对 datasetB 的提取。在您的代码中,您有 commit('updateAPI', 'some.new.datasetB.json');,但这会在没有用户交互的情况下更改 API url。
    猜你喜欢
    • 2023-03-16
    • 1970-01-01
    • 2021-06-19
    • 2017-05-20
    • 1970-01-01
    • 2019-10-23
    • 2022-01-14
    • 2021-07-21
    • 2020-07-02
    相关资源
    最近更新 更多