首页 > 其他分享 >Vuex

Vuex

时间:2023-11-29 18:12:49浏览次数:29  
标签:count 模块 state increment commit Vuex store

Vuex 用于状态管理

  1. 状态管理模式:
  • 状态:驱动应用的数据源。state

  • 视图:以声明方式将状态映射到视图。

  • 操作:响应在仕途上的用户输入导致的状态变化。

  1. Vuex 的状态存储是响应式的。不能直接改变 store 中的状态。
  • 从 store 实例中读取状态最简单的方法就是在 计算属性 中返回。this.$store.state.count
const store = createStore({
  state: {
    count: 0,
    list:[-1, 2, 7, 0]
  },

  getters: {
    getStr(state) {
      return `这是一个数:${state.count}`
    },

    // 返回一个函数:过滤出大于 value 的元素
    filterList: (state) => (value) => {
      return state.list.filter(item => item > value)
    }
  },

  mutations: {
    increment(state) {
      // 变更状态
      state.count++
    }
  },

  actions: {
    increment(context) {
      context.commit('increment')
    }
  }
})

State - mapState 辅助函数

  1. 当一个组件需要获取多个状态时,可以使用 mapState 辅助函数来生成计算属性:
import { mapState } from "vuex"

export default {
  computed: mapState({
    // 1. 箭头函数
    count: state => state.count,

    // 2. 传字符串参数 count 等同于 state => state.count
    countAlias: 'count',

    // 3. 为了能使用 this 获取局部状态,必须使用常规函数
    countPlusLocalState(state) {
      return state.count + this.localCount
    }
  })
}
  1. 当映射的计算属性的名称与 state 的子节点名称相同时:computed: mapState(['count'])

  2. mapState 函数返回的是一个对象

Getter 可以认为是 store 的计算属性

  1. Getter 接受 state 作为第一个参数。可以接受 其他 getter 作为第二个参数。

  2. 访问:

  • 通过属性访问:this.$store.getters.getStr

  • 通过方法访问:store.getters.filterList(0) // [2, 7]

getter 在通过方法访问时,每次都会调用,不会缓存结果。

  1. mapGetters 辅助函数: computed: { ...mapGetters(['count']) }

如果想将一个 getter 属性别名:...mapGetters({ num: 'count' })

Mutation 都是同步事务

  1. 更改 Vuex 的 store 中的状态的唯一方法是提交 mutation 。this.$store.commit('increment')

  2. 每个 mutation 都有一个字符串的事件类型(type)和一个回调函数(handler) , 这个回调函数就是我们实际进行状态更改的地方,它接受 state 作为第一个参数。

  3. 调用

  • 不能直接调用一个 mutation 处理函数。需要以相应的 type 调用 store.commit 方法:store.commit('increment')

  • 提交载荷:可以向 store.commit() 传入额外的参数,即 mutation 的载荷。store.commit('increment', { amount: 10 })

// mutation 的处理:
mutations: {
  increment(state, payload) {
    state.count += payload.amount
  }
}
  • 提交 mutation 的另一种方式是直接使用包含 type 属性的对象:store.commit({ type:'increment', amount }) , 这是将整个对象作为载荷传给 mutation 函数,因此处理函数保持不变。
  1. 使用常量替代 Mutation 事件类型

  2. Mutation 必须是同步函数

  3. mapMutations 辅助函数,支持载荷:

// 在组件中:
methods: {
...mapMutations(['increment']) // 将 this.increment() 映射为 this.$store.commit('increment')

...mapMutations({ add: 'increment' }) // 将 this.add() 映射为 this.$store.commit('increment')
}

Action 可以包含异步操作

类似 Mutation ,不同的是:

  • Action 提交的是 mutation , 不是直接变更状态。

  • Action 可以包含任意异步操作

  1. Action 函数接受一个与 store 实例具有相同方法和属性的 context 对象,可以调用 context.commit 、 context.state 和 context.getters 。

  2. 分发 Action :store.dispatch('increment') , 支持载荷方式和对象方式。

  3. 在组件中分发 Action : this.$store.dispatch('increment') 或者使用 mapActions 辅助函数。

  4. store.dispatch() 可以处理被触发的 action 的处理函数返回的 Promise ,并且 store.dispatch 仍旧返回 Promise 。

Module 模块

  1. 不要在不同的、无命名空间的模块中定义两个相同的 getter 从而导致错误。

  2. 可以通过添加 namespaced: true 的方式使其成为带命名空间的模块。getter、action 及 mutation都会自动根据模块注册的路径调整命名。

const store = createStore({
  modules: {
    user: {
      namespaced: true, // 开启命名空间

      getters: {
        isAdmin() {} // -> getters['user/isAdmin']
      }
    }
  }
})
  1. 在带命名空间的模块内访问全局内容:
  • 在全局命名空间内分发 action 或提交 mutation,将 { root: true } 作为第三参数传给 dispatch 或 commit 。

  • 在带命名空间的模块注册全局 action,你可添加 root: true,并将这个 action 的定义放在函数 handler 中。

  • 带命名空间的绑定函数

  • 模块动态注册 store.registerModule()

const store = createStore({/* ... */})

// 注册模块 user
store.registerModule('user', {})
// 访问
store.state.user

