Vue JS устанавливает состояние по умолчанию из Vuex при запуске приложения

#javascript #vue.js #nuxt.js #vuex

Вопрос:

Я работаю с Nuxt JS 2.15 и Vuex. Я создаю гибридное приложение, использующее конденсатор JS, и мне нужно использовать хранилище телефона для сохранения таких данных, как настройки приложения и настройки пользователя на телефоне. Для достижения этой цели я использую модуль хранения данных совместно с Vuex.

В настоящее время я могу установить некоторые настройки приложения по умолчанию в app_settings состоянии моего магазина Vuex, а затем вызвать @click файл vue для обновления настроек приложения, подобных этому:

 /*
** Update setting
*/
updateSetting (model, value) {
  this.$store.commit('storage/updateSetting', {
    key: model,
    value: value
  })
}
 

Все вышесказанное привязано к нажатию кнопки, где v-model соответствует настройкам из магазина:

 <div v-for="(option, index) in options.theme" :key="index">
  <hr v-if="index > 0" />
  <label
    :for="`theme-${index}`"
    class="tw-flex tw-items-center tw-w-full tw-py-4 tw-px-8 tw-cursor-pointer hover:tw-bg-gray-100 active:tw-bg-gray-200 tw-h-20">
    <div class="tw-flex tw-w-full tw-items-center">
      <div class="tw-text-left">
        <h2 class="tw-font-medium lg:tw-text-lg tw-text-gray-500">{{ option.title }}</h2>
      </div>
      <div class="tw-ml-auto">
        <div class="tw-flex-1 tw-items-center tw-flex tw-justify-end">
          <input :id="`theme-${index}`" v-model="$store.state.storage.app_settings.theme" @change="updateSetting('theme', $store.state.storage.app_settings.theme)" :value="option.value" name="theme" type="radio" class="focus:tw-ring-indigo-600 tw-h-4 tw-w-4 tw-text-indigo-800 border-gray-300">
        </div>
      </div>
    </div>
  </label>
</div>
 

Когда я изменяю настройку, конечно же, моя updateSetting мутация выполняется по назначению, обновляя состояние хранилища Vuex, а также устанавливая a CapacitorStorage.key в моем браузере (это будет хранилище телефона на физическом телефоне).

Однако, если пользователь изменяет настройки по умолчанию, мне нужно извлечь все настройки из хранилища конденсатора при запуске приложения, чтобы сохранить нужные пользователю настройки приложения.

В настоящее время у меня есть функция, setDefaultSettings которую я намерен запустить при запуске приложения, и установить все настройки в этом app_settings состоянии.

Почему моя функция неправильно вызывается при запуске, что я упускаю или что мне нужно изменить здесь?

store/storage.js

 export const state = () => ({
  app_settings: {
    theme: 'system',
    refreshButtonPlacement: 'right',
    fetchTimeout: 120
  }
})

async function getData (storage, key) {
  const { value } = await storage.get({ key: key })
  return value
}


export const mutations = {

  /*
   * Set default settings on app launch
   */
  async setDefaultSettings (state, data) {
    const theme = getData(this.$CapacitorStorage, 'theme')

    if (theme) {
      state.app_settings.theme = getData(this.$CapacitorStorage, 'theme')
    }
  },

  /*
   * Update app setting
   */
  async updateSetting (state, data) {
    state.app_settings[data.key] = data.value

    await this.$CapacitorStorage.set({
      key: data.key,
      value: data.value
    })
  },

  // TODO: set dedault settings
  setDefaultSettings()

}
 

Комментарии:

1. Может быть, вы можете позвонить setDefaultSettings внутрь mounted крючка App.vue ?

2. Тогда мне пришлось бы делать это в каждом представлении, не так ли? На самом деле это не то, что мне нужно

3. nuxtServerInit может быть полезно здесь: nuxtjs.org/docs/2.x/directory-structure/…

4. Наверняка есть способ просто вызвать функцию setDefaultSettings из моего файла Vuex? В идеале мне нужно, чтобы все содержалось там для удобства?

5. Не используйте v-model непосредственно в хранилище — используйте «локальную» переменную, заполняемую из хранилища при создании компонента, а затем просто используйте фиксацию, чтобы синхронизировать состояние хранилища и переменной.