热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Vue.jsVuex使用详解

VuexVuex是一个专门为Vue.js应用程序开发的状态管理模式。它采用集中式存储管理应用的所有组件的状态,并以相应的规则保证状态以一种可预测的方式发生变化。V

在这里插入图片描述

Vuex

Vuex是一个专门为Vue.js应用程序开发的状态管理模式。

  • 它采用集中式存储管理应用的所有组件的状态,并以相应的规则保证状态以一种可预测的方式发生变化。
  • Vuex也集成到Vue的官方调试工具devtools extension,提供了诸如零配置的time-travel调试、状态快照导入导出等高级调试功能。

使用

安装Vuex:

npm install --save vuex

在src下新建store文件夹,在其中新建index.js作为Vuex的配置文件:

import Vue from 'vue'
import Vuex from 'vuex'//安装插件
Vue.use(Vuex)//创建对象const store = new Vuex.Store({})//导出
export default store

在main.js中引入注册:

import Vue from 'vue'
import App from './App'
import router from './router'
import store from './store';Vue.config.productionTip = false/* eslint-disable no-new */
new Vue({el: '#app',router,store,components: { App },template: ''
})

仓库store包含了应用的数据(状态)和操作过程。Vuex里的数据都是响应式的,任何组件使用同一个store的数据时,只要store的数据变化,对应的组件也会立即更新。

数据保存在Vuex选项的state 字段内,比如要实现一个计数器,定义一个数据count,初始值为0:

const store = new Vuex.Store({state: {counter: 1000}
})

在App.vue中使用:

<template><div id&#61;"app"><h2>App</h2><h2>{{$store.state.counter}}</h2></div>
</template>

现在访问首页&#xff0c;计数0已经可以显示出来了。

在组件内&#xff0c;来自store的数据只能读取&#xff0c;不能手动改变&#xff0c;改变store中数据的唯一途径就是显示的提交mutations&#xff0c;用来加1和减1。

const store &#61; new Vuex.Store({state: {counter: 1000},mutations: {////方法,默认参数为stateincrement(state) {state.counter&#43;&#43;},decrement(state) {state.counter--}}
})

在组件内&#xff0c;通过this.$store.commit方法来执行mutations。在App.vue中添加两个按钮用于加和键&#xff1a;

<template><div id&#61;"app"><h2>App</h2><h2>{{$store.state.counter}}</h2><button &#64;click&#61;"handleIncrement">&#43;1</button><button &#64;click&#61;"handleDecrease">-1</button></div>
</template><script>import HelloVuex from &#39;./components/HelloVuex&#39;export default {name: &#39;App&#39;,components: {},data() {},methods: {handleIncrement(){this.$store.commit(&#39;increment&#39;)},handleDecrease(){this.$store.commit(&#39;decrement&#39;)}}}
</script><style></style>

在这里插入图片描述
在这里插入图片描述

mutations还可以接收第二个参数&#xff0c;可以是数字、字符串或对象等类型。比如每次增加的不是1&#xff0c;而是指定的数量&#xff0c;可以这样改写&#xff1a;

