vuex 最简单、最详细的入门文档

前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到教程。

如果你在使用 vue.js , 那么我想你可能会对 vue 组件之间的通信感到崩溃 。

我在使用基于 vue.js 2.0 的UI框架 ElementUI 开发网站的时候 , 就遇到了这种问题 : 一个页面有很多表单 , 我试图将表单写成一个单文件组件 , 但是表单 ( 子组件 ) 里的数据和页面 ( 父组件 ) 按钮交互的时候 , 它们之间的通讯很麻烦 :

<!--父组件中引入子组件-->
<template><div><a href="javascript:;" @click="show = true">点击</a><t-dialog :show.sync="show"></t-dialog></div>
</template><script>
import dialog from './components/dialog.vue'
export default {data(){return {show:false}},components:{"t-dialog":dialog}
}
</script><!--子组件-->
<template><el-dialog :visible.sync="currentShow"></el-dialog>
</template><script>
export default {props:['show'],computed:{currentShow:{get(){return this.show},set(val){this.$emit("update:show",val)}}}
}
</script>

之所以这么麻烦 , 是因为父组件可以通过 props 给子组件传递参数 , 但子组件内却不能直接修改父组件传过来的参数。

这时候 , 使用 vuex 就可以比较方便的解决这种问题了 :

<!--父组件中引入子组件-->
<template><div><a href="javascript:;" @click="$store.state.show = true">点击</a><t-dialog></t-dialog></div>
</template><script>
import dialog from './components/dialog.vue'
export default {components:{"t-dialog":dialog}
}
</script><!--子组件-->
<template><el-dialog :visible.sync="$store.state.show"></el-dialog>
</template><script>
export default {}
</script>

是不是方便了许多 , 这就是 vuex 最简单的应用 , 不要被网上其他教程吓到 , vuex 原来可以这么简单 !

安装、使用 vuex

首先我们在 vue.js 2.0 开发环境中安装 vuex :

npm install vuex --save

然后 , 在 main.js 中加入 :

import vuex from 'vuex'
Vue.use(vuex);
var store = new vuex.Store({//store对象state:{show:false}
})

再然后 , 在实例化 Vue对象时加入 store 对象 :

new Vue({el: '#app',router,store,//使用storetemplate: '<App/>',components: { App }
})

完成到这一步 , 上述例子中的 $store.state.show 就可以使用了。

modules

前面为了方便 , 我们把 store 对象写在了 main.js 里面 , 但实际上为了便于日后的维护 , 我们分开写更好 , 我们在 src 目录下 , 新建一个 store 文件夹 , 然后在里面新建一个 index.js :

import Vue from 'vue'
import vuex from 'vuex'
Vue.use(vuex);export default new vuex.Store({state:{show:false}
})

那么相应的 , 在 main.js 里的代码应该改成 :

//vuex
import store from './store'new Vue({el: '#app',router,store,//使用storetemplate: '<App/>',components: { App }
})

这样就把 store 分离出去了 , 那么还有一个问题是 : 这里 $store.state.show 无论哪个组件都可以使用 , 那组件多了之后 , 状态也多了 , 这么多状态都堆在 store 文件夹下的 index.js 不好维护怎么办 ?

我们可以使用 vuex 的 modules , 把 store 文件夹下的 index.js 改成 :

import Vue from 'vue'
import vuex from 'vuex'
Vue.use(vuex);import dialog_store from '../components/dialog_store.js';//引入某个store对象export default new vuex.Store({modules: {dialog: dialog_store}
})

这里我们引用了一个 dialog_store.js , 在这个 js 文件里我们就可以单独写 dialog 组件的状态了 :

export default {state:{show:false}
}

做出这样的修改之后 , 我们将之前我们使用的 $store.state.show 统统改为 $store.state.dialog.show 即可。

如果还有其他的组件需要使用 vuex , 就新建一个对应的状态文件 , 然后将他们加入 store 文件夹下的 index.js 文件中的 modules 中。

modules: {dialog: dialog_store,other: other,//其他组件
}

mutations

