Vue.js vuex
1.前言
- Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式,它解决了vue中不同组件之间状态共享的问题。
- 通俗的说,它就是一个带响应式的全局变量管理,它数据的改变会触发相关页面/组件的更新,这是普通全局变量做不到的
2.vuex的安装及配置
- npm安装vuex
npm install vuex --save
- 编写vuex模块
//src/store/index.js
import Vue from 'vue'
import Vuex from 'vuex'
// Vue.js 插件
Vue.use(Vuex)
const state = {
count: 0
}
const getters = {
}
//Vuex中store数据改变的唯一方法就是mutation
const mutations = {
}
// mutations的再封装,mutations本身只负责state的数据修改,其余逻辑放在actions中,在通过它进行一系列逻辑处理之后再调用mutations
const actions = {
}
export default new Vuex.Store({
state,// 状态对象,相当于data
getters,// 包含多个getter计算属性函数的对象
mutations, // mutations 里面装着改变数据的方法集合,处理数据逻辑的方法全部放在 mutations 里,使数据和视图分离。
actions // action 可以包含任意异步操作,例如发送ajax请求
})
- 入口文件中引入vuex模块
// main.js
import Vue from 'vue'
import App from './App'
import router from './router'
import store from './store'
Vue.config.productionTip = false
new Vue({
el: '#app',
router,
components: { App },
template: '<App/>',
store
})
3.state和getters的定义
- state的值为一个对象,里面的键值对就是一个个状态(数据)
const state = {
count: 0,
msg:''
}
- getters类似于vue中的计算属性,他是一个对象,里面可以定义多个方法
- 每个方法需要返回一个值,这个值就是这个属性的值
- 每个方法存在2个参数,分别为:state和getters
const getters = {
OddorEven (state,getters) {
// vuex已经为其传递了state和getters这个参数
//返回的值就是这个属性的值
return state.count%2===0 ? '偶数':'奇数'
}
}
4.组件中读取state和getters
- 可以直接在组件的HTML模版中直接绑定数据(不推荐,uni-app中这种写法不支持)
<p>{{$store.state.count}} </p>
<p>{{$store.getters.OddorEven}}</p>
- 在组件的js中,通过this.$store来读取state和getters
created(){
console.log(this.$store.state.count)
console.log(this.$store.getters.OddorEven)
}
- 推荐通过计算属性来同步state和getters到组件中,再绑定到HTML模版
<p>{{count}} </p>
<p>{{OddorEven}}</p>
computed:{
count(){
return this.$store.state.count
},
OddorEven(){
return this.$store.getters.OddorEven
}
}
- 不可对state和getters进行赋值
this.$store.state.count = 100 //不支持
5.mutations的定义和调用
- vuex中的state数据涉及多个组件,为了方便管理这些公共数据,它希望通过方法调用的形式来修改这些数据,而不是直接赋值修改(毕竟方法名比直接赋值更加直观,更能表现代码意图),所以就有了mutations
- mutations就是这些方法的集合,里面可定义多个方法,专门修改state的数值,参数一固定为state,参数二是方法调用时的传参,如果要传递多个参数,可将其封装成一个对象
//定义mutations
const mutations = {
INCREMENT (state) {
state.count++
},
CHANGEMSG(state,val){
// 函数的第一个参数永远是state,便于读取state
// 自定义传递的参数是第二个,可以省略
state.msg = val
}
}
- vue组件中通过$store.commit()方法来调用mutations中定义的方法
methods: {
test() {
// 触发vuex里面mutations的相关方法 'INCREMENT'
this.$store.commit('INCREMENT')
// 传递参数
this.$store.commit('CHANGEMSG','msg改变了')
}
}
6.actions的定义和调用
- 前面的mutations中,它只负责单纯的修改state数据,而我们修改数据的时候直接往往还要进行其他逻辑处理,所以就有了actions
- actions是众多方法的集合,通过它进行逻辑处理后,再调用mutations中的方法修改state的数据
- actions中的方法有参数一是固定的{commit,state},自定义参数为参数二
const actions = {
incrementFn ({commit,state}) {
if(state.count < 100){
commit('INCREMENT')
}
},
changeMsgFn ({commit,state},newMsg){
// 参数一是固定的
// 第二个参数为传递的参数
setTimeout(() => {
commit('CHANGEMSG',newMsg)
},1000)
}
}
- vue中通过$store.dispatch()方法来调用actions中的方法
//vue组件
methods: {
test() {
// 触发vuex里面actions的相关方法
this.$store.dispatch('incrementFn')
//传递参数
this.$store.dispatch('changeMsgFn','msg改变了')
}
}
7.代码优化 mapState/mapGetters/mapMutations/mapActions
- 一般情况下,可以使用组件的计算属性同步state数据和getters数据,使用methods中的方法来调用mutations和actions中的方法
methods: {
//定义一个调用mutations的方法
incrementFn() {
this.$store.commit('INCREMENT')
},
//定义一个调用actions的方法
changeMsgFn() {
this.$store.dispatch('changeMsgFn')
}
},
computed:{
count(){
return this.$store.state.count
},
OddorEven(){
return this.$store.getters.OddorEven
}
}
- vuex提供一种简写的方式来调用vuex中的state/getters/mutations/actions
(1)引入mapState,mapGetters,mapMutations,mapActions
import {mapState,mapGetters,mapMutations,mapActions} from 'vuex'
// mapState(['count'])返回一个对象 count:function(){}
// 相当于获取store.state.count的值
(2)使用ES6扩展运算符将这个对象的键值对插入到vue计算属性和methods中
//使用数组传参,需要vue和actions的名称一致
computed: {
...mapState(['count']),
...mapGetters(['OddorEven'])
},
methods: {
...mapActions(['increment']),
...mapActions(['incrementIfOdd']),
...mapActions(['incrementAsync'])
}
(3)也可以使用对象形式传参,这种形式可以自定义组件中的方法名称
语法: ...mapGetters({vue名称:'action名称'})
8.配合v-model使用
涉及双向数据绑定要使用vue的计算属性设置get方法和set方法
(1)在get方法中使用$store.state读取状态数据
(2)在set方法中使用$store.commit()修改状态数据
// 组件模版
<input type="text" v-model="msg"></input>
// vue的计算属性
computed: {
msg: {
get(){
return this.$store.state.msg
},
set(val){
this.$store.commit('changeMsg',val)
}
}
}
// store模块
const state = {
msg:''
}
const mutations = {
CHANGEMSG(state,val){
state.msg = val
}
}
Vue.js vuex的更多相关文章
- 一步一步教你用 Vue.js + Vuex 制作专门收藏微信公众号的 app
一步一步教你用 Vue.js + Vuex 制作专门收藏微信公众号的 app 转载 作者:jrainlau 链接:https://segmentfault.com/a/1190000005844155 ...
- [Nuxt] Build a Vue.js Form then use Vuex Actions to Post to an API in Nuxt
The default behavior of submitting an HTML form is to reload the page. You can use the Vue.js @submi ...
- Vue.js组件间通信方式总结
平时在使用Vue框架的业务开发中,组件不仅仅要把模板的内容进行复用,更重要的是组件之间要进行通信.组件之间通信分为三种:父-子:子-父:跨级组件通信.下面,就组件间如何通信做一些总结. 1.父组件到子 ...
- Vue.js 系列教程 4:Vuex
这是关于 JavaScript 框架 Vue.js 五个教程的第四部分.在这一部分,我们会学习使用 Vuex 进行状态管理. 这不是一个完整的指南,而是基础知识的概述,所以你可以了解 Vue.js 以 ...
- vue.js移动端app实战3:从一个购物车入门vuex
什么是vuex? 官方的解释是:Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式.它采用集中式存储管理应用的所有组件的状态,并以相应的规则保证状态以一种可预测的方式发生变化. 简单来说就 ...
- Vue.js 2.x笔记:状态管理Vuex(7)
1. Vuex简介与安装 1.1 Vuex简介 Vuex是为vue.js应用程序开发的状态管理模式,解决的问题: ◊ 组件之间的传参,多层嵌套组件之间的传参以及各组件之间耦合度过高问题 ◊ 不同状态中 ...
- Vue.js——快速入门Vuex
一. 什么是Vuex? Vuex是一个专门为Vue.js应用程序开发的状态管理模式, 它采用集中式存储管理所有组件的公共状态, 并以相应的规则保证状态以一种可预测的方式发生变化. 上图中绿色虚线包裹起 ...
- 基于Vue.js 2.0 + Vuex打造微信项目
一.项目简介 基于Vue + Vuex + Vue-router + Webpack 2.0打造微信界面,实现了微信聊天.搜索.点赞.通讯录(快速导航).个人中心.模拟对话.朋友圈.设置等功能. 二. ...
- [译]Managing Vue.js State with Vuex
原文 准备 安装 Vuex, 是Vue官方出的package, 它不是Vue内置的.需要另外安装. npm install vuex --save 然后,需要在应用启动文件启用Vuex. main.j ...
- vue.js和vue-router和vuex快速上手知识
vue.js和vue-router和vuex快速上手知识 一直以来,认为vue相比react而言,学习成本会更低,会更简单,但最近真正接触后,发现vue的各方面都有做一些客户化的优化,有一些亮点,但也 ...
随机推荐
- JS实现树形结构数据的模糊搜索查询
简单示例: 需求:输入 "题2" 字,希望树形结构中带有 "题2" 字的项显示,即使父节点没有,但子节点含有,父节点仍要返回. let arr = [ { ti ...
- Node.js开发博客项目笔记-初始化路由(博客列表、新增、更新、删除、详情、登录)(3)
工程目录 如图所示,工程目录如下: 我们在工程下新建src的目录,src目录下新建三个文件夹: controller:交互数据放到该目录下: model:model类放到该目录下: router:路由 ...
- 【笔记】node常用方法(持续更新)
1.path.basename(path[, ext]) path <string> ext <string> 可选的文件扩展名. 返回: <string> pat ...
- HTML & CSS – dir, direction, writing-mode, ltr (left to rigth), rtl (right to left)
前言 世界上有很多语言的阅读方向是不同的. 英文 中文 (以前才有竖排文字, 现在中文和英语一样了) 阿拉伯文 (Arabic) 面对不同的语言, HTML 和 CSS 就需要不同的写法. 虽然我没有 ...
- html4,5 basic
更新: 2021-06-15 游览器 href 和 base href 绝对路径和相对路径 在没有 base href 的情况下 href="/about.html" 就是从 do ...
- CSS – Media Query
前言 Media Query 是用来做 RWD 的, 类似 JS 的 if else. 写的多有伤管理, 所以要谨慎使用哦. 参考: Learn CSS Media Query In 7 Minute ...
- dfs 油滴拓展——洛谷p1378
油滴扩展 题目描述 在一个长方形框子里,最多有 \(N\) 个相异的点,在其中任何一个点上放一个很小的油滴,那么这个油滴会一直扩展,直到接触到其他油滴或者框子的边界.必须等一个油滴扩展完毕才能放置下一 ...
- Vue 文件流预览 PDF
Vue js // pdf 预览 export function download(id) { return request({ url: '/bbs/regtech/law/download?id= ...
- 【赵渝强老师】史上最详细的PostgreSQL体系架构介绍
PostgreSQL是最像Oracle的开源数据库,我们可以拿Oracle来比较学习它的体系结构,比较容易理解.PostgreSQL的主要结构如下: 一.存储结构 PG数据存储结构分为:逻辑存储结构和 ...
- Web前端技术丛书代码下载
我是清华社编辑,这些下载资源供读者个人学习使用,禁止商用. IE/Chrome下载,或者微信扫描二维码,按提示发邮箱下载. 二维码用微信扫码,可填写邮箱,把链接转发邮箱下载. <微信小程序开发从 ...