Vue组件间通信 Vuex的用法解析


Posted in Javascript onAugust 05, 2019

上回说到Vue组件间通讯,最后留了一个彩蛋~~~Vuex。Vuex是另一种组件通讯的方法,这节来说说Vuex(store仓库)。

首先Vuex需要安装,安装的方式有很多,在这里就不一一细说了。我是通过npm方式安装的:

npm install vuex --save

安装好之后需要再main.js里全局引入:

import Vue from 'vue'
import Vuex from 'vuex'
Vue.use(Vuex)new Vue({el:'#app',store,components: { App },template: '<App/>'})

这样就完成了Vuex的安装。接下来就是Vuex的用法了:

Vuex有五个属性:State、Getter、Mutation、Action、Module。

1. State里放入的是仓库的数据,类似于js里的data:

import Vue from 'vue'
const modules = {
 state:{
 name: '小白'
 }
 namespaced: true
}
export default modules

把Vuex放入src下的store文件里,建一个新的组件modules,然后把他抛出来,被引入所需数据的组件:

<script>
import { mapState }from 'vuex'
export default {
 computed:{
 // name(){
 // return this.$store.state.name
 // }
 ...mapState(['name'])
 },
 mounted(){
 console.log(this.name)
 }
}
</script>

Vuex里的数据需要从计算属性(computed)里获取,我写了两种我常用的方法,都可以接收到数据,在mounted钩子里打印出的数据:

Vue组件间通信 Vuex的用法解析

这里只是举个例子教大家如何用,不建议大家向我这样去写,Vuex应该用于所有业务逻辑的数据。不涉及到业务逻辑的,建议大家用上一章的方法:Vue组件间通信。

2. Getters里放入State里数据的扩展数据,可以把它当作计算属性。比如State里有一个数组,就可以从Getters里获取到数组的长度,或是取到对象里面的属性,用法和计算属性类似:

import Vue from ‘vue'

const modules = {
 state:{
 list:[
  {id :1,content: '第一条'},
  {id :2,content: '第二条'}
 ]
 },
 getter:{
 listLength: (state)=>{return state.list.length}
 }, namespaced: true}export default modules;

我在state里存了一个数组,然后getters计算出state里数组的长度,接下来就是在组件里接收了:

<script>
import { mapGetters } from 'Vuex'
export default {
 compoted:{
 ...mapGetters(['listLength'])
 },
 mounted(){
 console.log(this.listLegth)
 }
}
</script>

打开控制台打印出2,就是list数组的长度。

3. Mutations是保存在仓库的方法,这个方法只能用来改变state里面的数据,而且想要改变state里的数据只能用mutations里的方法,并且它里面的方法只能是同步的:

import Vue from 'vue'

const modules = {
 state:{
 name: '小黑'
 },
 mutations:{
 changeName(state){
  state.name = '小白'
 }
 },
 namespaced: true
}
export default modules;

还是那个例子,下面是组件调用方法:

<html>
<div>
 {{ name }}
 <el-button @click="changeName">改变名字</el-button>
</div>
</html>
<script>
import { mapState,mapMutations } from 'vuex'
export default {
 compoted:{
 ...mapState(['name'])
 },
 methods:{
 ...mapMutations(['changeName'])
 }
}
</script>

页面渲染后为:

Vue组件间通信 Vuex的用法解析

点击按钮之后为:

Vue组件间通信 Vuex的用法解析

组件里的按钮通过调用Vuex里的mutation方法将Vuex里的state数据改变,只不过mutations方法只能同步的,涉及到接口的就不能在它里面写,怎么办的?往下看:

4. Actions和mutations一样都是Vuex里的方法,只不过他们有两个最大的不同:

(1) Actions里可以存放异步方法,而Mutations只能放同步的;

(2) Actions里不可以更改state里的数据,state里的数据只能在Mutations里更改。

Actions是什么方法?简单的说,它就是一个Promise方法,通过不同的状态执行不同的方法,执行方法可以是Actions里的方法,也可以是Mutations里的方法。

Actions我就不举例子了,因为大部分都用于axios请求接口,简单跟大家说说这个东西怎么使用:

import Vue from 'vue'
import request from '@/api/axios'

const modules = {
 state:{
 list:[]
 },
 actions:{
 getList({ commit }){
  // 调用接口方法
  request.getList()
  .then((response)=>{
  // commit用来分配mutations方法
  commit('getList',response)
  })
 }
 },
 mutations:{
 getList(state,response){
  state.list = response.data
 }
 }
}

简单利用actions异步方法分配给mutations方法,然后在mutations方法里给state里的数据赋值,取到接口数据。

commit用于分配mutations方法,dispatch用于分配actions方法,都需要传参进去。

组件调用其实和调用mutations方法类似:

<script>
import { mapState,mapActions } from 'vuex'
export default {
 computed:{
 ...mapState(['list'])
 },
 mounted(){
 this.getList()
 },
 methods:{
 ...mapActions(['getList'])
 }
}
</script>