前面我们提到的对话框例子 , 我们对vuex 的依赖仅仅只有一个 $store.state.dialog.show 一个状态 , 但是如果我们要进行一个操作 , 需要依赖很多很多个状态 , 那管理起来又麻烦了 !

mutations 登场 , 问题迎刃而解 :

export default {state:{//stateshow:false},mutations:{switch_dialog(state){//这里的state对应着上面这个statestate.show = state.show?false:true;//你还可以在这里执行其他的操作改变state}}
}

使用 mutations 后 , 原先我们的父组件可以改为 :

<template><div id="app"><a href="javascript:;" @click="$store.commit('switch_dialog')">点击</a><t-dialog></t-dialog></div>
</template><script>
import dialog from './components/dialog.vue'
export default {components:{"t-dialog":dialog}
}
</script>

使用 $store.commit('switch_dialog') 来触发 mutations 中的 switch_dialog 方法。

这里需要注意的是:

  1. mutations 中的方法是不分组件的 , 假如你在 dialog_stroe.js 文件中的定义了
    switch_dialog 方法 , 在其他文件中的一个 switch_dialog 方法 , 那么
    $store.commit('switch_dialog') 会执行所有的 switch_dialog 方法。
  2. mutations里的操作必须是同步的。

你一定好奇 , 如果在 mutations 里执行异步操作会发生什么事情 , 实际上并不会发生什么奇怪的事情 , 只是官方推荐 , 不要在 mutationss 里执行异步操作而已。

actions

多个 state 的操作 , 使用 mutations 会来触发会比较好维护 , 那么需要执行多个 mutations 就需要用 action 了:

export default {state:{//stateshow:false},mutations:{switch_dialog(state){//这里的state对应着上面这个statestate.show = state.show?false:true;//你还可以在这里执行其他的操作改变state}},actions:{switch_dialog(context){//这里的context和我们使用的$store拥有相同的对象和方法context.commit('switch_dialog');//你还可以在这里触发其他的mutations方法},}
}

那么 , 在之前的父组件中 , 我们需要做修改 , 来触发 action 里的 switch_dialog 方法:

<template><div id="app"><a href="javascript:;" @click="$store.dispatch('switch_dialog')">点击</a><t-dialog></t-dialog></div>
</template><script>
import dialog from './components/dialog.vue'
export default {components:{"t-dialog":dialog}
}
</script>

使用 $store.dispatch('switch_dialog') 来触发 action 中的 switch_dialog 方法。

官方推荐 , 将异步操作放在 action 中。

getters

getters 和 vue 中的 computed 类似 , 都是用来计算 state 然后生成新的数据 ( 状态 ) 的。

还是前面的例子 , 假如我们需要一个与状态 show 刚好相反的状态 , 使用 vue 中的 computed 可以这样算出来 :

computed(){not_show(){return !this.$store.state.dialog.show;}
}

那么 , 如果很多很多个组件中都需要用到这个与 show 刚好相反的状态 , 那么我们需要写很多很多个 not_show , 使用 getters 就可以解决这种问题 :

export default {state:{//stateshow:false},getters:{not_show(state){//这里的state对应着上面这个statereturn !state.show;}},mutations:{switch_dialog(state){//这里的state对应着上面这个statestate.show = state.show?false:true;//你还可以在这里执行其他的操作改变state}},actions:{switch_dialog(context){//这里的context和我们使用的$store拥有相同的对象和方法context.commit('switch_dialog');//你还可以在这里触发其他的mutations方法},}
}

我们在组件中使用 $store.state.dialog.show 来获得状态 show , 类似的 , 我们可以使用 $store.getters.not_show 来获得状态 not_show 。

注意 : $store.getters.not_show 的值是不能直接修改的 , 需要对应的 state 发生变化才能修改。

mapState、mapGetters、mapActions

很多时候 , $store.state.dialog.show 、$store.dispatch('switch_dialog') 这种写法又长又臭 , 很不方便 , 我们没使用 vuex 的时候 , 获取一个状态只需要 this.show , 执行一个方法只需要 this.switch_dialog 就行了 , 使用 vuex 使写法变复杂了 ?

使用 mapState、mapGetters、mapActions 就不会这么复杂了。

以 mapState 为例 :

<template><el-dialog :visible.sync="show"></el-dialog>
</template><script>
import {mapState} from 'vuex';
export default {computed:{//这里的三点叫做 : 扩展运算符...mapState({show:state=>state.dialog.show}),}
}
</script>

相当于 :

<template><el-dialog :visible.sync="show"></el-dialog>
</template><script>
import {mapState} from 'vuex';
export default {computed:{show(){return this.$store.state.dialog.show;}}
}
</script>

mapGetters、mapActions 和 mapState 类似 , mapGetters 一般也写在 computed 中 , mapActions 一般写在 methods中。

弄懂上面这些 , 你可以去看vuex文档了 , 应该能看懂了。

 

转自:https://segmentfault.com/a/1190000009404727

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/448569.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

科目三路考操作要点

一踏&#xff08;离合器&#xff09;二挂&#xff08;挡&#xff09;三拨&#xff08;左转向灯&#xff09;四看&#xff08;左右镜及侧头观察周边情况&#xff09;五按&#xff08;喇叭&#xff09;六松&#xff08;闸&#xff0c;即手制动&#xff09; 在科目三考试途中的注…

10种顶级javascript框架比较-The Top 10 Javascript MVC Frameworks

转载于&#xff1a;http://codebrief.com/2012/01/the-top-10-javascript-mvc-frameworks-reviewed/ Gordon L. Hempton是西雅图的一位黑客和设计师&#xff0c;他花费了几个月的时间研究和比较了12种流行的JavaScript MVC框架&#xff0c;并在博客中总结了每种框架的优缺点&am…

数据结构之顺序表(一)

有关顺序表&#xff0c;由于代码太长&#xff0c;我将分成2部分&#xff0c;这边是头文件SeqList.h和主函数&#xff1a; #ifndef __SEQLIST_H__ #define __SEQLIST_H__#define FALSE -1 #define TRUE 0#define INIT_SIZE 100 #define INCRESS_SIZE 20typedef int Seq…

centos7 安装 node.js 运行环境、卸载

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 一.安装 1.进入官网下载最新版本 https://nodejs.org/en/ 选择下载后上传或直接使用wget下载 wget https://nodejs.org/dist/v8.11.…

白云山脚下的廉价菜-饮胜酒家

亚运将至&#xff0c;我们已经渐渐感受到那种气氛了&#xff0c;最明显就是搭公交车不用钱&#xff0c;我可以不再做那辆兜路的54路车&#xff0c;每天可以睡多10分钟&#xff0c;然后从家楼下转3趟车上班&#xff0c;重要部部都有位置坐&#xff0c;每天在路上都看到有好多好多…

科目三考试指南

正在准备科目三的您&#xff0c;对顺利通过考试有信心吗&#xff1f;今天&#xff0c;小编为大家带来科目三靠边停车技巧&#xff0c;通过讲解靠边停车考试要求&#xff0c;让学员更好地掌握相关技巧&#xff0c;希望能帮到大家。 靠边停车考试项目中规定&#xff0c;车前保险杠…

docker学习4-docker安装mysql环境

前言 docker安装mysql环境非常方便&#xff0c;简单的几步操作就可以了 拉取mysql镜像 先拉取mysql的镜像&#xff0c;可以在docker的镜像仓库找到不同TAG标签的版本https://hub.docker.com/_/mysql?tabtags 我这里选择mysql:5.7标签 [rootyoyo ~]# docker pull mysql:5.7 5.7…

数据结构之顺序表(二)

这是接着之前的剩下来的部分&#xff1a; #include <stdlib.h> #include "SeqList.h" #include <stdio.h>SeqList *Create_List() {//创建一个顺序表SeqList* s (SeqList*)malloc(sizeof(SeqList)/sizeof(char));if (NULL s){return NULL;}//初始化顺…

Dynamics CRM 2015 站点地图公告配置实体显示名称的变更

CRM更新2015后&#xff0c;在设置里找不到公告配置了 在原来的位置上你会东西一个叫活动源配置的东西&#xff0c;点开看后就是原来的公告配置。 版权声明&#xff1a;本文为博主原创文章&#xff0c;未经博主允许不得转载。 转载于:https://www.cnblogs.com/VicTang/p/4799531…

解决:liunx 光标消失(显示光标)

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 2个命令可以管控光标&#xff1a; 隐藏光标 &#xff1a; echo -e "\033[?25l" 显示光标 &#xff1a; echo -e "\0…

科​目​三​路​考​操​作​步​骤

科目三路考操作步骤 一、起步前五大操作顺序&#xff1a; 1.检查手制动是否拉紧 2.踩下离合器踏板&#xff0c;挂空挡 3.开汽车电源 4.轻踩油门&#xff08;电喷车不需要&#xff09;&#xff0c;接通马达 5.发动后&#xff0c;手马上离开 二、起步顺序6个步骤&…

漫谈微服务架构:什么是Spring Cloud,为何要选择Spring Cloud

Spring Cloud是基于Spring Boot的&#xff0c;因此还在使用SpringMVC的同学要先了解Spring Boot。先上一段官话&#xff0c;Spring Cloud是一个基于Spring Boot实现的云应用开发工具&#xff0c;它为基于JVM的云应用开发中涉及的配置管理、服务发现、断路器、智能路由、微代理、…

数据结构之头指针链表de三种插入方式(头插法,尾插法,在pos处插入)

1、头插法&#xff1a; 流程&#xff1a;1 &#xff0c;判断传入数据是否正确 2&#xff0c;如果正确则创建一个新的节点&#xff0c;并判断节点是否创建成功 3&#xff0c;然后给节点成员变量赋值 4&#xff0c;最后让新节点变为链表的第一个节点。 代码实现: // 链表的头插…

c# 科学计数法值转换成正常值,返回字符串

/// <summary>/// 科学计数法值转换成正常值/// </summary>/// <param name"value"></param>/// <returns></returns>public string ValueScientificNotationConvert(JToken value){if (value null) return "";var …

使用 Docker 部署 Node 服务

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 前言   Docker 是一个开源的容器引擎。开发者可以将自己的应用以及依赖打包为一个可移植的容器&#xff0c;然后发布到 Linux 机器上。…

科目三电子考的通过率普遍偏低

据调查&#xff0c;科目三电子考的通过率普遍偏低&#xff0c;是学员们公认的最难考项目。今天小编要通过自己的所看所听分析科目三电子考通过率低的三大原因。 原因一&#xff1a;考生基本功不扎实 从历年来考试失败的理由中&#xff0c;可以发现&#xff0c;大多都出现上车、…

打印python包含汉字报SyntaxError: Non-ASCII character '\xe4' in file

因为本人主要使用Scala语言&#xff0c;但是之前同事包括老大都是使用python&#xff0c;加上python在spark的使用中的确越来越受欢迎&#xff0c;所以最近准备入坑python&#xff0c;但是装完写demo的时候出了问题&#xff0c;如下&#xff1a; 查了下发现&#xff0c;这是pyt…

数据结构之头指针链表的逆序、输出和指定位置的删除

头指针链表指定位置的删除 实现&#xff1a;1&#xff0c;先判断传入的数据是否正确&#xff0c;然后再判断是否为空表&#xff0c;最后判断pos的值是否满足题意 2&#xff0c;分删除位置为1和不为1讨论&#xff1a;为1时&#xff0c;直接将h指向第二个节点并释放第一个节点的…

软件包管理 之 fedora-rpmdevtools 工具介绍

作者&#xff1a;北南南北来自&#xff1a;LinuxSir.Org提要&#xff1a;fedora-rpmdevtools 是一款Fedora的RPM包的开发工具&#xff0c;用于Fedora Core 2.0 以上版本&#xff1b; 正文 一、fedora-rpmdevtools 介绍&#xff1b; 用于制作RPM包的工具&#xff0c;为开发者提供…

Node.js 多版本安装配置(Window、Ubuntu 、CentOS 、Mac OS、Cloud Studio)

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 向大家介绍在window和Linux上安装Node.js的方法。 本安装教程以Node.js v4.4.3 LTS(长期支持版本)版本为例。 Node.js安装包及源码下载…