Vue技术点整理-Vuex
什么是Vuex?
1,Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式。它采用集中式存储管理应用的所有组件的状态,并以相应的规则保证状态以一种可预测的方式发生变化
2,每一个 Vuex 应用的核心就是 store(仓库)。“store”基本上就是一个容器,它包含着你的应用中大部分的状态 (state)
3,其实也就是,应用中各个组件之间共享状态的一个状态库,并可以时时映射到视图
什么时候用的到Vuex?
1,如果你需要构建一个大中型应用的时候,会使用到很多组件嵌套,很多业务处理,此时需要是用Vuex更好地在组件外部管理所有的状态。
2,如果你需要构建的应用是轻量的,则完全没有必要引入Vuex,使用简单的 store 模式 或者组件之间的传递方式即可实现功能。
一,vue cli中简单使用Vuex示例
1,state用法
注:main.js为定义store的代码,后面为接收state的几种方式
- main.js
import Vue from 'vue'
import Vuex from 'vuex'
import App from './App.vue'
import router from './router/'
Vue.use(Vuex)
const store = new Vuex.Store({
namespaced: false,
state: {
title: '标题',
backFlag: false
},
mutations: {
updateTitle (state, title) {
state.title = title
},
updateBackFlag (state, backFlag) {
state.backFlag = backFlag
}
}
})
Vue.config.productionTip = false
new Vue({
router,
store,
render: h => h(App)
}).$mount('#app')
- 适合获取状态个数少的时候
<template>
{{title}}
{{backFlag}}
</template> <script>
export default {
name: "第一种接收方式",
computed: {
title () {
return this.$store.state.title;
},
backFlag () {
return this.$store.state.backFlag;
}
}
}
</script>
- 适合多个状态的时候
<template>
{{title}}
{{backFlag}}
</template> <script>
import { mapState } from 'vuex'
export default {
name: "第二种接收方式",
computed: mapState({
//'title',//此种方式也可以获取状态
title: state => state.title,
backFlag: state => state.backFlag
})
}
</script>
- 适合与局部计算属性混合使用的时候
<template>
{{title}}
{{backFlag}}
</template> <script>
import { mapState } from 'vuex'
export default {
name: "第三种接收方式",
...mapState({
title: state => state.title,
backFlag: state => state.backFlag
})
}
</script>
2,Getter用法
注:Getter适用于状态库里面的数据需要进行一遍过滤,或者状态值需要依赖其他状态进行一定计算,此时可以使用Getter方法,进行计算并返回
- 定义getter代码:
const store = new Vuex.Store({
namespaced: false,
state: {
todos: [
{ id: 1, text: '第一条', done: false },
{ id: 2, text: '第二条', done: false },
{ id: 3, text: '第三条', done: true }
]
},
mutations: {
updateTodos (state, todos) {
state.todos = todos
}
},
getters: {
//根据id值,查询todos状态库里的值
getTodoById: (state) => (id) => {
return state.todos.find(todo => todo.id === id)
},
//查询todos状态库里done为true的值
doneTodos: state => {
return state.todos.filter(todo => todo.done)
}
}
})
- 接收getter代码:
<template>
<div>{{doneTodos}}</div>
</template>
<script>
import { mapState,mapGetters } from 'vuex'
export default {
name: "test",
computed: {
//自动查询doneTodos,为赋值为doneTodos
...mapGetters({
doneTodos: 'doneTodos'
})
},
mounted:function() {
//查询todos状态库里done为true的值
console.info(this.$store.getters.doneTodos)
//查询todos状态库里done为true的值
console.info(this.$store.getters.getTodoById(2))
}
};
</script>
<style lang="less">
</style>
3,Mutation用法
注:更改 Vuex 的 store 中的状态的唯一方法是提交 mutation,直接改变状态,但Mutation必须是同步函数,如需要使用调用api等异步操作,请使用4 actions
- 定义Mutation代码
const store = new Vuex.Store({
namespaced: false,
state: {
title: '标题',
backFlag: false
},
mutations: {
updateTitle (state, title) {
state.title = title
},
updateBackFlag (state, backFlag) {
state.backFlag = backFlag
}
}
})
- 调用接收Mutation代码
<template>
<div>{{title}}</div>
</template>
<script>
import { mapState,mapMutations } from 'vuex'
export default {
name: "test",
computed: {
//自动赋值title值
...mapState({
title: state => state.title,
})
},
mounted:function() {
//第一种方法 动态更新title内容
this.$store.commit('updateTitle',"腾讯_首页") //第二种方法 动态更新title内容
this.updateTitle('阿里_首页')
},
methods: {
// 将 `this.add()` 映射为 `this.$store.commit('navbar/updateTitle')`
...mapMutations({
updateTitle: 'updateTitle'
})
}
};
</script>
<style lang="less">
</style>
4,Action的用法
注:Action 类似于 mutation,不同在于:
- Action 提交的是 mutation,而不是直接变更状态。
- Action 可以包含任意异步操作,可以使用promise、await等处理异步调用
- 定义Action
import HttpService from '../../service/httpService.js';
const store = new Vuex.Store({
namespaced: false,
state: {
title: '标题',
backFlag: false
},
mutations: {
updateTitle (state, title) {
state.title = title
},
updateBackFlag (state, backFlag) {
state.backFlag = backFlag
}
},
actions: {
updateTitleAsync (context,obj) {
return new Promise((resolve, reject) => {
let channelId = '001'
HttpService.queryGoods(channelId)
.then(data => {
context.commit('updateTitle',obj.title)
resolve()
})
.catch(error => {
console.info(error);
});
})
}
}
})
- 接收action代码
<template>
<div>{{title}}</div>
</template>
<script>
import { mapState,mapMutations,mapActions } from 'vuex'
export default {
name: "test",
//自动赋值title值
...mapState({
title: state => state.title,
})
},
mounted:function() {
// this.updateTitleAsync("异步赋值,不关心返回值")
this.updateTitleAsync({
title: "异步赋值,切需立即使用返回值"
}).then(() => {
//console.info(context.backFlag)
console.info(this.$store.state.title)
})
},
methods: {
// 将 `this.updateTitleAsync()` 映射为
`this.$store.dispatch('increment')`
...mapActions({
updateTitleAsync: 'updateTitleAsync'
})
}
};
</script>
<style lang="less">
</style>
5,Module的用法
注:当应用比较复杂时,状态比较多并难管理时,Vuex 允许我们将 store 分割成模块(module)
- 创建module模块
const store new Vuex.Store({
modules: {
//navbar模块:
navbar: {
namespaced: true,
state: {
title: '默认值',
backFlag: false
},
mutations: {
updateTitle (state, title) {
state.title = title
},
updateBackFlag (state, backFlag) {
state.backFlag = backFlag
}
}
}
}
})
- 如何接收使用模块值,参考如下,加上模块名称即可
<template>
<div>{{title}}</div>
</template>
<script>
import { mapState,mapMutations } from 'vuex'
export default {
name: "test",
computed: {
//自动赋值title值
...mapState({
title: state => state.navbar.title,
})
},
mounted:function() {
//第一种方法 动态更新title内容
this.$store.commit('navbar/updateTitle',"腾讯_首页") //第二种方法 动态更新title内容
this.updateTitle('阿里_首页')
},
methods: {
// 将 `this.add()` 映射为 `this.$store.commit('navbar/updateTitle')`
...mapMutations({
updateTitle: 'navbar/updateTitle'
})
}
};
</script>
<style lang="less">
</style>
GitHub示例地址 vue-ht-cli
Vue技术点整理-Vuex的更多相关文章
- Vue技术点整理-前言
前言 Vue版本说明:本文档编写时,Vue稳定版本为 2.6.10 本文档编写目的为:整理Vue相关生态的技术点.和开发中经常使用到的技术点,让开发者快速上手开发,提升开发效率 一,Vue开发工具:本 ...
- Vue技术点整理-Vue CLI安装详解
一,脚手架安装 Node 版本要求 Vue CLI 需要 Node.js +).你可以使用 nvm 或 nvm-windows 在同一台电脑中管理多个 Node 版本. 1,全局安装Vue CLI ...
- Vue技术点整理-Vue Router
路由 Vue Router 对于单页面应用来说,如果涉及到多个页面的话,就必须要使用到路由,一般使用官方支持的 vue-router 库 一,Vue Router 在项目中的安装引用 1,在页面中使用 ...
- Vue技术点整理-Vue CLI
Vue CLI 是一个基于 Vue.js 进行项目快速开发的脚手架 注:具体安装步骤可参考Vue CLI,默认安装的脚手架,是没有service.util等工具类的,以下主要描述如何在脚手架的基础上进 ...
- Vue技术点整理 vue-devtools
注:默认浏览器调试工具,在调试vue的页面时,是不能看到vue项目的属性状态值的,所以最好是在浏览器上安装 vue-devtools,这样就可以在浏览器里面审查和调试vue的应用了 1,Chrome浏 ...
- Vue技术点整理-安装引入
Vue (读音 /vjuː/,类似于 view) 是一套用于构建用户界面的渐进式框架 所谓渐进式是指: 1,如果你有一个现成的web应用,你可以将vue作为该应用的一部分嵌入其中,带来更丰富的交互体验 ...
- Vue技术点整理-指令
我们通常给一个元素添加 v-if / v-show 来做权限管理,但如果判断条件繁琐且多个地方需要判断,这种方式的代码不仅不优雅而且冗余. 针对这种情况,我们可以通过全局自定义指令来处理:我们先在新建 ...
- Vue技术点整理-vue.config.js
1,proxy代理解决本地开发环境跨域问题 配置proxy代理后,proxy会将任何未知请求 (没有匹配到静态文件的请求) 代理到 https://192.168.3.49:8080 vue.conf ...
- [转] Web前端开发工程师常用技术网站整理
1.常用工具相关 有道云笔记 http://note.youdao.com/signIn/index.html 36镇-最好用的共享收藏夹 http://www.36zhen.com/ 浏览器同步测试 ...
随机推荐
- Linux USB子系统(一)—— USB设备基础概念
一.基础概念 在终端用户看来,USB设备为主机提供了多种多样的附加功能,如文件传输,声音播放等,但对USB主机来说,它与所有USB设备的接口都是一致的.一个USB设备由3个功能模块组成:USB总线接口 ...
- Android驱动学习-APP操作新硬件的两种方法(支持添加的驱动)
在给Android添加新的驱动后,app要如何使用呢? 正常的使用一个设备,需要getService.但是像LED等我们自己添加的硬件驱动,Android源代码根本没有我们自己添加的服务. 第一种: ...
- MongoDB用户权限操作语法及示例
1.创建用户 1.1.语法格式: 1.1.1.格式及例子 >db.createUser( { user: "<name>", pwd: "<cle ...
- log4j2文件结构
标签结构 Configuration properties Appenders Console PatternLayout File RollingRandomAccessFile Filters T ...
- 循序渐进VUE+Element 前端应用开发(33)--- 邮件参数配置和模板邮件发送处理
在系统处理中,有时候需要发送邮件通知用户,如新增用户的邮件确认,密码找回,以及常规订阅消息.通知等内容处理,都可以通过邮件的方式进行处理.本篇随笔介绍结合VUE+Element 前端,实现系统的邮件参 ...
- sql删除重复数据思路
总的思路就是先找出表中重复数据中的一条数据,插入临时表中,删除所有的重复数据,然后再将临时表中的数据插入表中.所以重点是如何找出重复数据中的一条数据,有三种情况 1.重复数据完全一样,使用distin ...
- 容器编排系统K8s之节点污点和pod容忍度
前文我们了解了k8s上的kube-scheduler的工作方式,以及pod调度策略的定义:回顾请参考:https://www.cnblogs.com/qiuhom-1874/p/14243312.ht ...
- [每日一题]面试官问:谈谈你对ES6的proxy的理解?
[每日一题]面试官问:谈谈你对ES6的proxy的理解? 关注「松宝写代码」,精选好文,每日一题 作者:saucxs | songEagle 一.前言 2020.12.23 日刚立的 flag,每日一 ...
- centos7 在虚拟机中装好后的网络连接问题
1.首先设置网卡连接方式:点"设置",在弹出的界面中点"网络",最后选择"连接方式"为"桥接网卡" 2.用Vim编辑器打 ...
- 浅谈JVM垃圾回收
JVM内存区域 要想搞懂啊垃圾回收机制,首先就要知道垃圾回收主要回收的是哪些数据,这些数据主要在哪一块区域. Java8和Java8之前的相同点有很多. 都有虚拟机栈,本地方法栈,程序计数器,这三个是 ...