Vue2(状态管理Vuex)

目录

  • 一,状态管理Vuex
  • 二,state状态
  • 三,mutations
  • 四,actions
  • 五,modules
  • 最后

一,状态管理Vuex

Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式。它采用集中式存储管理应用的所有组件的状态,并以相应的规则保证状态以一种可预测的方式发生变化。

在这里插入图片描述

Vuex的核心:state、mutations、actions

state:存储公共的一些数据
mutations:定义一些方法来修改state中的数据,数据怎么改变
actions: 使用异步的方式来触发mutations中的方法进行提交。
此部分的代码我们在vue-cli中使用

二,state状态

声明

import Vue from 'vue'
import Vuex from 'vuex'Vue.use(Vuex)export default new Vuex.Store({state: {count:11},mutations: {},actions: {}
})

使用

// 直接在模板中使用
<template><div>vuex中的状态数据count:{{ $store.state.count }}</div>
</template>
// 在方法中使用
ceshi(){console.log("Vuex中的状态数据count:",this.$store.state.count);this.$router.push({path:"/ceshi"},()=>{},()=>{})}

在这里插入图片描述

在计算属性中使用

当一个组件需要获取多个状态的时候,将这些状态都声明为计算属性会有些重复和冗余。为了解决这个问题,我们可以使用 mapState 辅助函数帮助我们生成计算属性,让你少按几次键。

// 在组件中导入mapState函数。mapState函数返回的是一个对象
import {mapState} from 'vuex'
// 在组件中导入mapState函数。mapState函数返回的是一个对象
<template><div id="app"><div id="nav"><router-link to="/">Home</router-link> |<router-link to="/about">About</router-link>|<el-button @click="gouwucheclick">购物车</el-button><el-button @click="ceshi">测试</el-button><br>vuex中的状态数据count:{{ $store.state.count }}<br>{{ count }}<br> doubleCount:{{ doubleCount }}</div><router-view/></div>
</template><script>
import {mapState} from 'vuex'export default{data(){return{baseCount:10}},methods:{gouwucheclick(){this.$router.push({path:"/gouwuche"},()=>{},()=>{})},ceshi(){console.log("Vuex中的状态数据count:",this.$store.state.count);this.$router.push({path:"/ceshi"},()=>{},()=>{})}},computed:mapState({count:'count',doubleCount(state){return state.count * 2 + this.baseCount} })}
</script>

在这里插入图片描述
使用展开运算符

在之前的示例中,不方便和本地的计算属性混合使用,下面我们使用展开运算符,这样就可以和本地的计算属性一起使用。

