《Vue.js项目实战》

Vuex

集中式的状态管理

  • Vuex从Flux(由Facebook开发)的概念中获取得灵感。Flux又一系列指导原则构成,阐明了如何使用集中式store来实现组件之间的单向数据流。
  • Vuex的核心元素是store,是进行数据存储和数据处理的主要架构。

    store包含如下信息:
state            // 存储应用状态的响应式数据对象
getter // 等价于store的计算属性
mutation // 用来改变应用状态的函数
action // 通常用来调用异步API的函数,然后使用mutation改变数据

Vuex store

1.安装vuex

npm i -S vuex

然后新建store文件夹,并创建index.js来安装Vuex插件:

import Vue from 'vue'
import Vuex from 'vuex' Vue.use(Vuex)

2.使用Vuex.Store构造函数创建store:

const store = new Vuex.Store({
// TODO 选项
})

3.导出store:

export default store

4.在main.js文件中,导入store:

import store from './store'

5.为了让store在应用中生效,我们还需要像注入路由器一样注入它:

const app = new Vue({
router,
store,
el: '#app',
...App,
})

state是唯一数据源

state是store的主要组成部分,它展示了应用中组件的所有共享数据。

  • state是共享数据的唯一数据源
  • state是只读的

    (1)在store选项中添加state函数,该函数返回一个对象:
const store = new Vuex.Store({
state () {
return {
user: null
}
},
})

(2)在组件中读取状态:

this.$store.state.user

使用mutation修改状态

  • mutation是修改state的唯一方式
  • mutation接受state作为第一个参数,同时接受一个可选的载荷(payload)参数,以此来更新state
  • 不应该在mutation中使用异步操作
  • 严格模式:避免在mutation中使用异步函数strict: true
  • 不要在生产环境下启用严格模式,以免影响性能strict: process.env.NODE_ENV !== 'production'

    (1)添加一个mutation:
const store = new Vuex.Store({
state () { /* ... */ },
mutations: {
user: (state, user) => {
state.user = user
}
}
})

(2)表明调用mutation的用词是submit,在组件中:

this.$store.commit('user', userData)

使用getter计算和返回数据

(1)创建一个getter:

const store = new Vuex.Store({
// ...
getter: {
user: state => state.user,
}
})

(2)在组件中,可以用这个getter代替之前直接获取状态的方法:

this.$store.getter.user // this.$store.state.user

使用action操作store

  • action不仅可以提交mutation,还能做异步操作
  • action的声明由一个类型和一个处理函数构成store.dispath('action-type', payloadObject)
  • action的处理函数接收两个参数:

    1.context

    2.payload

    (1)创建action:
actions: {
login ({ commit }) {
const userData = {
profile: {
displayName: 'Mr Cat',
},
}
commit('user', userData)
},
// ...
},

(2)在组件中使用:

this.$store.dispatch('login')

辅助函数

Vuex提供了一系列辅助函数供添加state、getter、mutation以及action。出于将组建中的状态和逻辑分离的考虑,我们只应该在组件中使用getter和action,所以只会用到mapGetters和mapActions。

辅助函数的参数可以是:

1.类型的数组,其中的每一个元素对应于组件中的同名数据

2.对象,其中的键是组件中数据的别名,值则是类型

数组语法例如:

mapGetters(['a', 'b'])
// 等价于
{
a () { return this.$store.getters.a },
b () { return this.$store.getters.b },
}

对象语法例如:

mapGetters({ x: 'a', y: 'b' })
// 等价于
{
x () { return this.$store.getters.a },
y () { return this.$store.getters.b },
}

(1)在组件中导入:

import { mapGetters, mapActions } from 'vuex'

(2)然后将组件修改为:


export default {
computed: {
...mapGetters([
'user',
'userPicture',
]),
}, methods: {
...mapActions({
centerOnUser: 'login',
logout: 'logout'
}),
}, }

Vuex模块

