vue2的vuex

安装
npm i -S vuex@3.6.2
理念

借鉴了Flux数据流思想, 基于单向数据流
Action:视图层发出的动作信息,可以来自于用户交互,也可能来自于服务器响应
Dispatcher:派发器,用来接收 Actions 并执行相应回调函数
Store:用来存放应用的状态,一旦发生变化就会通知视图进行重绘
View:React 组件视图

在这里插入图片描述

state ==> 全局共享属性
getters ==> 针对于state数据进行二次计算,获取state
mutations ==> 存放同步方法的,唯一更改state的方法
actions ==> 存放异步方法的,并且是来提交mutations
modules ==> 把vuex再次进行模块之间的划分

mutations与actions对比

相同点:都可以存放全局方法,都不能return值
不同点:
mutations:同步
actions:异步,返回一个Promise对象,很难调试
理解:mutations是来修改state的值的,actions的作用是来提交mutations

使用

state使用:

this.$store.state.str // 可以直接修改数据
// 或者
{{ str }}
computed:{
    ...mapState(['str'])
}
this.str // 不能修改数据

getters使用:

  getters: {
    get_num(state) {
      return state.num
    },
  },
this.$store.getters.getNum
// 或者
{{ getNum }}
computed:{
    ...mapGetters(['getNum'])
}

mutatioins使用:

  mutations: {
    add(state, value) {
      state.num =+ value
    },
  },
this.$store.mutations.add
// 或者
{{ add }}
methods:{
    ...mapMutations(['add'])
}
// 或者
this.$store.commit('add', 1)

actions使用:

  actions: {
    addNumber(context, value) {
      context.commit('add', value)
    },
  },
this.$store.actions.addNumber
// 或者
{{ addNumber }}
methods:{
    ...mapActions(['addNumber'])
}
this.$store.dispatch('addNumber', 1)

modules使用:
业务模块的封装

export default {
    namespaced:true, // getters等相关属性都需要加上命名空间了
    state: {  // 数据    8
        orderCount:99
    },
    getters: { // 获取数据的快捷方式  5
        getOrderCount(state){
            return state.orderCount
        }
    },
    mutations: { // 变化 => 改变数据 => 记录devTool的快照  8
        addOrderCount(state){
            state.orderCount++;
        }
    },
    // 一系列业务逻辑 + 多个数据的修改
    actions: { // dispatch => actions => 改变数据  8
        async addOrder(store,payload){
            return await store.dispatch('asyncTest')
        }
    },
}
  modules: { // 业务模块的封装
    order
  }
this.$store.state.order.orderCount
this.$store.getters.order.getOrderCount
this.$store.getters['order/getOrderCount'] // namespaced:true情况下
this.$store.mutations.order.addOrderCount
this.$store.actions.order.addOrder
// 或者
{{ $store.state.order.orderCount }} 
{{$store.state['order/orderCount']}}
{{ getOc }}
{{ aoc }}
{{ doAo }}
computed:{
     ...mapState(['order/orderCount']),
    // ...mapGetters(['order/getOrderCount']),
    // ...mapGetters({
    //     'getOc':'order/getOrderCount'
    // }),
    ...mapGetters({      
        'getOc':function(state) {
            return state.order.getOrderCount;
        },
    })
},
methods:{
    // ...mapMutations(['order/addOrderCount']),
    // ...mapActions(['doAo':'order/addOrder'])
    ...mapMutations({
      'aoc': 'order/addOrderCount'
    }),
    ...mapActions({
      'doAo':'order/addOrder'
    })
}
// 或者
this.$store.state.order.orderCount
this.getOc
this.$store.commit('order/addOrderCount')
let res = this.$store.dispatch('order/addOrder', 5)
this.aoc()
let res = await this.doAo(5)

自动导入vuex模块

