飞道的博客

vue3+vite中使用vuex

367人阅读  评论(0)

前言:

      在vue3+vite创建的项目中使用vuex,要注意的是vite有部分写法和之前的webpack是不同的,比如,他不支持 require,想把vue2的项目直接升级到vue3的时候,需要改很多地方,如果非要使用vite也可以,记得改相关的内容。

具体步骤:

1、安装vuex( vue3建议 4.0+ )

pnpm i vuex -S

2、main.js中配置


  
  1. import store from '@/store'
  2. // hx-app的全局配置
  3. const app = createApp( App)
  4. app. use(store)

3、新建相关的文件夹与文件,这里配置多个不同vuex内部的js,使用vuex的modules来放不同的页面,文件,然后统一使用一个getters.js

 index.js  核心文件,这里使用了import.meta.glob,而不是require


  
  1. import getters from './getters'
  2. import { createStore } from 'vuex'
  3. const modulesFiles = import. meta. glob( './modules/*.js',{ eager: true }); // 异步方式
  4. let modules = {}
  5. for ( const [key, value] of Object. entries(modulesFiles)) {
  6. var moduleName = key. replace( /^\.\/(.*)\.\w+$/, '$1');
  7. const name = moduleName. split( '/')[ 1]
  8. modules[name] = value. default
  9. }
  10. const store = createStore({
  11. modules,
  12. getters
  13. })
  14. export default store

getters.js 内部根据不同的页面来发送不同的state数据


  
  1. const getters = {
  2. sidebar: state => state. app. sidebar,
  3. token: state => state. user. token,
  4. }
  5. export default getters

app.js   可以定义不同的变量,然后统一   export default


  
  1. const state = {
  2. sidebar: '123'
  3. }
  4. const mutations = {
  5. TOGGLE_SIDEBAR: state => {
  6. state. sidebar = '2222'
  7. },
  8. const actions = {
  9. toggleSideBar( { commit }) {
  10. commit( 'TOGGLE_SIDEBAR')
  11. }
  12. }
  13. export default {
  14. namespaced: true, // 为每个模块添加一个前缀名,保证模块命明不冲突
  15. state,
  16. mutations,
  17. actions
  18. }

user.js  也可以直接返回一个对象,写法都可以


  
  1. export default {
  2. state: {
  3. token: '123'
  4. },
  5. mutations: {
  6. SET_TOKEN: (state, token) => {
  7. state. token = token
  8. },
  9. },
  10. actions: {
  11. }
  12. }

4、具体页面使用

1)引入

import { useStore } from 'vuex'

2)具体使用


  
  1. setup( ){
  2. const store = useStore()
  3. }

3)使用  mutations里面的方法

store.commit("app/TOGGLE_SIDEBAR", 1)

4)使用actions里面的方法

store.dispatch("app/asyncAddStoreCount", 2)

5、vuex中推出了一个插件(vuex-persistedstate),可以解决刷新数据无保存的问题,

可以把数据除了vuex以外,在本地和会话(都支持)储存下

1)安装

pnpm i vuex-persistedstate -S

2)store/index.js


  
  1. import createPersistedstate from 'vuex-persistedstate' //第一步导入
  2. import { createStore } from 'vuex'
  3. const store = createStore({
  4. modules,
  5. getters,
  6. //第二步是加这段代码,默认是存到了localStorage中
  7. plugins: [
  8. createPersistedstate({
  9. key: 'vuex-local', //存储持久状态的键。(默认:vuex)
  10. paths: [ 'user'], //部分持续状态的任何路径的数组。如果不加,默认所有。
  11. // storage: window.sessionStorage //默认存储到localStorage,想要存储到sessionStorage
  12. })
  13. ]
  14. })

API

createPersistedState([options])使用给定的选项创建插件的新实例。可以提供以下选项来配置您的特定需求的插件:

  • key :存储持久状态的键。(默认:vuex)
  • paths :部分持续状态的任何路径的数组。如果没有路径给出,完整的状态是持久的。(默认:[])
  • reducer :一个函数,将被调用来基于给定的路径持久化的状态。默认包含这些值。
  • subscriber :一个被调用来设置突变订阅的函数。默认为store => handler => store.subscribe(handler)
  • storage :而不是(或与)getState和setState。默认为localStorage。
  • getState :将被调用以重新水化先前持久状态的函数。默认使用storage。
  • setState :将被调用来保持给定状态的函数。默认使用storage。
  • filter :将被调用来过滤将setState最终触发存储的任何突变的函数。默认为() => true

转载:https://blog.csdn.net/qq_41619796/article/details/128019551
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场