我的编程空间,编程开发者的网络收藏夹
学习永远不晚

vue怎么使用Vuex状态管理模式

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

vue怎么使用Vuex状态管理模式

这篇“vue怎么使用Vuex状态管理模式”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“vue怎么使用Vuex状态管理模式”文章吧。

    1、基于单向数据流问题而产生了Vuex

    单向数据流是vue 中父子组件的核心概念,props 是单向绑定的。当父组件的属性值发生变化的时候,会传递给子组件发生相应的变化,从而形成一个单向下行的绑定,父组件的属性改变会流向下行子组件中,但是反之,为了防止子组件无意间修改了父组件中的数据而影响到了其他的子组件的状态,vue 规定了从下往上的数据流是不允许的。当我们的应用遇到多个组件共享状态时,单向数据流的简洁性很容易被破坏:

    a、多个组件依赖于同一状态。组件之间传参变得特别繁琐,并且兄弟组件之间状态传递无能为力。

    b、来自不同视图的行为需要变更同一状态。 经常会采用父子组件直接引用或者通过事件来变更和同步状态的多份拷贝。

    我们为什么不把组件的共享状态抽取出来,以一个全局单例模式管理呢?Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式。它采用集中式存储管理应用的所有组件的状态,并以相应的规则保证状态以一种可预测的方式发生变化。

    使用 Vuex 并不意味着你需要将所有的状态放入 Vuex。虽然将所有的状态放到 Vuex 会使状态变化更显式和易调试,但也会使代码变得冗长和不直观。如果有些状态严格属于单个组件,最好还是作为组件的局部状态。应该根据你的应用开发需要进行权衡和确定。

    2、安装及使用

    CDN 方式: <script class="lazy" data-src="...vuex.js"></script>    NPM 方式: npm install vuex --save    Yarn方式: yarn add vuex    其他方式:项目初始化是引入依赖    无论哪种方式都需要  Vue.use(Vuex)来安装 Vuex

    3、核心及使用方法

    每一个 Vuex 应用的核心就是 store(仓库)。“store”基本上就是一个容器,它包含着你的应用中大部分的状态 vuex的Vuex 核心 State 、Getters 、Mutation、Action、Module。

    (1)State

    Vuex也使用了单一状态树来管理应用层级的全部状态。唯一数据源。

    单一状态树能够让我们最直接的方式找到某个状态的片段,而且在之后的维护和调试过程中,也可以非常方便的管理和维护。

    state存储状态类似于组件中data,在组件中访问状态经常有两种方法:分别为

    a、通过 this.$store.state.属性 的方式来访问状态,通常写在computed计算属性中,当然也可以直接通过插值表达式访问;

    b、借助mapState 辅助函数。

    核心代码如下:

    <div id="app">            {{ mycount }}<br>            直接插值表达式访问            {{ this.$store.state.count }}<br>            {{ myinfoAge }}<br>        </div>        <script>        import Vue from 'vue';        import Vuex from 'vuex';        import { mapState } from 'vuex'// 使用辅助函数一定记住引入        const store = new Vuex.Store({            // 存储状态数据            state: {                count: 0,                info:{                    name:"xiaoming",                    age:18                }            },        )        new Vue({             el: '#app',            store,            computed:{                // a、计算属性方式                mycount(){                    return this.$store.state.count                },                // b、利用辅助函数赋值给对应变量,页面可以直接使用该变量                 ...mapState({                    myinfoAge: (state) => state.info.age,                }),                // 当映射的计算属性的名称与 state 的子节点名称相同时,我们也可以给 mapState 传一个字符串数组。下面的简化写法相当于 info: (state) => state.info,                ...mapState(["info"]),            }        })        </script>

    (2) Getters

    store的一个计算属性,类比组件的计算属性,getter 的返回值会根据它的依赖被缓存起来,且只有当它的依赖值发生了改变才会被重新计算,Getter 接受 state 作为其第一个参数,在state中的数据发生改变,计算属性重新计算

    Getters 的状态存储相当于组件中计算属性,访问方式有三种:

    a、通过属性访问

    b、通过方法访问

    c、通过mapGetters 辅助函数访问

    核心代码如下:

    <div id="app">           {{ myInfoLength }}<br>           直接插值表达式访问           {{ this.$store.getters.infoLength }}<br>           {{ myName }}<br>           {{ infoLength }}        </div>        <script>        import Vue from 'vue';        import Vuex from 'vuex';        import { mapGetters  } from 'vuex'// 使用辅助函数一定记住引入        const store = new Vuex.Store({            state: {                info:[                    {name:"name1",age:18},                    {name:"name2",age:28}                ]            },            // 存储状态数据            getters: {                infoLength: (state) => {                    return state.info.length;                },                getNameByAge: (state) => (age) => {                    return state.info.find(item => item.age === age).name                }            },        )        new Vue({             el: '#app',            store,            computed:{                // a、通过属性访问                myInfoLength(){                    return this.$store.getters.infoLength                }                // b、通过方法访问                myName(){                    return this.$store.getters.getNameByAge(18)                }                // c、mapGetters 辅助函数仅仅是将 store 中的 getter 映射到局部计算属性                ...mapGetters(["infoLength"])            }        })        </script>

    (3) Mutation

    前面state和getters两个核心概念都是为了在store存储数据和访问数据的使用,Mutation则提供了对store中数据的修改功能,并且是唯一的更新方式,提交Mutation,Mutation主要包括两部分:字符串的事件类型(type)和一个回调函数(handler),该回调函数的第一个参数就是state。

    在视图组件中不能直接修改store容器中的状态,需要先在容器中注册一个事件函数,当需要更新状态时候需要提交触发该事件,同时可以向该事件传递参数。这里需要区别与组件内v-model双向绑定。提交事件方法有一下几种:

    a、普通提交方式

    b、对象风格提交

    c、借助 mapMutations 辅助函数

    其核心代码如下:

    <div id="app">            <button @click="handleAdd">点我加一</button>            <button @click="handleAddForNum">点我加加</button>            <button @click="handleAddForObj">对象添加</button>            <button @click="handleAddMap">对象添加</button>        </div>        <script>        import Vue from 'vue';        import Vuex from 'vuex';        import { mapMutations  } from 'vuex'// 使用辅助函数一定记住引入        const store = new Vuex.Store({            state: {                count:1            },            mutations:{                // 注册事件                addCount(state){                    state.count ++                },                addCountForNum(state,num){                    state.count += num                },                addCountForObj(state,payload){                    state.count += payload.num                },                addMap(state){                    state.count ++                }            }        )        new Vue({             el: '#app',            store,            methods:{                // a、普通提交方式                handleAdd(){                    this.$store.commit('addCount')                },                handleAddForNum(){                    this.$store.commit('addCountForNum',10)                },                // b、对象风格提交                handleAddForObj() {                    this.$store.commit({ type: "addCountForObj", num: 100 });                },                // c、借助 mapMutations 辅助函数                ...mapMutations(["addMap"]),                handleAddMap(){                    this.addMap()                }            }        })        </script>

    Mutation 需遵守 Vue 的响应规则,Vuex 的 store 中的状态是响应式的,那么当我们变更状态时,监视状态的 Vue 组件也会自动更新。这也意味着 Vuex 中的 mutation 也需要与使用 Vue 一样遵守一些注意事项:最好提前在你的 store 中初始化好所有所需属性。当需要在对象上添加新属性时,你应该使用 Vue.set(obj, 'newProp', 123), 或者以新对象替换老对象。例如,利用对象展开运算符 state.obj = { ...state.obj, newProp: 123 }

    注意:Mutation 必须是同步函数。在 mutation 中混合异步调用会导致你的程序很难调试。例如,当你调用了两个包含异步回调的 mutation 来改变状态,你怎么知道什么时候回调和哪个先回调呢?

    (4) Action

     Action类似于Mutation, 但是是用来代替Mutation进行异步操作的.action 用于异步的修改state,它是通过muation间接修改state的。

     context是和store对象具有相同方法和属性的对象.也就是说, 我们可以通过context去进行commit相关的操作, 也可以获取context.state等.

     若需要异步操作来修改state中的状态,首先需要action来注册事件,组件视图在通过dispatch分发方式调用该事件,该事件内部提交mutation中的事件完成改变状态操作,总之,通过action这个中介来提交mutation中的事件函数.分发事件方法如下:

    a、普通提交方式

     b、对象风格提交

     c、借助 mapActions 辅助函数

     核心代码如下:

    <div id="app">            <button @click="handleAdd">点我加一</button>            <button @click="handleAddTen">点我加十</button>            <button @click="handleAddForObj">对象添加</button>            <button @click="handleAddMap">对象添加</button>        </div>        <script>        import Vue from 'vue';        import Vuex from 'vuex';        import { mapMutations,mapActions  } from 'vuex'// 使用辅助函数一定记住引入        const store = new Vuex.Store({            state: {                count:1            },            // 注册事件修改state状态值            mutations:{                addCount(state){                    state.count ++                },                addCountForNum(state,num){                    state.count += num                },                addCountForObj(state,payload){                    state.count += payload.num                },                addMap(state){                    state.count ++                }            },            // 注册事件,提交给 mutation            actions:{                addAction(context){                    setTimeout(() => {                        context.commit('addCount')                    }, 1000)                },                addActionForNum(context,num){                    setTimeout(() => {                        context.commit('addCountForNum',num)                    }, 1000)                },                addActionForObj(context,payload){                    setTimeout(() => {                        context.commit('addCountForObj',payload)                    }, 1000)                },                addActionMap(context){                    setTimeout(() => {                        context.commit('addMap')                    }, 1000)                }            }        )        new Vue({             el: '#app',            store,            methods:{                // a、普通提交方式                handleAdd(){                    this.$store.dispatch('addAction')                },                handleAddTen(){                    this.$store.dispatch('addActionForNum',10)                },                //  b、对象风格提交                handleAddForObj(){                    this.$store.dispatch({                        type: 'addActionForObj',                        amount: 10                    })                }                // 借助 mapActions 辅助函数                ...mapActions(["addActionMap"]),// 相当于...mapActions({addActionMap:"addActionMap"})                 handleAddMap(){                    this.addActionMap()                }            }        })

    组合 Action:组合多个 action,以处理更加复杂的异步流程.store.dispatch 可以处理被触发的 action 的处理函数返回的 Promise,并且 store.dispatch 仍旧返回 Promise。一个 store.dispatch 在不同模块中可以触发多个 action 函数。在这种情况下,只有当所有触发函数完成后,返回的 Promise 才会执行。假设 getData() 和 getOtherData() 返回的是 Promise。

    actions: {            async actionA ({ commit }) {                commit('gotData', await getData())            },            async actionB ({ dispatch, commit }) {                await dispatch('actionA') // 等待 actionA 完成                commit('gotOtherData', await getOtherData())            }        }

    (5)Modules

    Vuex允许我们将store分割成模块(Module), 而每个模块拥有自己的state、mutation、action、getters等

    4、Vuex和全局对象的不同

    (1)Vuex 的状态存储是响应式的。当 Vue 组件从 store 中读取状态的时候,若 store 中的状态发生变化,那么相应的组件也会相应地得到高效更新。

    (2)你不能直接改变 store 中的状态。改变 store 中的状态的唯一途径就是显式地提交 (commit) mutation。这样使得我们可以方便地跟踪每一个状态的变化,从而让我们能够实现一些工具帮助我们更好地了解我们的应用。

    以上就是关于“vue怎么使用Vuex状态管理模式”这篇文章的内容,相信大家都有了一定的了解,希望小编分享的内容对大家有帮助,若想了解更多相关的知识内容,请关注编程网行业资讯频道。

    免责声明:

    ① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

    ② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

    vue怎么使用Vuex状态管理模式

    下载Word文档到电脑,方便收藏和打印~

    下载Word文档

    猜你喜欢

    vue怎么使用Vuex状态管理模式

    这篇“vue怎么使用Vuex状态管理模式”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“vue怎么使用Vuex状态管理模式”文
    2023-06-29

    Vue状态管理库Vuex如何使用

    本篇内容介绍了“Vue状态管理库Vuex如何使用”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!Vue.js 是一个流行的 JavaScrip
    2023-07-05

    Vuex中状态管理器怎么使用

    本文小编为大家详细介绍“Vuex中状态管理器怎么使用”,内容详细,步骤清晰,细节处理妥当,希望这篇“Vuex中状态管理器怎么使用”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。一、Vuex是什么?Vuex在Vue项
    2023-07-02

    集中式状态管理Vuex如何使用

    这篇文章主要讲解了“集中式状态管理Vuex如何使用”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“集中式状态管理Vuex如何使用”吧!1.vuex是什么一个专门在Vue中实现集中式状态管理的一
    2023-07-05

    Vue状态管理库Pinia和Vuex使用哪个好

    今天小编给大家分享一下Vue状态管理库Pinia和Vuex使用哪个好的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。Vuex
    2023-07-05

    深入了解Vue.js中的Vuex状态管理模式

    Vuex是Vue.js的官方状态管理模式,它为Vue.js应用程序提供了一个集中式的状态管理解决方案,Vuex可以帮助我们管理应用程序中所有组件的状态,使得状态管理变得更加简单和可靠,需要详细了解可以参考下文
    2023-05-19

    怎么使用Vuex模块化实现待办事项的状态管理

    这篇文章主要介绍“怎么使用Vuex模块化实现待办事项的状态管理”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“怎么使用Vuex模块化实现待办事项的状态管理”文章能帮助大家解决问题。效果:待办事项中的一
    2023-07-04

    浅析集中式状态管理Vuex的使用方法

    如何使用集中式状态管理的Vuex?下面本篇文章就带大家了解一下vuex,简单聊聊vuex的使用方法,希望对大家有所帮助!
    2023-05-14

    Vue新的状态管理Pinia怎么使用

    今天小编给大家分享一下Vue新的状态管理Pinia怎么使用的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。为什么有 Vuex
    2023-07-06

    Vue简单状态管理之store模式是什么

    这篇文章给大家分享的是有关Vue简单状态管理之store模式是什么的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。概述store 状态管理模式的实现思想很简单,就是定义一个 store 对象,对象里有 state
    2023-06-15

    编程热搜

    • Python 学习之路 - Python
      一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
      Python 学习之路 - Python
    • chatgpt的中文全称是什么
      chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
      chatgpt的中文全称是什么
    • C/C++中extern函数使用详解
    • C/C++可变参数的使用
      可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
      C/C++可变参数的使用
    • css样式文件该放在哪里
    • php中数组下标必须是连续的吗
    • Python 3 教程
      Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
      Python 3 教程
    • Python pip包管理
      一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
      Python pip包管理
    • ubuntu如何重新编译内核
    • 改善Java代码之慎用java动态编译

    目录