mutations: {//方法,默认参数为stateincrement(state, n) {state.counter &#43;&#61; n},decrement(state, n) {state.counter &#43;&#61; n}}

methods: {handleIncrement(){this.$store.commit(&#39;increment&#39;, 10)},handleDecrease(){this.$store.commit(&#39;decrement&#39;, 10)}}

提交mutation的另一种方式是直接使用包含type属性的对象&#xff0c;例如&#xff1a;

increment(state, n) {state.counter &#43;&#61; n.count}

handleIncrement(){this.$store.commit({type: &#39;increment&#39;,count: 10})}

Vuex还有其它三个选项可以使用&#xff1a;getters、actions、modules

getter&#xff1a;&#xff08;类似组件的计算属性computed&#xff09;

假如Vuex定义了某个数据List&#xff0c;它是一个数组&#xff1a;

state: {counter: 1000,list: [1, 5, 8, 10, 30, 50]}

如果只想要得到小于10的的数据&#xff0c;可以在getters中定义过滤方法&#xff1a;

getters: {//类似组件的计算属性filteredList: state &#61;> {return state.list.filter(item &#61;> item < 10)}}

在App.vue中使用&#xff1a;

<h2>{{$store.getters.filteredList}}</h2>

在这里插入图片描述

getters也可以依赖其它的getter&#xff0c;把getter作为第二个参数&#xff0c;例如再写一个getter&#xff0c;计算出list过滤后的结果的数量&#xff1a;

filteredList: state &#61;> {return state.list.filter(item &#61;> item < 10)},listCount: (state, getters) &#61;> {return getters.filteredList.length;}

<h2>{{$store.getters.listCount}}h2>
<h2>{{$store.getters.filteredList}}h2>

在这里插入图片描述

actions:
mutation中不应该异步操作数据&#xff0c;所以有了actions选项。
action在组件内通过$store.dispatch触发&#xff0c;例如使用action来减1,使用Promise在1秒后提交mutation&#xff1a;

mutations: {////方法,默认参数为stateincrement(state, n) {state.counter &#43;&#61; n.count},decrement(state, n) {state.counter -&#61; n}},actions: {//在这里定义异步操作asyncDecrement(context){return new Promise((resolve, reject) &#61;> {setTimeout(() &#61;> {context.commit(&#39;decrement&#39;, 10)resolve()}, 1000)})}}

App.vue:

<template><div id&#61;"app"><h2>App</h2><h2>{{$store.state.counter}}</h2><button &#64;click&#61;"handleIncrement">&#43;1</button><button &#64;click&#61;"handleActionDecrease">-1</button><h2>{{$store.getters.listCount}}</h2><h2>{{$store.getters.filteredList}}</h2></div>
</template><script>export default {name: &#39;App&#39;,components: {},methods: {handleIncrement(){this.$store.commit({type: &#39;increment&#39;,count: 10})},handleActionDecrease(){this.$store.dispatch(&#39;asyncDecrement&#39;).then(() &#61;> {console.log(this.$store.state.counter);//990})}}}
</script><style></style>

在这里插入图片描述

modules&#xff1a;

它用来将store分割到不同模块。当项目足够大时&#xff0c;store里的state、getters、mutations、actions会非常多&#xff0c;都放在一个index.js中就不是很友好&#xff0c;使用modules可以把他们写到不同的文件中。

每个module拥有自己的state、getters、mutations、actions&#xff0c;而且可以多层嵌套。

例如&#xff1a;

const moduleA &#61; {state: {...},mutations: {...},actions: {...},getters: {...}
}const moduleB &#61; {state: {...},mutations: {...},actions: {...},getters: {...}
}const store &#61; new Vuex.Store({modules: {a: moduleA,b: moduleB}
})store.state.a//moduleA的状态
store.state.b//moduleB的状态

另外&#xff0c;module的mutation和getter接受的第一个参数state是当前模块的状态。在actions和getters中&#xff0c;还可以接收一个参数rootState&#xff0c;来访问根节点的状态。比如getters中rootState将作为第三个参数&#xff1a;

const moduleA &#61; {state: {count: 0},getters: {sumCount (state, getters, rootState) {return state.count &#43; rootState.count;}}
}


推荐阅读
  • 【Vue基础】监听属性watch
    Vue监听属性是watch,我们可以通过watch来响应数据的变化。代码示例: ... [详细]
  • Vue cli2.0 项目中使用Monaco Editor编辑器
    monaco-editor是微软出的一条开源web在线编辑器支持多种语言,代码高亮,代码提示等功能,与VisualStudioCode功能几乎相同。在项目中可能会用带代码编 ... [详细]
  • 如何在Vue项目中安装和使用VUX组件?
    vux2模板fork自webpack模板,基本和官方同步。1、默认为webpack2模板npminstallvue-cli-g如果还没安装vueinitairyla ... [详细]
  • 网络请求模块选择——axios框架的基本使用和封装
    本文介绍了选择网络请求模块axios的原因,以及axios框架的基本使用和封装方法。包括发送并发请求的演示,全局配置的设置,创建axios实例的方法,拦截器的使用,以及如何封装和请求响应劫持等内容。 ... [详细]
  • VueCLI多页分目录打包的步骤记录
    本文介绍了使用VueCLI进行多页分目录打包的步骤,包括页面目录结构、安装依赖、获取Vue CLI需要的多页对象等内容。同时还提供了自定义不同模块页面标题的方法。 ... [详细]
  • 【前端工具】nodejs+npm+vue 安装(windows)
    预备先看看这几个是干嘛的,相互的关系是啥。nodejs是语言,类比到php。npm是个包管理,类比到composer。vue是个框架&# ... [详细]
  • 1.移除consol.log()的babel插件安装:npmibabel-plugin-transform-remove-console-D配置:babel.config.js:这 ... [详细]
  • Node.js详细安装及环境配置
    1、下载安装根据自己电脑系统及位数选择,我这里选择windows64位.msi格式安装包(官网:https:odejs.orgzh-cndownload).msi和.zip格式区别 ... [详细]
  • 本文涉及源码版本为2.6.9准备工作down一份Vue源码,从package.json入手,找我们需要的代码1、package.json中的scripts,build:nodesc ... [详细]
  • 本文记录了在vue cli 3.x中移除console的一些采坑经验,通过使用uglifyjs-webpack-plugin插件,在vue.config.js中进行相关配置,包括设置minimizer、UglifyJsPlugin和compress等参数,最终成功移除了console。同时,还包括了一些可能出现的报错情况和解决方法。 ... [详细]
  • 先看看ElementUI里关于el-table的template数据结构:<template><el-table:datatableData><e ... [详细]
  • Gitlab接入公司内部单点登录的安装和配置教程
    本文介绍了如何将公司内部的Gitlab系统接入单点登录服务,并提供了安装和配置的详细教程。通过使用oauth2协议,将原有的各子系统的独立登录统一迁移至单点登录。文章包括Gitlab的安装环境、版本号、编辑配置文件的步骤,并解决了在迁移过程中可能遇到的问题。 ... [详细]
  • Vue基础一、什么是Vue1.1概念Vue(读音vjuː,类似于view)是一套用于构建用户界面的渐进式JavaScript框架,与其它大型框架不 ... [详细]
  • 一:跨域问题1、同源策略(浏览器的安全策略)    只允许当前页面朝当前域下发请求,如果向其他域发请求,请求可以正常发送,数据也可以拿回,但是被浏览器拦截了  2、c ... [详细]
  • 使用npmi编译vue项目出现无法下载github.com中的对应的包源文件报错信息如下:npmERR!fatal:unabletoaccess'https:github ... [详细]
author-avatar
雪国文话天下
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有