创建两个模块:

  • maps
  • posts

    (1)在store文件夹中新建一个maps.js文件。它导出一个默认模块定义,其中包括地图的state:
export default {
namespaced: true, state () {
return {
center: {
lat: 48.8538302,
lng: 2.2982161,
}
}
} }

(2)将模块添加到store中,在store/index.js文件中添加modules选项:

import maps from './maps'

const store = new Vuex.Store({
// ...
modules: {
maps,
}
})

默认情况下,模块中getter、mutation、action的状态也会成为这个模块的状态。这里它是store.state.maps。

带命名空间的模块

上面的namespaced选项告诉Vuex在该模块的所有getter、mutation、action前添加maps/命名空间,还会在这个模块内的commit和dispatch调用中添加它们。

// getter模块
getters: {
center: state => state.center,
}

maps/center getter 会被添加到store中。使用时可以这么写:

1.getters

this.$store.getters['maps/center']

2.使用getter辅助函数:

mapGetters({
center: 'maps/center',
})

3.可以指定命名空间:

mapGetters('maps', [
'center'
])

4.使用createNamespacedHelpers方法生成基于某个命名空间的辅助函数:

import { createNamespacedHelpers } from vuex
import { mapGetters } = createNamespacedHelpers('maps') export default {
computed: mapGetters([
'center',
])
}

访问全局元素

1.在getter中

你可以在命名空间模块的getter中访问到根状态和根getter(即所有的getter):

someGetter: (state, getters, rootState, rootGetters) => { /* ... */}

2.在action中

你可以访问到上下文的rootGetters,还可以在commit和dispatch调用中使用{ root: true }选项:

myAction({ dispatch, commit, getters, rootGetters }) {
getters.a // store.getters['maps/a']
rootGetters.a // store.getters['a']
commit('someMutation') // 'maps/someMutation'
commit('someMutation', null, { root: true }) // 'someMutation'
dispatch('someAction') // 'maps/someAction'
dispatch('someAction', null, { root: true }) // 'someAction'
}

Vue入门笔记三(Vuex)的更多相关文章

  1. VUE 入门笔记

    前端的MVVM概念今年来也算是如火如荼,了解完 MVVM的概念,也该找个去尝试下 首先我先试了下 国内小而美的 VUE 试着照着文档敲出入门文件,内容都在注释里 <!doctype html&g ...

  2. OpenGLES入门笔记三

    在入门笔记一中比较详细的介绍了顶点着色器和片面着色器. 在入门笔记二中讲解了简单的创建OpenGL场景流程的实现,但是如果在场景中渲染任何一种几何图形,还是需要入门笔记一中的知识:Vertex Sha ...

  3. Vue学习笔记三:v-bind,v-on的使用

    目录 v-bind:绑定属性值,内容相当于js,缩写: v-on:绑定方法,缩写@ 总结 v-bind:绑定属性值,内容相当于js,缩写: 我添加了一个input标签,如下 <input typ ...

  4. vue学习笔记(三)class和style绑定

    前言 通过上一章的学习vue学习笔记(二)vue的生命周期和钩子函数,我们已经更近一步的知道了关于vue的一些知识,本篇博客将进一步探讨vue其它方面的内容,vue中关于class和style绑定,关 ...

  5. 后端小白的VUE入门笔记, 前端高能慎入

    因为项目需要前后端分离,后端竟然不用控制view层了,页面的跳转后端不再干涉,(前端的vue经过打包后成了一张index.html) 后端只需要响应给前端json串就ok,其实这不是爽歪歪?但是觉得还 ...

  6. 后端小白的VUE入门笔记, 进阶篇

    使用 vue-cli( 脚手架) 搭建项目 基于vue-cli 创建一个模板项目 通过 npm root -g 可以查看vue全局安装目录,进而知道自己有没有安装vue-cli 如果没有安装的话,使用 ...

  7. Vue入门笔记#过渡

    Vue过渡,可以在元素从DOM中移除,插入时自动调用过渡效果.根据设定,会适时的触发过渡效果. 在使用的目标标签里添加 transition: <div transition="my_ ...

  8. Vue入门笔记(一)--基础部分

    github地址:https://github.com/iTao9354/basicVue(demo01-28) 一.初识Vue 使用双大括号{{message}}将数据渲染进DOM中.      可 ...

  9. 【Vue学习笔记】—— vuex的语法 { }

    学习笔记 作者:o_Ming vuex Vuex ++ state ++ (用于存储全局数据) 组件访问 state 中的全局数据的方式1: this.$store.state.全局数据 组件访问 s ...

  10. Vue入门笔记#数据绑定语法

    #数据绑定语法# #文本: 数据绑定的基础表型形式,使用“Mustache”语法(双大括号)(特意查了一下Mustache同“moustache”释义为:髭:上唇的胡子,小胡子,最起码我觉得挺形象的) ...

