Vue.js数据设置最佳实践,使用数据方法动态设置数据

Vue.js best practices in data settings, using data method to set data dynamically

我创建了一个应用程序,它工作得很好,但我(我认为)在不适合做最佳实践的地方做一些事情。我有一个组件,我将这段代码用于我的数据方法:

    data() {
    
        var versionThing = "v1";
        if(this.$store.getters.version !=''){
            versionThing = this.$store.getters.version;
        } 
    
        var settings = this.$store.getters.settings;
    
        var checkboxesThing = [
                    { val: "val1", text:"Text 1", isChecked: false },
                    { val: "val2", text:"Text 2", isChecked: false },
                    { val: "val3", text:"Text 3", isChecked: false },
                ];
        if(settings.checkboxes != ''){
            checkboxesThing = settings.checkboxes;
        }
        return {
    
            settings: {
                key: settings.key,
                version: versionThing,
                checkboxes: checkboxesThing,
            }
            
        };
    },

这样我就可以检查我的 VueX 商店中是否有输入。但是我觉得这可能不是正确的方法...

这是我的 VueX 代码 index.js 文件:

    import { createStore } from 'vuex';
    import { Storage } from '@ionic/storage';
    
    const ionicStorage = new Storage();
    ionicStorage.create();
    
    const store = createStore({
    
        state() {
            return {
                settings:{
                    key:"",
                    version:'',
                    checkboxes:"",
    
                },
            }
    
        },
        getters: {
            key(state){
                return state.settings.key;
            },
    
            version(state){
                return state.settings.version;
            },
    
            settings(state){
                return state.settings;
            },
    
            // Ionic/Storage getters
            async getStorageAandoening(state){
                const myAwesomeValue = await ionicStorage.get('key')
                if(myAwesomeValue != ''){
                    state.settings.key = myAwesomeValue;
                }
                return state.settings.key;
            },
    
            async getStorageSettings(state){
                const myAwesomeValue = await ionicStorage.get('settings');
                var objectMyAwesomeValue = JSON.parse(myAwesomeValue);
                if(objectMyAwesomeValue.key != ''){
                    state.settings = objectMyAwesomeValue;
                }
                return state.settings;
            }
        },
        mutations: {
            changeKey (state, payload) {
                ionicStorage.set('key', payload)
                state.settings.key = payload
            },
            changeVersion(state, payload){
                ionicStorage.set('version', payload)
                state.settings.version = payload
            },
            changeSettings(state,payload){
                ionicStorage.set('settings', JSON.stringify(payload));
                state.settings = payload;
            }
        },
        actions: {}
    }    
    );
    
    export default store;

首先,vuex 模块状态通常填充了您期望的默认状态

state() {
  return {
    settings:{
      key: "",
      version: "v1",
      checkboxes: [
        { val: "val1", text:"Text 1", isChecked: false },
        { val: "val2", text:"Text 2", isChecked: false },
        { val: "val3", text:"Text 3", isChecked: false },
      ],
    },
  }
},

但这取决于你,如果你需要的话可以留空。


那么,你的大多数 getter 都没有用。 Getters 应该像 vue 组件中的“计算”一样使用:它是从您的状态派生的值,而不是快捷方式。我的意思是,这是可以做到的,但在我看来这是一种不好的做法。

如果您需要访问 vuex 状态,只需执行 this.$store.state.settings


最后,从 vue 的组件角度来看,您可以跳过将 vuex 存储复制到组件数据的步骤。 Vuex 应该是你数据的真实来源,所以复制它们只会让它变得无用,因为你可以在不通知 vuex 存储的情况下更新组件中的数据(它有时很有用,但我觉得这里不是你的情况)

<template>
  <div>{{ $store.state.settings.version }}</div>
</template>

<script>
export default {
  computeds: {
    isLastVersion() {
        return this.$store.state.settings.version === 'v2'
    },
  }
}
</script>

即使我没有全局图片,我也会为你的情况做这件事。


如果你真的需要你的 vuex store 是空的,你的组件只需要设置默认值到这个状态,你可以这样做:

export default {
  computeds: {
    settings() {
        const storeSettings = this.$store.state.settings
        const defaultSettings = { version: 'v1', checkboxes: [...] }

        return {
          version: storeSettings.version || defaultSettings.version,
          checkboxes: storeSettings.checkboxes || defaultSettings.checkboxes,
        }
    },
  }
}

声明一个对您的状态变化做出反应的计算。如果状态为空,则您 return 默认值。如果状态被更新,那么计算也会更新并且 return 存储值。