• Vue-3.4Vuex


    Vuex概述

    是什么:

    vuex是一个vue的状态管理工具,状态就是数据。

    Vuex是一个插件,可以帮我们管理vue通用的数据(多组件共享的数据)

    例如:购物车数据、个人信息数据

    场景:

    1)某个状态在很多个组件来使用(个人信息)

    2)多个组件共同维护一份数据(购物车)

    优势:

    1)共同维护一份数据,数据集中化管理

    2)响应式变化

    3)操作简洁(vuex提供了一些辅助函数)

    构建vuex[多组件数据共享]环境

    为了练习先不勾选Router和Vuex,后期练习熟练时,可以加上

     后面选项与下文中介绍一致即可

    Vue-3.2自定义创建项目_小沐°的博客-CSDN博客

    创建一个空仓库

     前期创建项目时没有勾选vuex,所以需要安装,练习熟练后,可以前期勾选vuex。

    Vue2->VueRouter3.x+Vuex3.x

    Vuex3.x官方文档:Vuex 是什么? | Vuex

    Vue3->VueRouter4.x+Vuex4.x

     在src下创建store文件夹,再创建index.js

     

    1. // 这里面存放的就是vuex相关的核心代码
    2. import Vue from 'vue'
    3. import Vuex from 'vuex'
    4. // 插件安装
    5. Vue.use(Vuex)
    6. // 创建仓库(空仓库)
    7. const store = new Vuex.Store()
    8. // 导出给main.js使用
    9. export default store

    main.js中添加

    import store from '@/store/index'
    1. new Vue({
    2. render: h => h(App),
    3. store
    4. }).$mount('#app')

    验证是否配置仓库成功,任意找一个组件使用如下代码

    1. created () {
    2. console.log(this.$store)
    3. }

     如下为成功;如果是undefined,则失败

    提供&访问vuex的数据(State&mapState)

    提供数据

    State提供唯一的公共数据源,所有共享的数据都要统一放到Store中的State中存储。

    在state对象中可以添加要共享数据。

    state状态即数据,类似于vue组件中的data

    区别:

    1.data是组件自己的数据

    2.state是所有组件共享的数据

    1. const store = new Vuex.Store({
    2. state:{
    3. count:101
    4. }
    5. })

    使用数据

    1)通过store直接访问
    1. template模块中:{{$store.state.xxx}}
    2. export default组件逻辑中:this.$store.state.xxx
    3. JS文件中:
    4. import store from '@/store/index'
    5. store.state.xxx
    2)通过辅助函数(简化)

    mapState是辅助函数,帮助我们把store中的数据自动映射到组件的计算属性中

    1. import { mapState } from 'vuex'
    2. export default {
    3. computed: {
    4. ...mapState(['count', 'title'])
    5. }
    6. }

     在template中直接使用{{count}}访问

    修改Vuex中的数据(mutations&mapMutations)

    vuex同样遵循单向数据流,组件中不能直接修改仓库的数据

    通过strict:true可以开启严格模式,新手可以开启及时纠错,正式上线时移除

    1. const store = new Vuex.Store({
    2. // 开启严格模式
    3. strict: true,
    4. state: {
    5. count: 100,
    6. title: '共享数据'
    7. }
    8. })

    state数据的修改只能通过mutations(修改)

    mutations基本语法

    1.定义mutations对象,对象中存放修改state的方法

    1. const store = new Vuex.Store({
    2. // 1.state提供数据
    3. state: {
    4. count: 100,
    5. title: '共享数据'
    6. },
    7. // 2.mutations提供修改数据的方法
    8. mutations: {
    9. // 所以mutation函数,第一个参数,都是state
    10. addCount (state) {
    11. state.count++
    12. }
    13. }
    14. })

    2.组件中提交调用mutations

    1. methods: {
    2. handleAdd () {
    3. this.$store.commit('addCount')//与store仓库中的mutations方法名一致
    4. }
    5. }

    mutations传参语法

    1.提供mutation函数(带参数-提交载荷payload)

    1. mutations: {
    2. addCount (state, n) {
    3. state.count+=n
    4. }
    5. }

    2.页面中提交调用mutation

    this.$store.commit('mutations方法名',参数)

    不支持传递多个参数,可以写成对象的形式,传递多个参数

    1. handleAdd (n) {
    2. this.$store.commit('addCount', {
    3. count: n,
    4. msg: ''
    5. })
    6. }
    1. mutations: {
    2. addCount (state, obj) {
    3. state.count += obj.count
    4. }
    5. }
    练习--输入框修改数据
    1. <input type="text" :value="count" @input="handleCount"/>
    2. methods: {
    3. handleCount (e) {
    4. this.$store.commit('handleCount', e.target.value)
    5. }
    6. }
    7. mutations: {
    8. handleCount (state, count) {
    9. state.count = count
    10. }
    11. }

    辅助函数:mapMutations

    mapMutations和mapState很像,它是把位于mutations中的方法提取了出来,映射到组件methods中

    1. import { mapMutations } from 'vuex'
    2. methods: {
    3. ...mapMutations(['addCount']),//映射mutations方法
    4. handleAdd (n) {
    5. this.addCount(n)//调用
    6. }
    7. }

    处理异步操作(actions&mapActions)

    需求:一秒钟之后,修改state的count成999

    说明:mutations必须是同步的(便于监测数据变化,记录调试)

    1.提供action方法

    注意:不能直接操作state,操作state还是需要commit、mutation

    操作mutation里的方法使用context.commit('mutation方法名',额外参数)

    操作getters里的属性使用context.getters.属性名

    1. actions:{
    2. //context上下文(此处未分模块,可以当成state仓库)
    3. //context.commit('mutation方法名',额外参数)
    4. setAsyncCount(context,num){
    5. // 这里是setTimeout模拟异步,以后大部分场景是发请求
    6. setTimeout(()=>{
    7. context.commit('changeCount',num)//再调用mutation中的方法
    8. },1000)
    9. }
    10. }

    2.页面中dispatch调用

    this.$store.dispatch('actions中的方法名',参数值)

    辅助函数:mapActions

    mapActions是把位于actions中的方法提取了出来,映射到组件methods

    1. import { mapActions } from 'vuex'
    2. methods: {
    3. ...mapMutations(['setAsyncCount']),//映射actions方法
    4. handleAdd (n) {
    5. this.setAsyncCount(n)//调用
    6. }
    7. }

    类似于计算属性(getters)

    说明:除了state之外,有时我们还需要从state中派生出一些状态,这些状态是依赖state的,此时会用到getters,只有获取没有修改,修改只能靠mutation

    例如:state中定义了list,为1-10的数组,组件中,需要显示所有大于5的数据

    1. state:{
    2. list:[1,2,3,4,5,6,7,8,9,10]
    3. }

    1.定义getters

    注意:

    1)getters函数的第一个参数是state

    2)getters函数必须要有返回值

    1. getters:{
    2. filterList(state){
    3. return state.list.filter(item=>item>5)
    4. }
    5. }

    2.访问getters

    1)通过store访问getters

    {{$store.getters.filterList}}

    2)通过辅助函数mapGetters

    1. computed:{
    2. ...mapGetters(['filterList'])
    3. }
    {{filterList}}

    3)在getters中访问getters的其他属性

    Getter 也可以接受其他 getter 作为第二个参数

    1. getters: {
    2. // ...
    3. doneTodosCount: (state, getters) => {
    4. return getters.doneTodos.length
    5. }
    6. }

    跨模块调用

    若需要在全局命名空间内分发 action 或提交 mutation,将 { root: true } 作为第三参数传给 dispatchcommit 即可。

    1. context.commit('模块名/方法名', 参数, { root: true })
    2. context.dispatch('模块名/属性名', 参数, { root: true })

  • 相关阅读:
    【C++】从零开始认识泛型编程 — 模版
    【汇编】寄存器——内存访问内存中字的存储方式、DS和[address]、DS[]和CS:IP的区别、MOV,ADD,SUB、数据段与代码段的区别
    双指针系列-数组篇(LeetCode 27,26,283,844,977)
    阿里云对象存储OSS打造私人图床&私人云存储(1年仅9元)
    vue3笔记
    101道算法JavaScript描述【二叉树】5
    第二十章 构建和配置 Nginx (UNIX® Linux macOS)
    Spring面试题
    一键设置个性手机壁纸:苹果手机怎么设置动态壁纸?
    Java,利用switch的穿透
  • 原文地址:https://blog.csdn.net/weixin_46479909/article/details/133848078