随机推荐

  1. E4X已经被废弃,各浏览器基本上不再支持它;

    E4X是一种在ECMAScript标准的基础上加入的动态XML支持的程序语言扩展. 到2019年,目前主流浏览器已经不太支持它了,一些版本的Firefox浏览器或许还可以使用,但它已经在主流浏览器的主 ...

  2. 【认知服务 Azure Cognitive Service】使用Azure Search中Create an Demo的示例时,出现空白页面的问题

    问题描述 在根据Azure 认知服务的Search功能文档创建示例时(快速入门:在门户中创建演示应用(Azure 认知搜索)).完全相同的步骤,在中国区创建后下载Demo,查询结果一片空白:如下: 而 ...

  3. 【Azure 事件中心】向Event Hub发送数据异常 : partitionId[null]: Sending messages timed out

    问题描述 在使用Java 代码向 Azure Event Hub发送数据时,先后遇见了如下两种异常消息: 1)ERROR c.t.d.h.s.source.EventHubLogConsumer - ...

  4. window.open代理劫持

    window.open = new Proxy(window.open, { apply(target, ctx, args) { if (hasAuth(args[0])) { return tar ...

  5. Sagas论文原文读后总结

    一.引子 分布式事务组件seata最近社区很活跃,刚好公司有对接seata的计划.刚好借此机会,彻底了解下seata的价值.其中有一个比较特殊的模式叫SAGA模式,听起来就很懵逼,按照官网的介绍起源于 ...

  6. 添加 alt + d 打开 dicts.cn 网址

    代码 autohotkey 代码 限制在双核浏览器 内部使用 #IfWinActive ahk_exe ChromeCore.exe !d:: Run, http://www.dicts.cn/ Re ...

  7. obs 屏幕录像 1. 屏幕放大缩小 2. 圆形摄像头

    obs 屏幕录像 1. 屏幕放大缩小 2. 圆形摄像头 屏幕放大缩小 windows 放大镜 屏幕放大快捷键 win + '+' 是放大屏幕 win + '-' 是缩小屏幕 因为obs不支持缩放功能, ...

  8. finger 单词学习 词源通 five (penkwe)

    印欧语penkwe - finger p通f 元音i通e 或者说从e降级到i (aeiou) n保持不变 k通g we 怎么转的 er 我也不知道,不嫌麻烦就是 w -> m -> n - ...

  9. pdfz Vue-3-Cheat-Sheet-zh 官方要是能下载下来,我也就不放这里了。 VUE3 composition API cheat sheet

    https://files.cnblogs.com/files/pengchenggang/Vue-3-Cheat-Sheet-zh.zip 官方下载地址:https://www.vuemastery ...

  10. 关于Sql server数据类型HierarchyID 数据类型用法和递归显示完整路径

    SQL Server 2008版本之后的新类型HierarchyID 不知道大家有没有了解, 该类型作为取代id, parentid的一种解决方案,让人非常惊喜. 官方给的案例浅显易懂,但是没有实现我 ...