Vue.js——快速入门Vuex
一. 什么是Vuex?Vuex是一个专门为Vue.js应用程序开发的状态管理模式,它采用集中式存储管理所有组件的公共状态,并以相应的规则保证状态以一种可预测的方式发生变化. 上图中绿色虚线包裹起来的部分就是Vuex的核心,?state中保存的就是公共状态,改变state的唯一方式就是通过mutations进行更改. 可能你现在看这张图有点不明白,等经过本文的解释和案例演示,再回来看这张图,相信你会有更好的理解. 二. 为什么要使用Vuex?试想这样的场景,比如一个Vue的根实例下面有一个根组件名为
App.vue ,它下面有两个子组件A.vue 和B.vue ,App.vue 想要与A.vue 或者B.vue 通讯可以通过props传值的方式,但是如果A.vue 和B.vue 之间的通讯就很麻烦了,他们需要共有的父组件通过自定义事件进行实现,A组件想要和B组件通讯往往是这样的:
这只是一条通讯路径,如果父组件下有多个子组件,子组件之间通讯的路径就会变的很繁琐,父组件需要监听大量的事件,还需要负责分发给不同的子组件,很显然这并不是我们想要的组件化的开发体验. 三.如何引入Vuex?
import Vuex from 'vuex'Vue.use( Vuex );
const store = <span style="color: #0000ff">new<span style="color: #000000"> Vuex.Store({<span style="color: #008000">//<span style="color: #008000">待添加 <span style="color: #000000">}) <span style="color: #0000ff">new<span style="color: #000000"> Vue({ 四. Vuex的核心概念?在介绍Vuex的核心概念之前,我使用
vue-cli 初始化了一个demo,准备以代码的形式来说明Vuex的核心概念.这个demo分别有两个组件ProductListOne.vue 和ProductListTwo.vue ,在App.vue 的datat 中保存着共有的商品列表,代码和初始化的效果如下图所示:Product List One
Product List Two
核心概念1: Statestate就是Vuex中的公共的状态,我是将state看作是所有组件的data,用于保存所有组件的公共数据.
import Vue from 'vue''./App.vue''vuex'Vue.use( Vuex )
const store = <span style="color: #0000ff">new<span style="color: #000000"> Vuex.Store({state:{ products: [ {name: '鼠标',price: 80<span style="color: #000000">} ] } }) <span style="color: #0000ff">new<span style="color: #000000"> Vue({ el: '#app'<span style="color: #000000">,render: h =><span style="color: #000000"> h(App) })
export .$store.state.products
export .$store.state.products
此时的页面如下图所示,可以看到,将公共数据抽离出来后,页面没有发生变化. 核心概念2: Getters我将getters属性理解为所有组件的computed属性,也就是计算属性. vuex的官方文档也是说到可以将getter理解为store的计算属性,getters的返回值会根据它的依赖被缓存起来,且只有当它的依赖值发生了改变才会被重新计算。
const store = '鼠标',price: 80
saleProducts: (state) =>= state.products.map( product =>/ 2
export
核心概念3: Mutations我将mutaions理解为store中的methods,
const store = '鼠标',getters:{
saleProducts: (state) =>= state.products.map( product =>/ 2
= state.products.forEach( product =>-=
Product List Two
注意:调用mutaions中回调函数,只能使用store.commit(type,payload)
export .$store.commit('minusPrice',2);
添加按钮,可以发现,Product List Two中的价格减少了2,当然你可以自定义 getters 将价格进行了缓存)
核心概念4: Actions
const store = '鼠标',mutations:{
minusPrice (state,payload ) {
let newPrice = state.products.forEach( product =>-=
=>'minusPrice',payload );
},2000
Product List Two
export .$store.dispatch('minusPriceAsync',5);
添加按钮,Product List Two中的价格延迟2s后减少了5 核心概念5: Modules
const moduleA =const moduleB =<span style="color: #000000"> {
state: { ... },actions: { ... } } const store = <span style="color: #0000ff">new<span style="color: #000000"> Vuex.Store({ store.state.a <span style="color: #008000">//<span style="color: #008000"> -> moduleA 的状态 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |