vue全家桶-vuex深入讲解
目录
- 使用
- index.js
- getters.js
- system.js
- 全局使用:main.js文件中
- Vuex概述
- Vuex中的核心特性
- A.State
- this.$store.state.全局数据名称-组件访问State中的数据的第一种方式
- 组件访问State中的数据的第二种方式:按需导入
- B.Mutation
- this.$store.commit是触发Mutation的第一种方式
- 触发Mutation的第二种方式,按需导入
- C.Action
- this.$store.dispatch()是触发actions的第一种方式
- 触发actions的第二种方式:按需导入
- D.Getter
- 使用getters的第一种方式
- 使用getters的第二种方式
- 代码总结
使用
index.js
import Vue From 'vue'import Vuex from 'vuex'import getters from './getters'import app from './modules/app'import settings from './modules/settings'import user from './modules/user'import System from './modules/system'Vue.use(Vuex)const Store = new Vuex.Store({
modules: {
app, settings, user, system }
, getters}
)export default storegetters.js
const getters = {
sidebar: state =>
state.app.sidebar, device: state =>
state.app.device, token: state =>
state.user.token, avatar: state =>
state.user.avatar, name: state =>
state.user.name, currentuserinfo: state =>
state.system.currentuserinfo, count: state =>
state.system.count,}
export default getterssystem.js
const system = {
namespaced: true, state: {
currentuserinfo: {
}
, count: 0, }
, mutations: {
SET_CURRENTUSERINFO: (state, currentuserinfo) =>
{
state.currentuserinfo = currentuserinfo }
, SET_COUNT: (state, count) =>
{
state.count = count }
, }
}
export default system全局使用:main.js文件中
import store from './store'new Vue({
el: '#app', router, store, render: h =>
h(App)}
)Vuex概述
Vuex是实现组件全局状态(数据)管理的一种机制,可以方便的实现组件之间的数据共享
使用Vuex管理数据的好处:
A.能够在vuex中集中管理共享的数据,便于开发和后期进行维护
B.能够高效的实现组件之间的数据共享,提高开发效率
C.存储在vuex中的数据是响应式的,当数据发生改变时,页面中的数据也会同步更新
Vuex中的核心特性
vuex中的主要核心概念如下:
- State
- Mutation
- Action
- Getter
A.State
State提供唯一的公共数据源,所有共享的数据都要统一放到Store中的State中存储例如,打开项目中的store.js文件,在State对象中可以添加我们要共享的数据,如:count:0
在组件中访问State的方式:1).this.$store.state.全局数据名称 如:this.$store.state.count2).先按需导入mapState函数: import {
mapState }
from 'vuex'然后数据映射为计算属性: computed:{
...mapState(['全局数据名称']) }
this.$store.state.全局数据名称-组件访问State中的数据的第一种方式
//访问console.LOG("1111",this.$store.state.system.count);
h3>
当前最新的count值为:{
{
$store.state.system.count}
}
/h3>
组件访问State中的数据的第二种方式:按需导入
2).先按需导入mapState函数: import {
mapState }
from 'vuex' //将全局数据,用展开运算符映射为当前组件的计算属性 // 然后数据映射为计算属性: computed:{
...mapState(['count']) }
mapState()可以传入对象或者数组 传入数组用法: mapState(['counte', 'name','age'])// 传入对象用法:可以重命名store中的数据 ...mapState({
sCounter: state =>
state.name, ...... }
) computed:{
...mapState({
count: state =>
state.system.count, ...... }
), }
B.Mutation
Mutation用于修改变更$store中的数据
只能通过Mutation变更Store数据,不可以直接操作Store中的数据通过这种方式虽然操作起来稍微繁琐点,但是可以集中监控所有的数据变化
this.$store.COMmIT是触发Mutation的第一种方式
1.定义:
const system = {
namespaced: true, state: {
count: 0, }
, mutations: {
add(state) {
//变更状态 state.count++ }
}
}
export default system2.使用
template>
div>
h3>
当前最新的count值为:{
{
$store.state.system.count}
}
/h3>
el-button tyPE="Primary" @click="BTnHandler1">
+1/el-button>
/div>
/template>
script>
export default {
name: 'Addition', PRops: {
}
, data() {
return {
}
}
, computed: {
}
, mounted() {
}
, methods: {
btnHandler1() {
this.$store.commit("system/add") }
, }
}
/script>
style scoped>
/style>
1.传参—定义
mutations: {
add(state) {
state.count++ }
, addN(state, step) {
state.count += step }
}
2.传参-使用
methods: {
btnHandler1() {
this.$store.commit("system/add") }
, btnHandler2(val){
// commit 的作用就是调用某个mutation函数 this.$store.commit("system/addN",val) }
, }
触发Mutation的第二种方式,按需导入
从vuex中按需导入mapMutations 函数
import {
mapMutations }
from 'vuex'通过刚才导入的mapMutations 函数,将需要的mapMutations 函数,映射为当前组件的methods方法:
sub(state) {
state.count--}
,subN(state, step) {
state.count -= step}
,method:{
...mapMutations({
sub: 'system/sub' }
), btnHandler1(){
this.sub()//直接引用 }
, btnHandler2(val){
this.subN(val) }
,}
C.Action
Action用于处理异步任务
如果通过异步操作变更数据,必须通过Action,而不能使用Mutation,但Action中还是要通过出发Mutation的方式间接变更数据
this.$store.dispatch()是触发actions的第一种方式
actions: {
addAsync(content) {
setTimeout(() =>
{
// 在actions中,不能直接修改state中的数据 // 必须通过content.commit() 去触发某个mutations才行 content.commit('add') }
, 1000) }
}
methods: {
// 异步的让count自增+1 btnHandler3(){
// 这里的dispatch函数,专门用来触发actions this.$store.dispatch('system/addAsync') }
, }
actions携带参数
触发actions异步任务时携带参数
actions: {
addNAsync(content, step) {
setTimeout(() =>
{
// 在actions中,不能直接修改state中的数据 // 必须通过content.commit() 去触发某个mutations才行 content.commit('addN', step) }
, 1000) }
, }
methods: {
btnHandler4(){
// 这里的dispatch函数,专门用来触发actions,传参 this.$store.dispatch('system/addNAsync',3) }
, }
触发actions的第二种方式:按需导入
actions: {
subAsync(content) {
setTimeout(() =>
{
// 在actions中,不能直接修改state中的数据 // 必须通过content.commit() 去触发某个mutations才行 content.commit('sub') }
, 1000) }
, subNAsync(content, step) {
setTimeout(() =>
{
// 在actions中,不能直接修改state中的数据 // 必须通过content.commit() 去触发某个mutations才行 content.commit('subN', step) }
, 1000) }
,}
import {
mapActions }
from 'vuex' methods:{
...mapActions({
subAsync: 'system/subAsync', subNAsync: 'system/subNAsync', }
), btnHandler3(){
this.subAsync() }
, btnHandler4(){
this.subNAsync(3) }
, }
D.Getter
Getter用于对Store中的数据进行加工处理形成新的数据
它只会包装Store中保存的数据,并不会修改Store中保存的数据,当Store中的数据发生变化时,Getter生成的内容也会随之变化
打开store.js文件,添加getters,如下:
使用getters的第一种方式
//system.js文件中的 getters中的showNumh3>
{
{
$store.getters['system/showNum']}
}
/h3>
console.log('$store.state',this.$store.getters['system/showNum']);
使用getters的第二种方式
h3>
{
{
showNum}
}
/h3>
computed: {
...mapGetters({
showNum: 'system/showNum', }
) }
,代码总结
system.js
const system = {
namespaced: true, state: {
currentuserinfo: {
}
, count: 0, }
, // 只有mutations中定义的函数,才有全力修改state中的数据 mutations: {
// SET_CURRENTUSERINFO: (state, currentuserinfo) =>
{
// state.currentuserinfo = currentuserinfo // }
, // SET_COUNT: (state, count) =>
{
// state.count = count // }
, add(state) {
state.count++ }
, addN(state, step) {
state.count += step }
, sub(state) {
state.count-- }
, subN(state, step) {
state.count -= step }
, }
, actions: {
addAsync(content) {
setTimeout(() =>
{
// 在actions中,不能直接修改state中的数据 // 必须通过content.commit() 去触发某个mutations才行 content.commit('add') }
, 1000) }
, addNAsync(content, step) {
setTimeout(() =>
{
// 在actions中,不能直接修改state中的数据 // 必须通过content.commit() 去触发某个mutations才行 content.commit('addN', step) }
, 1000) }
, subAsync(content) {
setTimeout(() =>
{
// 在actions中,不能直接修改state中的数据 // 必须通过content.commit() 去触发某个mutations才行 content.commit('sub') }
, 1000) }
, subNAsync(content, step) {
setTimeout(() =>
{
// 在actions中,不能直接修改state中的数据 // 必须通过content.commit() 去触发某个mutations才行 content.commit('subN', step) }
, 1000) }
, }
, getters: {
//添加了一个showNum的属性 showNum(state) {
return '最新的count值为:【' + state.count + '】';
}
}
}
export default systemsrc\views\learnvuex\index.vue
template>
div>
my-addition >
/my-addition>
p>
----------------------/p>
my-subtranction >
/my-subtranction>
/div>
/template>
script>
// 导入import Addition from '@/components/Addition';
import Subtranction from '@/components/Subtranction';
// import Subtranction from '../../components/Addition';
export default {
name: 'learnVuex', props: {
}
, // 注册 components: {
'my-addition': Addition, 'my-subtranction': Subtranction }
, data() {
return {
}
}
, computed: {
}
, mounted(){
console.log("1111",this.$store.state.system.count);
}
,}
/script>
style scoped>
/style>
src\components\Addition\index.vue
template>
div>
h3>
当前最新的count值为:{
{
$store.state.system.count}
}
/h3>
h3>
{
{
$store.getters['system/showNum']}
}
/h3>
el-button type="primary" @click="btnHandler1">
+1/el-button>
el-button type="primary" @click="btnHandler2(2)">
+2/el-button>
el-button type="primary" @click="btnHandler2(3)">
+3/el-button>
el-button type="primary" @click="btnHandler3">
+1 Async/el-button>
el-button type="primary" @click="btnHandler4">
+3 Async/el-button>
/div>
/template>
script>
export default {
name: 'Addition', props: {
}
, data() {
return {
}
}
, computed: {
}
, mounted() {
console.log('$store.state',this.$store.getters['system/showNum']);
}
, methods: {
btnHandler1() {
this.$store.commit("system/add") }
, btnHandler2(val){
// commit 的作用就是调用某个mutation函数 this.$store.commit("system/addN",val) }
, // 异步的让count自增+1 btnHandler3(){
// 这里的dispatch函数,专门用来触发actions this.$store.dispatch('system/addAsync') }
, // btnHandler4(){
// 这里的dispatch函数,专门用来触发actions this.$store.dispatch('system/addNAsync',3) }
, }
}
/script>
style scoped>
/style>
\src\components\Subtranction\index.vue
template>
div>
h3>
当前最新的count值为:{
{
count}
}
/h3>
h3>
{
{
showNum}
}
/h3>
el-button type="primary" @click="btnHandler1">
-1/el-button>
el-button type="primary" @click="btnHandler2(2)">
-2/el-button>
el-button type="primary" @click="btnHandler2(3)">
-3/el-button>
el-button type="primary" @click="btnHandler3">
-1 Async/el-button>
el-button type="primary" @click="btnHandler4">
-3 Async/el-button>
/div>
/template>
script>
import {
mapState,mapMutations,mapActions,mapGetters }
from 'vuex'export default {
name: 'Subtranction', props: {
}
, data(){
return{
}
}
, computed: {
...mapState({
count: state =>
state.system.count, }
), ...mapGetters({
showNum: 'system/showNum', }
) }
, mounted(){
console.log("mapState",this.count);
}
, methods:{
...mapMutations({
sub: 'system/sub', subN: 'system/subN', }
), ...mapActions({
subAsync: 'system/subAsync', subNAsync: 'system/subNAsync', }
), btnHandler1(){
this.sub() }
, btnHandler2(val){
this.subN(val) }
, btnHandler3(){
this.subAsync() }
, btnHandler4(){
this.subNAsync(3) }
, }
}
/script>
style scoped>
/style>
以上就是vue全家桶-vuex深入讲解的详细内容,更多关于vue全家桶-vuex的资料请关注其它相关文章!
您可能感兴趣的文章:- Vue全家桶入门基础教程
- Vue全家桶实践项目总结(推荐)
- 一篇Vue、React重点详解大全
- vue项目刷新当前页面的三种方式(重载当前页面数据)
- vue跨窗口通信之新窗口调用父窗口方法实例
- vue通过url方式展示PDF的几种方法
声明:本文内容由网友自发贡献,本站不承担相应法律责任。对本内容有异议或投诉,请联系2913721942#qq.com核实处理,我们将尽快回复您,谢谢合作!
若转载请注明出处: vue全家桶-vuex深入讲解
本文地址: https://pptw.com/jishu/609295.html