// 注册嵌套模块 user/info
store.registerModule(['user','info'], {}) // 注意:传的是数组,不是路径字符串
// 访问
store.state.user.info
  • 动态卸载模块:store.unregisterModule(moduleName) 注意,不能用于卸载静态模块(即创建store时声明的模块)。

  • 检查模块是否已经被注册到 store :store.hasModule(moduleName) 注意,传的是数组,不是路径字符串。

  1. 保留 state : store.registerModule('a', module, { preserveState: true })

当你设置 preserveState: true 时,该模块会被注册,action、mutation 和 getter 会被添加到 store 中,但是 state 不会。

  1. 模块重用

如果需要创建一个模块的多个实例,如果是用纯对象来声明模块的状态,可能会造成污染问题,这时候可以使用一个函数来声明。(同 Vue 组件中的 data 都是一样的问题)

组合式API

import { useStore } from "vuex"

const store = useStore()

表单处理

如果有一种场景,需要在表单上绑定 store.state.user.name <input v-model="user.name"> 且通过输入的值更新它:

  • 方法1:舍弃双向绑定 <input :value="username" @input="() => {}">,通过 @input 事件去 commit mutations 。

  • 方法2:利用 带有setter 的 computed 计算属性来改变值:

computed: {
  username: {
    get() {
      return this.$store.state.user.name
    }

    set(value) {
      this.$store.commit('updateName', value)
    }
  }
}

TypeScript 支持

标签:count,模块,state,increment,commit,Vuex,store
From: https://www.cnblogs.com/4shana/p/17865528.html

相关文章

  • Vue 中 vuex 的使用
    一、内容:1.vuex是vue中实现“集中式数据管理”的一个vue插件。2.被管理的数据,是组件共享的,任意组件都可以访问管理。3.vuex包含三个部分:actions(动作),mutations(加工),state(状态)。4.工作原理:(1)组件欲发起动作(即修改数据)。(2)向vuex中的actions分发(dispatch)动作,(3)actions向mutatio......
  • Vue中的Vuex
    概述Vuex是一个专为Vue.js应用程序开发的状态管理模式+库。它采用集中式存储管理应用的所有组件的状态,并以相应的规则保证状态以一种可预测的方式发生变化。对于组件间的通信方式而言,vuex也是一个可以进行任意组件通信的方法。使用场景:某个状态在很多组件来使用(个人信息......
  • vue3 基础-Pinia 可能替代 Vuex 的全局数据状态管理
    Pinia初体验Pinia.js是由Vue.js团队核心成员开发的新一代状态管理器,使用CompositionApi进行重新设计的,也被视为下一代Vuex。Pinia是一个Vue的状态管理库,允许跨组件、跨页面进行全局共享状态,也由于其设计的简洁性、和对typescript的良好支持,取代Vuex指日可待。或许,你在想在vue......
  • 手撕Vuex-安装模块方法
    前言经过上一篇文章的介绍,我们实现了将模块安装到store中,那么本章我们就来介绍一下怎么安装模块当中的方法也就是actions、mutations、getters。所以本次文章的目标就是将模块当中的actions、mutations、getters安装到store中,然后在组件中使用。分析阶段那么安装acti......
  • vuex与redux比较
    相同点state共享数据流程一致:定义全局state,触发,修改state原理相似,通过全局注入store。不同点vuex定义了state、getter、mutation、action四个对象;redux定义了state、reducer、action。vuex触发方式有两种commit同步和dispatch异步;redux同步和异步都使用disp......
  • 手写基础vuex
    实现一个插件:声明Store类,挂载$storeStore具体实现:创建响应式的state,保存mutations、actions和getters实现commit根据用户传入type执行对应mutation实现dispatch根据用户传入type执行对应action,同时传递上下文实现getters,按照getters定义对state做派......
  • vue2.0源码简读(7. Vuex)
    7.1Vuex初始化这一节主要来分析Vuex的初始化过程,它包括安装、Store实例化过程2个方面。安装当在代码中通过importVuexfrom'vuex'的时候,实际上引用的是一个对象,它的定义在src/index.js中:exportdefault{Store,install,version:"__VERSION__",mapSt......
  • 如何优雅使用 vuex
    大纲本文内容更多的是讲讲使用vuex的一些心得想法,所以大概会讲述下面这些点:Q1:我为什么会想使用vuex来管理数据状态交互?Q2:使用vuex框架有哪些缺点或者说副作用?Q3:我是如何在项目里使用vuex的?初识vuex对于vuex,有人喜欢,有人反感喜欢的人觉得它可以很好的解决复杂的数......
  • 深入理解 Vuex
    Vue.js是一款轻量级、灵活且易学的前端框架,但随着应用的复杂性增加,组件之间的状态管理变得愈发复杂。为了解决这一问题,Vue.js提供了一个强大的状态管理工具——Vuex。在本篇博客中,我们将深入探讨Vuex的核心概念和使用方法,并通过实例演示如何优雅地管理应用状态。什么是Vuex?Vue......
  • 手撕Vuex-安装模块数据
    前言根据上一篇,【手写Vuex】-提取模块信息,我们已经可以获取到模块的信息了,将模块信息变成了我们想要的数据结构,接下来我们就要根据模块的信息,来安装模块的数据。在上一篇当中我们定义了一个ModuleCollection类,这个类的作用就是将模块的信息转换成我们想要的数据结构。接下来......