Vuex 存储状态:如何将函数与变量混合以单次重置状态值

Posted

技术标签:

【中文标题】Vuex 存储状态:如何将函数与变量混合以单次重置状态值【英文标题】:Vuex store state : how to mix the function with variables for reseting state values at single shot 【发布时间】:2021-12-28 13:10:27 【问题描述】:

我有一个Vuex Store,我需要根据应用程序中的一些更改来重置变量,所以我正在使用这样的东西并且一切都按预期工作:

const getDefaultState = () => 
    return 
        showModal: false,
        nodeCounter:0,
        nodeInfo: [],
    


export const state = () => getDefaultState()

export const mutations = 
  resetState (state) 
    // Reset all state variables to its default value for next node
    Object.assign(state, getDefaultState())
  ,

但是,根据新要求,我不希望重置 nodeCounter 并希望它具有增量值但 reset 所有其他值所以我想做这样的事情:

const getDefaultState = () => 
    return 
        showModal: false,
        nodeInfo: [],
    


export const state = () => 
    nodeCounter:0,
    getDefaultState()

所以我的所有其他值都是reset,但nodeCounter 只有在我刷新应用程序时才会被重置。但我无法做到这一点。

谁能告诉我如何重置一些state 变量而不重置其中一些?我不希望一一重置状态变量,所以我使用这里的一些答案中提到的function 方法。

【问题讨论】:

【参考方案1】:

在将状态设置为默认值后,我会尝试保存 nodeCounter 的状态(您想要保留)然后设置它。像这样的:

const getDefaultState = () => 
    return 
        showModal: false,
        nodeCounter:0,
        nodeInfo: [],
    


export const state = () => getDefaultState()

export const mutations = 
  resetState (state) 
    // Reset all state variables to its default value for next node
    const tmpNodeCounter = state.nodeCounter;
    state = ...getDefaultState(),nodeCounter: tmpNodeCounter;
  ,

【讨论】:

【参考方案2】:

如果您只想重置具有突变的状态中的一些值,则无需在 resetState 突变中包含所有状态变量。您可以为每次必须重置的变量定义另一个对象。这是我的 Nuxt 存储文件,名为 change.js

const getDefaultState =  
  showModal: false,
  nodeCounter:0,
  nodeInfo: [],


const alwaysReset = 
  showModal: false,
  nodeInfo: [],


export const state = () => (getDefaultState);

export const mutations = 
  resetState (state) 
    // Reset state variables that must be reset each time and not all state
    Object.assign(state, alwaysReset);
  ,

  increment (state) 
    console.log(state.nodeCounter);
    state.nodeCounter++;
  ,

  pushArr (state) 
    console.log(state.nodeInfo);
    state.nodeInfo.push("item");
  

alwaysReset 对象仅包含您每次要重置的变量。创建了其他突变来测试我使用此 Nuxt 页面的答案,例如:

<template>
  <v-container fluid>
    <v-row>
      <v-col>
        <v-card
          class="pa-2"
          outlined
          tile
        >
          <div>this is a page</div>
          <v-btn @click = "changeState">click</v-btn>
          <v-btn @click = "incrementState">increment</v-btn>
          <v-btn @click = "arrayState">push</v-btn>
        </v-card>
      </v-col>
    </v-row>
  </v-container>
</template>

<script>
  export default 
    methods: 
      changeState: function() 
        this.$store.commit('change/resetState');
      ,

      incrementState: function() 
        this.$store.commit('change/increment');
      ,

      arrayState: function() 
        this.$store.commit('change/pushArr');
      
    
  
</script>

在这里我创建了 3 个按钮。其中之一重置指定的变量。另一个增加nodeCounter 以查看重置此状态不会改变。最后第三个将项目推送到nodeInfo 变量以查看此状态将被重置每次

【讨论】:

非常感谢您的回复。当我在我的应用程序中使用类似的方法时,由于某种原因它失败了。不知道为什么。所以我使用了在重置然后重新分配之前跟踪变量的方法。

以上是关于Vuex 存储状态:如何将函数与变量混合以单次重置状态值的主要内容,如果未能解决你的问题,请参考以下文章

vuex 闲置状态重置方案

理解Vue的状态管理模式Vuex

如何使用 Vue.js + Vuex (createStore) 将“状态”变量保存到浏览器 localStorage

Vuex:刷新浏览器时保留部分状态

如何将状态从 vuex 存储共享到所有子组件

React 子组件在父组件中更新状态后如何将其重置回原始状态