当前位置: 首页 > article >正文

Vuex的基本使用

介绍

vuex是一个状态管理工具,可以用于组件通信

安装vuex

npm install vuex --save

在src下创建一个目录store,store下创建一个文件index.js,其代码如下

import Vue from 'vue'
import Vuex from 'vuex'

//1.安装插件
Vue.use(Vuex)

//2.创建对象
const store = new Vuex.Store({
    state:{},
    mutations:{},
    ations:{},
    getters:{},
    modules:{}
})
//3.导出store
export default store

之后,在main.js文件中,写上如下代码,我们就可以在别的组件里使用这个vuex了

import Vue from 'vue'
import App from './App'
import store from './store'

Vue.config.productionTip = false

new Vue({
  el: '#app',
  store,
  render: h => h(App)
})
  • state 状态
  • getters 向外暴露方法,用于访问state
  • mutations 只有mutations修改state才是允许的做法
  • actions 异步提交mutations,从而改变state的状态
  • modules 模块

state的使用

在别的组件中,直接通过$store.state.name访问,如在Hello.vue组件中

<template>
	<div id='Hello'>
		{{ $store.state.name }}
	</div>
</template>

因为state中的name经常会被改变,为了符合vue的响应式,我们一般将组件中用到state的值放到computed属性中。

computed: {
    name(){
        return this.$store.state.name
    }
}

辅助函数mapState的使用

computed: {
    ...mapState(["name"]) //效果和下面的等价,映射state的name
    /* name(){
        return this.$store.state.name
    } */
},

getters的使用

getters:{
    getCount(state){
        return state.count
    }
}

在别的组件中,使用如下

<template>
	<div id='hello'>
		<h2>{{$store.getters.getCount}}</h2>
	</div>
</template>

注意getCount虽然是个方法,但是当成属性去使用

这里有一个巧妙的用法。

我么想判断count是否比500大还是小,但是这个500由调用者输入,如下:

xxx.vue组件内容如下

<h2>{{ $store.getters.thanCounter(500) }}</h2>
getters:{
    thanCounter(state){
    	return funtion(userIpt){
    		return  state.counter>userIpt
    	}
    }
}

getters中一般都会有state中的值,所以一般也写在computed属性中,来响应式的渲染数据。

  computed: {
     ...mapGetters(['getCount']) //getterrs的辅助函数
     /* getCount(){
         return this.$store.getters.getCount;
     } */
   }

mutations的使用

在通过mutation更新数据的时候,有可能我们希望携带一些额外的参数,参数被称为是mutation的载荷(Payload)

const store = new Vuex.Store({
    state:{
        name:'hello world',
        counter:1000
    },
    mutations:{
        incrementCounter(state,payload){
            state.counter+=payload
        }    
     }
})

在xxx.vue中使用

<button  @click='incrementCounter(5)'>5</button>
methods:{
    incrementCounter(count){
        this.$store.commit('incrementCount',count)
    }
} 

辅助函数的使用

methods: {
    ...mapMutations(['incrementCounter']),
    /* incrementCounter(num){
        this.$store.commit('incrementCounter', num);
    }, */
},

mutation的类型常量

我们在App.vue里用 this.$store.commit(‘incrementCount’,count) 又在 mutations里写incrementCount,可能在书写incrementCount可能写错。所以官方提供给我们一共类型常量的写法。如下

我们在store目录下创建一个文件叫mutations-types.js文件,内容如下

export const INCREMENTCOUNTER = 'incrementCounter'

然后在App,vue文件中

import {INCREMENTCOUNTER}  from './store/mutations-types.js'

methods:{
    incrementCounter(count){
        this.$store.commit(INCREMENTCOUNTER,count)
    }
} 

然后在store/index.js文件中

import {INCREMENTCOUNTER}  from './store/mutations-types.js'

mutaions:{
    [INCREMENTCOUNTER](state){
        state.counter++
    }
}

这样mutation的名字统一在一个文件中,我们不容易写错,推荐使用这种形式

actions的使用

这里面写的一般都是些异步代码