<template><div id="app"><div id="nav"><router-link to="/">Home</router-link> |<router-link to="/about">About</router-link>|<el-button @click="gouwucheclick">购物车</el-button><el-button @click="ceshi">测试</el-button><br>本地的计算属性{{ localCount }}<br>vuex中的状态数据count:{{ $store.state.count }}<br>{{ count }}<br> doubleCount:{{ doubleCount }}</div><router-view/></div>
</template><script>
import {mapState} from 'vuex'export default{data(){return{baseCount:10}},methods:{gouwucheclick(){this.$router.push({path:"/gouwuche"},()=>{},()=>{})},ceshi(){this.baseCount=5 console.log("Vuex中的状态数据count:",this.$store.state.count);this.$router.push({path:"/ceshi"},()=>{},()=>{})}},computed:{localCount(){// 本地的计算属性,没有vuex中的状态参与return this.baseCount + 1},...mapState({count:'count',doubleCount(state){return state.count * 2 + this.baseCount}})}}
</script>

在这里插入图片描述

三,mutations

state中的数据是只读的,不能直接进行修改。想要修改state中数据的唯一途径就是调用mutation方法。
使用commit()函数,调用mutation函数。

注意:mutation中只能执行同步方法。

  mutations: {// 在mutations中定义方法,在方法中修改state// state是状态,num是额外的参数add(state,num){state.count = state.count +num}},

直接调用

<template><div id="app"><div id="nav"><router-link to="/">Home</router-link> |<router-link to="/about">About</router-link>|<el-button @click="gouwucheclick">购物车</el-button><el-button @click="ceshi">测试</el-button><el-button @click="addcount">调用add</el-button><br>本地的计算属性{{ localCount }}<br>vuex中的状态数据count:{{ $store.state.count }}<br>{{ count }}<br> doubleCount:{{ doubleCount }}</div><router-view/></div>
</template><script>
import {mapState} from 'vuex'export default{data(){return{baseCount:10}},methods:{gouwucheclick(){this.$router.push({path:"/gouwuche"},()=>{},()=>{})},ceshi(){this.baseCount=5 console.log("Vuex中的状态数据count:",this.$store.state.count);this.$router.push({path:"/ceshi"},()=>{},()=>{})},addcount(){this.$store.commit('add',1)}},computed:{localCount(){// 本地的计算属性,没有vuex中的状态参与return this.baseCount + 1},...mapState({count:'count',doubleCount(state){return state.count * 2 + this.baseCount}})}}
</script>

演示2

使用辅助函数(mapMutations)简化

import {mapMutations} from 'vuex'

四,actions

actions中执行的方法可以是异步的
actions中要修改状态state中的内容,需要通过mutation。
在组件中调用action需要调用dispatch()函数。

步骤如下:
声明action方法

actions: {delayAdd(countext,num){// 在action中调用mutation中的方法setTimeout(()=>{countext.commit('add',num)},2000)}},

直接调用action方法

<template><div id="app"><div id="nav"><router-link to="/">Home</router-link> |<router-link to="/about">About</router-link>|<el-button @click="gouwucheclick">购物车</el-button><el-button @click="ceshi">测试</el-button><el-button @click="addcount">调用add</el-button><el-button @click="addcountAction">调用actions中的方法</el-button><br>本地的计算属性{{ localCount }}<br>vuex中的状态数据count:{{ $store.state.count }}<br>{{ count }}<br> doubleCount:{{ doubleCount }}</div><router-view/></div>
</template><script>
import {mapState} from 'vuex'export default{data(){return{baseCount:10}},methods:{gouwucheclick(){this.$router.push({path:"/gouwuche"},()=>{},()=>{})},ceshi(){this.baseCount=5 console.log("Vuex中的状态数据count:",this.$store.state.count);this.$router.push({path:"/ceshi"},()=>{},()=>{})},addcount(){this.$store.commit('add',1)},addcountAction(){this.$store.dispatch('delayAdd',2)}},computed:{localCount(){// 本地的计算属性,没有vuex中的状态参与return this.baseCount + 1},...mapState({count:'count',doubleCount(state){return state.count * 2 + this.baseCount}})}}
</script>

五,modules

在复杂的项目中,我们不能把大量的数据堆积到store中,这样store的内容就太多,而且比较凌乱,不方便管理。所以就是出现了module。他将原有的store切割成了一个个的module。每个module中都有自己的store、mutation、actions和getter

store中定义一个module

const storeModuleA={state:{countA:10},mutations:{addA(state){state.countA++console.log("moduleA:"+state.countA);},//  此方法和root中的方法名字一致 add(state){console.log("moduleA:"+state.countA);}}
}export default storeModuleA

在store.js中,导入并注册此module

import Vue from 'vue'
import Vuex from 'vuex'
import storeModuleA from './stroeModuleA'Vue.use(Vuex)export default new Vuex.Store({state: {count:11,},mutations: {// state是状态,num是额外的参数add(state,num){console.log('root中的add');state.count = state.count +num}},actions: {delayAdd(countext,num){// 在action中调用mutation中的方法setTimeout(()=>{countext.commit('add',num)},2000)}},modules: {a:storeModuleA}
})

在组件中使用子模块中的状态

<template><div id="app"><div id="nav"><router-link to="/">Home</router-link> |<router-link to="/about">About</router-link>|<el-button @click="gouwucheclick">购物车</el-button><el-button @click="ceshi">测试</el-button><el-button @click="addcount">调用add</el-button><el-button @click="addcountAction">调用actions中的方法</el-button><br>本地的计算属性{{ localCount }}<br>vuex中的状态数据count:{{ $store.state.count }}<br>{{ count }}<br> doubleCount:{{ doubleCount }}<hr>{{ $store.state.a.countA }}<el-button @click="addMoudleAaddA">调用a模块中的mutation-addA</el-button></div><router-view/></div>
</template><script>
import {mapState} from 'vuex'export default{data(){return{baseCount:10}},methods:{gouwucheclick(){this.$router.push({path:"/gouwuche"},()=>{},()=>{})},ceshi(){this.baseCount=5 console.log("Vuex中的状态数据count:",this.$store.state.count);this.$router.push({path:"/ceshi"},()=>{},()=>{})},addcount(){this.$store.commit('add',1)},addcountAction(){this.$store.dispatch('delayAdd',2)},addMoudleAaddA(){this.$store.commit('addA')},},computed:{localCount(){// 本地的计算属性,没有vuex中的状态参与return this.baseCount + 1},...mapState({count:'count',doubleCount(state){return state.count * 2 + this.baseCount}})}}
</script>

示例4


在store.js中,导入并注册此module

在组件中使用子模块中的状态

没有声明namespace的情况
子模块中的mutation在没有使用namespace的情况下,这些方法会注册到root中。
如果子模块中的mutation和root中的一样。则都会被调用。

<template><div id="app"><div id="nav"><router-link to="/">Home</router-link> |<router-link to="/about">About</router-link>|<el-button @click="gouwucheclick">购物车</el-button><el-button @click="ceshi">测试</el-button><el-button @click="addcount">调用add</el-button><el-button @click="addcountAction">调用actions中的方法</el-button><br>本地的计算属性{{ localCount }}<br>vuex中的状态数据count:{{ $store.state.count }}<br>{{ count }}<br> doubleCount:{{ doubleCount }}<hr>{{ $store.state.a.countA }}<el-button @click="addMoudleAaddA">调用a模块中的mutation-addA</el-button><el-button @click="addMoudleAadd">调用a模块中的mutation-add</el-button></div><router-view/></div>
</template><script>
import {mapState} from 'vuex'export default{data(){return{baseCount:10}},methods:{gouwucheclick(){this.$router.push({path:"/gouwuche"},()=>{},()=>{})},ceshi(){this.baseCount=5 console.log("Vuex中的状态数据count:",this.$store.state.count);this.$router.push({path:"/ceshi"},()=>{},()=>{})},addcount(){this.$store.commit('add',1)},addcountAction(){this.$store.dispatch('delayAdd',2)},addMoudleAaddA(){this.$store.commit('addA')},addMoudleAadd(){this.$store.commit('add')}},computed:{localCount(){// 本地的计算属性,没有vuex中的状态参与return this.baseCount + 1},...mapState({count:'count',doubleCount(state){return state.count * 2 + this.baseCount}})}}
</script>

在这里插入图片描述
声明namespace的情况
在module中添加

import Vue from 'vue'
import Vuex from 'vuex'
import storeModuleA from './stroeModuleA'Vue.use(Vuex)export default new Vuex.Store({state: {count:11,},mutations: {// state是状态,num是额外的参数add(state,num){console.log('root中的add');state.count = state.count +num}},actions: {delayAdd(countext,num){// 在action中调用mutation中的方法setTimeout(()=>{countext.commit('add',num)},2000)}},modules: {a:{namespaced:true,...storeModuleA}}
})

在组件中调用,加上别名即可

this.$store.commit('a/addA');
<template><div id="app"><div id="nav"><router-link to="/">Home</router-link> |<router-link to="/about">About</router-link>|<el-button @click="gouwucheclick">购物车</el-button><el-button @click="ceshi">测试</el-button><el-button @click="addcount">调用add</el-button><el-button @click="addcountAction">调用actions中的方法</el-button><br>本地的计算属性{{ localCount }}<br>vuex中的状态数据count:{{ $store.state.count }}<br>{{ count }}<br> doubleCount:{{ doubleCount }}<hr>{{ $store.state.a.countA }}<el-button @click="addMoudleAaddA">调用a模块中的mutation-addA</el-button><el-button @click="addMoudleAadd">调用a模块中的mutation-add</el-button></div><router-view/></div>
</template><script>
import {mapState} from 'vuex'export default{data(){return{baseCount:10}},methods:{gouwucheclick(){this.$router.push({path:"/gouwuche"},()=>{},()=>{})},ceshi(){this.baseCount=5 console.log("Vuex中的状态数据count:",this.$store.state.count);this.$router.push({path:"/ceshi"},()=>{},()=>{})},addcount(){this.$store.commit('add',1)},addcountAction(){this.$store.dispatch('delayAdd',2)},addMoudleAaddA(){this.$store.commit('addA')},addMoudleAadd(){this.$store.commit('a/add')}},computed:{localCount(){// 本地的计算属性,没有vuex中的状态参与return this.baseCount + 1},...mapState({count:'count',doubleCount(state){return state.count * 2 + this.baseCount}})}}
</script>

在这里插入图片描述

最后

送大家一句话:不是井里没有水,而是挖的不够深

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/56130.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

聚观早报 | 云鲸扫拖机器人J4体验;芯科科技第三代无线开发平台

【聚观365】8月24日消息 云鲸扫拖机器人J4体验 芯科科技推出第三代无线开发平台 英伟达与VMWare宣布扩大合作 万物新生&#xff08;爱回收&#xff09;2023年二季度财报 充电桩需求增长带动汽车后服务市场 云鲸扫拖机器人J4体验 家庭卫生清洁是每个人都无法回避的事情&am…

C++实现客户端/服务端通信(一)

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 C实现客户端/服务端通信&#xff08;一&#xff09; 网络编程的基本概念1. 客户端/服务器通信模型&#xff1a;2. socket函数&#xff1a;3. 主机字节序和网络字节序&#xf…

运放的分类、运放的参数

一、运放的分类 运放按功能分为通用运放与专用运放&#xff08;高速运放、精密运放、低IB运放等&#xff09;。 1.1通用运放 除廉价外&#xff0c;没有任何最优指标的运放。 例&#xff1a;uA741&#xff0c;LM324&#xff0c;TL06X&#xff0c;TL07X、TL08X等 国外知名运放…

小红书口碑营销技巧有哪些,打造独特品牌内容

作为一款社交电商平台&#xff0c;从目前来看&#xff0c;其实小红书也算是比较不错的口碑营销传播平台了。今天就来带大家一起分享下&#xff0c;小红书口碑营销技巧有哪些&#xff0c;打造独特品牌内容&#xff01; ​ 一、小红书口碑营销怎么做 1. 了解目标用户 首先需要明…

linux并发服务器 —— 动态库和静态库实战(一)

-E 预处理指定源文件 -S 编译指定源文件 -c 汇编指定源文件 -o 生成可执行文件 -I directory 指定Include包含文件的搜索目录 -g 编译的时候生成调试信息 -D 在程序编译时指定一个宏 -w 不生成任何的警告信息 -Wall 生成所有警告 -On n:0~3&#xff1b;表示编译器的优…

(五)Docker 安装 redis镜像+启动redis容器(超详细)

输入&#xff1a;su root命令&#xff0c;切换到root 1、启动Docker 启动&#xff1a;sudo systemctl start docker 停止&#xff1a;systemctl stop docker 重启&#xff1a;systemctl restart docker 查看docker运行状态&#xff08;显示绿色代表正常启动&#xff09;&#x…

手写数字识别之损失函数

目录 交叉熵 手写数字识别之损失函数 分类任务的损失函数 Softmax函数 交叉熵的简单理解&#xff1a;真实分布与非真实分布的交叉&#xff0c;完全对应&#xff0c;熵为0 交叉熵的代码实现 交叉熵 给定一个策略, 交叉熵就是在该策略下猜中颜色所需要的问题的期望值。更普…

videojs 实现自定义组件(视频画质/清晰度切换) React

前言 最近使用videojs作为视频处理第三方库&#xff0c;用来对接m3u8视频类型。这里总结一下自定义组件遇到的问题及实现&#xff0c;目前看了许多文章也不全&#xff0c;官方文档写的也不是很详细&#xff0c;自己摸索了一段时间陆陆续续完成了&#xff0c;这是实现后的效果.…

DevOps系列文章 之 Python基础

Python语法结构 语句块缩进 1.python代码块通过缩进对齐表达代码逻辑而不是使用大括号 2.缩进表达一个语句属于哪个代码块 3.缩进风格 &#xff1a; 建议使用四个空格 如果是Linux系统的话&#xff0c;可以这样做&#xff0c;实现自动缩进 &#xff1a; vim ~/.vimrc set ai…

FreeSWITCH 1.10.10 简单图形化界面3 - 阿里云NAT设置

FreeSWITCH 1.10.10 简单图形化界面3 - 阿里云NAT设置 0、 界面预览1、 查看IP地址2、 修改协议配置3、 开放阿里云安全组4、 设置ACL5、 设置协议中ACL&#xff0c;让PBX匹配内外网6、 重新加载SIP模块7、 查看状态8、 测试一下 0、 界面预览 http://myfs.f3322.net:8020/ 用…

LeetCode-56-合并区间

题目描述&#xff1a; 以数组 intervals 表示若干个区间的集合&#xff0c;其中单个区间为 intervals[i] [starti, endi] 。请你合并所有重叠的区间&#xff0c;并返回 一个不重叠的区间数组&#xff0c;该数组需恰好覆盖输入中的所有区间 。 可以使用 LinkedList&#xff0c;…

一起学SF框架系列附-Springframework源码学习总结

学习过程 学习Springframework6.0.8&#xff0c;前后将近4个月终于结束了。学习主要内容如图&#xff08;红框&#xff09;&#xff1a; 本次学习主要针对核心模块&#xff1a;Beans、Context、Core、SpEL&#xff08;完全独立于框架的&#xff0c;没深入学习&#xff09;、…

MySQL 实战(一):实现“附近的人”功能

❤️ 个人主页&#xff1a;水滴技术 &#x1f680; 支持水滴&#xff1a;点赞&#x1f44d; 收藏⭐ 留言&#x1f4ac; &#x1f338; 订阅专栏&#xff1a;MySQL 教程&#xff1a;从入门到精通 文章目录 ST_Distance_Sphere 函数示例一&#xff1a;计算北京站到北京西站的距…

【深度学习】实验03 特征处理

文章目录 特征处理标准化归一化正则化 特征处理 标准化 # 导入标准化库 from sklearn.preprocessing import StandardScalerfrom matplotlib import gridspec import numpy as np import matplotlib.pyplot as plt import warnings warnings.filterwarnings("ignore&quo…

aws PinPoint发附件demo

php 版aws PinPoint发附件demo Laravel8框架&#xff0c;安装了"aws/aws-sdk-php": "^3.257" 主要代码&#xff1a; public function sendRawMail(Request $request) {$file $request->file(attachment);/*echo count($file);dd($file);*/$filenam…

Mobx在非react组件中修改数据,在ts/js中修改数据实现响应式更新

我们都之前在封装mobx作为数据存储的时候&#xff0c;使用到了useContext作为包裹&#xff0c;将store变成了一个hooks使用&#xff0c;封装代码: import React from react import UserInfo from ./user import Setting from ./seting import NoteStore from ./noteclass Stor…

基于Jenkins构建生产CICD环境(第三篇)

目录 基于Jenkins自动打包并部署docker环境 1、安装docker-ce 2、阿里云镜像加速器 3、构建tomcat 基础镜像 4、构建一个Maven项目 基于Jenkins自动化部署PHP环境 基于rsync部署 基于Jenkins自动打包并部署docker环境 1、安装docker-ce 在192.168.2.123 机器上&#x…

Go 第三方库引起的线上问题、如何在线线上环境进行调试定位问题以及golang开发中各种问题精华整理总结

Go 第三方库引起的线上问题、如何在线线上环境进行调试定位问题以及golang开发中各种问题精华整理总结。 01 前言 在使用 Go 语言进行 Web 开发时&#xff0c;我们往往会选择一些优秀的库来简化 HTTP 请求的处理。其中&#xff0c;go-resty 是一个被广泛使用的 HTTP 客户端。…

如何有效进行RLHF的数据标注?

编者按&#xff1a;随着大语言模型在自然语言处理领域的广泛应用&#xff0c;如何从人类反馈进行强化学习&#xff08;RLHF&#xff09;已成为一个重要的技术挑战。并且RLHF需要大量高质量的人工数据标注&#xff0c;这是一个非常费力的过程。 本文作者在数据标注领域具有丰富经…

解决jupyter notebook可以使用pytorch而Pycharm不能使用pytorch的问题

之前我是用的这个目录下的Python 开始更新目录 1、 2、 3、