用通俗的语言解释vuex怎么实现数据的持久化

179 阅读3分钟

嘿,让我来给你解释一下 Vuex 如何实现数据的持久化吧 !

你可以把 Vuex 想象成一个存放重要物品的仓库,但是这个仓库里的东西在你刷新页面的时候会消失哦 。为了不让它们消失,我们需要一种方法来保存这些物品,这就是数据持久化啦 !

一、使用 localStorage 实现 Vuex 数据持久化的简单步骤

1. 存储数据

  • 当 Vuex 里的数据发生变化时,我们把这些数据保存到 localStorage 里。localStorage 就像是一个可以永久存放东西的小盒子,只要你不手动删除,里面的东西就不会丢哦 !

  • 我们可以在 Vuex 的 mutations 或者 actions 里添加一些代码,每次修改数据后,就把数据放到这个小盒子里。

  • 例如,假设我们有一个 count 数据,每次 count 变化时,我们这样做:

收起

javascript

const store = new Vuex.Store({
  state: {
    count: 0
  },
  mutations: {
    increment(state) {
      state.count++;
      // 把更新后的 count 存储到 localStorage
      localStorage.setItem('count', state.count);
    }
  }
});

2. 读取数据

  • 当我们打开页面的时候,我们要从 localStorage 这个小盒子里把数据拿出来,放到 Vuex 的仓库里。

  • 我们可以在 Vuex 初始化的时候,也就是创建 store 的时候,从 localStorage 中读取数据并放到 state 里。

  • 像这样:

收起

javascript

const store = new Vuex.Store({
  state: {
    count: localStorage.getItem('count')? parseInt(localStorage.getItem('count')) : 0
  },
  mutations: {
    increment(state) {
      state.count++;
      localStorage.setItem('count', state.count);
    }
  }
});

3. 优化:使用插件

  • 不过,每次都手动存储和读取数据有点麻烦,我们可以创建一个 Vuex 插件,让这个插件帮我们自动完成这个任务哦 !

  • 这个插件就像一个小助手,会在 Vuex 里的数据发生变化时自动把数据存到 localStorage 里,在初始化时自动从 localStorage 里取数据。

  • 我们可以这样写这个插件:

收起

javascript

const localStoragePlugin = store => {
  // 当 store 初始化时,从 localStorage 中读取数据
  if (localStorage.getItem('count')) {
    store.state.count = parseInt(localStorage.getItem('count'));
  }
  // 订阅 store 的变化,存储 count 到 localStorage
  store.subscribe((mutation, state) => {
    if (mutation.type === 'increment') {
      localStorage.setItem('count', state.count);
    }
  });
};

const store = new Vuex.Store({
  state: {
    count: 0
  },
  mutations: {
    increment(state) {
      state.count++;
    }
  },
  plugins: [localStoragePlugin]
});

二、使用 Vuex 插件的详细解释

1. 插件的原理

  • 这个插件其实就是一个函数,我们把它添加到 Vuex 的 plugins 数组里。

  • 当 Vuex 初始化时,这个函数会被调用,我们可以在这里从 localStorage 读取数据并更新 Vuex 的 state

  • 同时,这个插件会订阅 Vuex 的 mutation 事件,当有 mutation 发生时,会调用我们的函数,我们可以在这里存储更新后的数据。

2. 处理多个数据

  • 如果 Vuex 里有很多数据,我们可以把它们都存到 localStorage 里哦 !

  • 我们可以修改插件,让它保存和读取整个 state 对象,而不只是 count

  • 像这样:

收起

javascript

const localStoragePlugin = store => {
  // 从 localStorage 中读取整个 state
  const savedState = JSON.parse(localStorage.getItem('vuexState'));
  if (savedState) {
    store.replaceState({...store.state,...savedState });
  }
  // 订阅 store 的变化,存储整个 state 到 localStorage
  store.subscribe((mutation, state) => {
    localStorage.setItem('vuexState', JSON.stringify(state));
  });
};

const store = new Vuex.Store({
  state: {
    count: 0,
    user: {
      name: 'John Doe'
    }
  },
  mutations: {
    increment(state) {
      state.count++;
    },
    updateUser(state, payload) {
      state.user = payload;
    }
  },
  plugins: [localStoragePlugin]
});

三、使用 sessionStorage 实现持久化(可选)

  • 如果你不想永久保存数据,只想在当前会话中保存,你可以用 sessionStorage 代替 localStorage 哦 !

  • 它的使用方法和 localStorage 差不多,只是数据在关闭浏览器标签或窗口后会丢失。

四、总结

  • 实现 Vuex 数据的持久化就是在 Vuex 仓库和 localStorage 或 sessionStorage 之间传递数据啦 !你可以手动操作,也可以使用插件让这个过程更简单哦 。