这样就基本完成了vuex传值。

5. module可以把vuex分为不同的模块,使业务逻辑变得更清晰,更准确。在上面的代码里,有const modules,给它不同的名字就是分为不同的模块。不同的module可以存入不同的数据和方法,使用起来非常方便。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
提高代码性能技巧谈—以创建千行表格为例
Jul 01 Javascript
人人网javascript面试题 可以提前实现下
Jan 05 Javascript
css结合js制作下拉菜单示例代码
Feb 27 Javascript
JS 使用for循环遍历子节点查找元素
Sep 06 Javascript
jquery实现的简单二级菜单效果代码
Sep 22 Javascript
js 右侧浮动层效果实现代码(跟随滚动)
Nov 22 Javascript
JavaScript中解决多浏览器兼容性23个问题的快速解决方法
May 19 Javascript
BootStrap中的Fontawesome 图标
May 25 Javascript
微信小程序switch开关选择器使用详解
Jan 31 Javascript
实例详解vue.js浅度监听和深度监听及watch用法
Aug 16 Javascript
对vuejs的v-for遍历、v-bind动态改变值、v-if进行判断的实例讲解
Aug 27 Javascript
p5.js实现故宫橘猫赏秋图动画
Oct 23 Javascript
前后端常见的几种鉴权方式(小结)
Aug 04 #Javascript
vue的注意规范之v-if 与 v-for 一起使用教程
Aug 04 #Javascript
vue v-for 使用问题整理小结
Aug 04 #Javascript
在Vue项目中用fullcalendar制作日程表的示例代码
Aug 04 #Javascript
JS实现的tab切换并显示相应内容模块功能示例
Aug 03 #Javascript
原生JS 实现的input输入时表格过滤操作示例
Aug 03 #Javascript
vue.js基于v-for实现批量渲染 Json数组对象列表数据示例
Aug 03 #Javascript
You might like
PHP结合JQueryJcrop实现图片裁切实例详解
2014/07/24 PHP
PHP编写daemon process详解及实例代码
2016/09/30 PHP
Linux服务器下PHPMailer发送邮件失败的问题解决
2017/03/04 PHP
thinkPHP框架实现的无限回复评论功能示例
2018/06/09 PHP
Laravel框架自定义分页样式操作示例
2020/01/26 PHP
Laravel框架源码解析之入口文件原理分析
2020/05/14 PHP
JavaScript传递变量: 值传递?引用传递?
2011/02/22 Javascript
js操纵跨frame的三级联动select下拉选项实例介绍
2013/05/19 Javascript
jQuery 插件开发指南
2014/11/14 Javascript
浅谈JavaScript Array对象
2014/12/29 Javascript
JavaScript数据推送Comet技术详解
2016/04/07 Javascript
JavaScript从数组的indexOf()深入之Object的Property机制
2016/05/11 Javascript
基于jQuery.validate及Bootstrap的tooltip开发气泡样式的表单校验组件思路详解
2016/07/18 Javascript
JS中动态创建元素的三种方法总结(推荐)
2016/10/20 Javascript
基于JS实现横线提示输入验证码随验证码输入消失(js验证码的实现)
2016/10/27 Javascript
ES6学习教程之对象的扩展详解
2017/05/02 Javascript
详解react-router 4.0 下服务器如何配合BrowserRouter
2017/12/29 Javascript
vue使用$emit时,父组件无法监听到子组件的事件实例
2018/02/26 Javascript
webpack打包js的方法
2018/03/12 Javascript
Vue.js 动态为img的src赋值方法
2018/03/14 Javascript
基于vue-upload-component封装一个图片上传组件的示例
2018/10/16 Javascript
vue中实现Monaco Editor自定义提示功能
2019/07/05 Javascript
解决vue的touchStart事件及click事件冲突问题
2020/07/21 Javascript
[46:43]DOTA2上海特级锦标赛主赛事日 - 1 胜者组第一轮#2LGD VS MVP.Phx第二局
2016/03/02 DOTA
python中安装Scrapy模块依赖包汇总
2017/07/02 Python
python实现校园网自动登录的示例讲解
2018/04/22 Python
Python简单过滤字母和数字的方法小结
2019/01/09 Python
Python 使用threading+Queue实现线程池示例
2019/12/21 Python
新手学习Python2和Python3中print不同的用法
2020/06/09 Python
使用tensorflow进行音乐类型的分类
2020/08/14 Python
一款超酷的js+css3实现的3D标签云特效兼容ie7/8/9
2013/11/18 HTML / CSS
html5需遵循的6个设计原则
2016/04/27 HTML / CSS
Europcar美国/加拿大:预订汽车或卡车租赁服务
2018/11/13 全球购物
巾帼文明岗申报材料
2014/05/01 职场文书
2014幼儿园班主任工作总结
2014/12/04 职场文书
周末问候语大全
2015/11/10 职场文书