是用来替代Mutation进行异步操作的

mutations:{
    updateInfo(state,payload){
       state.info.name = payload
    }
 }
actions:{ 
	//context:上下文环境。即指的的store对象
    aupdateInfo(context,payload){
        setTimeout(()=>{
            context.commit('updateInfo',payload) 
        },1000)        
    }
}

在别的组件使用如下

<buttion @click='updateInfo()'></buttton>
methods:{
    updateInfo(){
        this.$store.dispatch('aupdateInfo','我是payload')
    }
}

辅助函数的使用

methods: {
    ...mapActions(['aupdateInfo'])
    /* aupdateInfo(num){
        this.$store.dispatch('aupdateInfo', num);
    } */
},

models的使用

//将数据分为a模块和b模块
modules:{
    a:{ 
    	namespaced:true, //命名空间,开启命名空间后,访问a模块下的任何东西,必须严格指明其路径,才能准确的访问到
        state:{
            name:'zhangsan'
        },
        mutations:{
            updateName(state,payload){
                state.name = payload
            }
        },
        actions:{
            aupdateName(context,payload){
                setTimeout(() => {
                    context.commit('updateName','wangwu') //只会找此模块中的mutations
                },1000)
            }
        },
        getters:{
            fullName(state){
                return state.name + '11111'
            },
            fullName(state,getters){
                return gettes.fullName + '22222'
            },
            fullName3(state,getters,rootState){
  				console.log(rootState.counter) //rootState这个参数是根的状态
            },
        },
        modules:{} //可以进行嵌套
    },
    b:{
    	namespaced:true,
        state:{},
        mutations:{},
        actions:{},
        getters:{},
        modules:{}        
    }
}

使用

<h2>{{$store.state.a.name}}</h2> <!-- zhangsan --> 
<button @click='updateName'>修改a模块中的名字</button>
methods:{
	/*updateName(){
		this.$store.commit('a/updateName','lisi') //a模块中的updateName
	}*/
	...mapMutations({ //参数除了可以是数组,还可以是对象
		'updateName':'a/updateName' //映射到a模块的mutation里的updateName函数
	})
}

http://www.kler.cn/a/420980.html

相关文章:

  • 单机环境下Caffeine和Redis两级缓存的实现与问题解决
  • Qt—QLineEdit 使用总结
  • k8s,声明式API对象理解
  • 代码随想录-算法训练营day31(贪心算法01:分发饼干,摆动序列,最大子数组和)
  • SpringBoot源码-Spring Boot启动时控制台为何会打印logo以及自定义banner.txt文件控制台打印
  • 纯Go语言开发人脸检测、瞳孔/眼睛定位与面部特征检测插件-助力GoFly快速开发框架
  • 利用Python爬虫精准获得Amazon商品详情数据
  • 40分钟学 Go 语言高并发:分布式系统理论基础
  • 基于大语言模型的智能Agent研究:定义、方法与展望(Large Language Model Based Intelligent Agents)
  • C语言经典题目详解(PTA题目)
  • c++领域展开第一幕——入门基础(命名空间、iostream、缺省参数、函数重载、nullptr、inline(内联函数))超详细!!!!
  • 【adb】AndroidStudio调试
  • 【python】列表
  • 面对深度伪造:OWASP发布专业应对指南
  • Java Web 1HTML快速入门
  • 代码随想录-算法训练营day29(回溯算法05:非递减子序列,全排列,全排列2)
  • 【C++算法】28.前缀和_除自身以外数组的乘积
  • 【C++高级开发应用篇】探索C++20中的协程:异步编程的强大工具
  • GDPU Android移动应用 使用多媒体
  • 使用 Vite 快速搭建 Vue 2开发环境
  • 001-SpringBoot整合日志
  • 神经网络入门实战:(十一)池化层搭建,以及填充层的说明
  • 解读 77页2024 集团企业IT技术架构规划方案
  • k8s使用的nfs作为sc。
  • 传统客服中心和呼叫中心客服系统的区别
  • 时间序列模型在LSTM中的特征输入