// Webpack单独实现的API 操作文件
let modulesFn = require.context('./modules', true, /\.js$/);// 目录  是否子文件 处理的文件特点
// console.log('modules:',modulesFn('./order.js')) // .default拿到数据
// console.dir(modulesFn); // 可以看到所有的方法
const reg = /\.\/(.*?)\.js$/;
modulesFn.keys().forEach(filePath => {
  let moduleObj = modulesFn(filePath).default; // fn(相对路径):{default:ModuleObj} 
  moduleObj.namespaced = true;
  const regRes = reg.exec(filePath);
  const moduleName = regRes && regRes[1];
  moduleName && store.registerModule(moduleName,moduleObj)
});

订阅

store.subscribe((mutation, state) => {
  console.log('数据改变了.. 这里可以做本地额存储')
});

vuex持久化存储
安装:

npm i -S vuex-persistedstate

使用:

// 引入插件
import createPersistedState from "vuex-persistedstate";
  /* vuex数据持久化配置 */
  plugins: [
      createPersistedState({
          // 存储方式:localStorage、sessionStorage、cookies
          storage: window.localStorage
          // 存储的 key 的key值
          key: "project_store",
          render(state) {
              //要存储的数据:本项目采用es6扩展运算符的方式存储了state中所有的数据
              return { ...state };
          }
      })
  ]
### Vue2Vuex 的使用指南 Vuex 是专门为 Vue.js 设计的一个状态管理模式,用于管理复杂的应用程序中的共享状态[^1]。以下是关于如何在 Vue2 项目中配置和使用 Vuex 的详细说明。 #### 配置 Vuex Store 首先,在项目的 `store` 文件夹下创建一个名为 `index.js` 的文件,并初始化 Vuex Store: ```javascript import Vue from &#39;vue&#39;; import Vuex from &#39;vuex&#39;; Vue.use(Vuex); export default new Vuex.Store({ state: { count: 0, users: [] }, getters: { doubleCount(state) { return state.count * 2; } }, mutations: { increment(state) { state.count++; }, setUsers(state, users) { state.users = users; } }, actions: { async fetchUsers({ commit }) { try { const response = await fetch(&#39;/api/users&#39;); const users = await response.json(); commit(&#39;setUsers&#39;, users); } catch (error) { console.error(&#39;Failed to fetch users:&#39;, error); } } } }); ``` 此代码片段展示了如何设置初始状态、定义 getter 和 mutation 方法以及实现异步 action 来更新状态[^2]。 #### 在组件中使用 Vuex 为了使 Vuex store 可以被所有的子组件访问,需在主入口文件(通常是 `main.js` 或 `app.js`)中引入并挂载 store 实例: ```javascript import Vue from &#39;vue&#39;; import App from &#39;./App.vue&#39;; import store from &#39;./store/index&#39;; new Vue({ el: &#39;#app&#39;, store, render: h => h(App) }); ``` 接着可以在任何组件中通过 `$store` 访问 Vuex store 数据或触发操作。例如: ```html <template> <div> <p>Current Count: {{ $store.state.count }}</p> <button @click="increment">Increment</button> <h3>User List:</h3> <ul> <li v-for="(user, index) in $store.state.users" :key="index">{{ user.name }}</li> </ul> </div> </template> <script> export default { methods: { increment() { this.$store.commit(&#39;increment&#39;); }, fetchAndDisplayUsers() { this.$store.dispatch(&#39;fetchUsers&#39;); } }, created() { this.fetchAndDisplayUsers(); // 自动加载数据 } }; </script> ``` 这段代码展示了一个简单的按钮点击事件来增加计数器值的操作,同时也包含了从 API 获取用户列表的功能[^3]。 #### 解决严格模式下的错误 当启用 Vuex 的严格模式时,如果尝试直接修改 State 而不经过 Mutation,则会抛出异常。这是因为 Vuex 默认不允许直接改变其内部的状态,所有更改都应由 Mutations 显式完成[^4]。因此要确保每次对状态的变更都是通过提交 Mutation 完成的。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值