vuex知识

server/2024/10/20 18:57:50/

Vuex之Mutation

mutation用于管理同步事件,如果有异步操作,请用action。

更改 Vuex 的 store 中的状态的唯一方法是提交 mutation。

在vue中,我们要修改data中的值,一般会这么做。

this.count = 2

如果我们要修改vuex的store中的状态值,我们就不能简单的通过赋值的方式来做了,如果你这样做,控制台便会报错。

this.$store.state.count = 2 //控制台打印错误

vuex提供了mutation来追踪你对state的值的操作,你要使用commit()来触发mutation里面的方法。

示例如下:

//state.js
let state = {count: 1,name: 'lyh',
}
export default state
//mutation.js
// 第一个参数默认接收state对象
const increment = (state) => {state.count++
}
const decrement = (state) => {state.count--
}
//第二个参数接收'载荷'
const add = (state, n) => {state.count += n
}
const fn = (state, json) => {state.name = json.first + json.second + state.name
}
export {increment, decrement, add, fn}
<template><div><div><button @click="decrement">-</button><span>{{count}}</span><button @click="increment">+</button></div><div style="margin-top:20px;"><button @click="add(1)">+1</button><button @click="add(2)">+2</button></div><button style="margin-top:20px" @click = "changeName('my ','name is ')">{{name}}</button></div>
</template><script>
export default {computed: {count () {return this.$store.state.count},name () {return this.$store.state.name}},methods: {decrement () {this.$store.commit('decrement')},increment () {this.$store.commit('increment')},add (n) {// 你可以向 store.commit 传入额外的参数,即 mutation 的 载荷(payload)this.$store.commit('add', n)},changeName (first, second) {this.$store.commit('fn', {'first': first,'second': second})}}
}
</script>

mutation的辅助函数,用法示例如下:

<template><div><div><button @click="decrement">-</button><span>{{count}}</span><button @click="increment">+</button></div><div style="margin-top:20px;"><button @click="add(1)">+1</button><button @click="add(2)">+2</button></div><button style="margin-top:20px" @click = "changeName({'first':'my ',second:'name is '})">{{name}}</button></div>
</template><script>
import { mapMutations } from 'vuex'
export default {computed: {count () {return this.$store.state.count},name () {return this.$store.state.name}},// 辅助函数写法methods: {...mapMutations({decrement: 'decrement',increment: 'increment', // 将 `this.increment()` 映射为 `this.$store.commit('increment')`add: 'add',changeName: 'fn' // 将 `this.changeName(json)` 映射为 `this.$store.commit('fn', json)`})}
}
</script>

vuex之action

例子:在action中, 根据传入的参数(数字1-250)异步请求电影数据, 在请求完成后提交mutation。
在state中声明一个对象, 用于存储查询到的电影的相关信息。

searchResult: {}

状态更改,在mutation中,将查询的结果(传入的参数), 赋值给state中声明的变量。

 haveRestult(state, ret) {state.searchResult = ret;}

数据请求,在action中, 根据传入的参数(数字1-250)异步请求电影数据, 在请求完成后提交mutation。

getMoviesRankingInDouban({ commit, state }, number) {let num = number - 1 === 0 ? 0 : number - 1 || 1;axios({method: "get",url: "v2/movie/top250?start=" + num + "&count=1"}).then(res => {commit("haveRestult", res.data.subjects[0] || {})}).catch(err => {console.log(err, "获取豆瓣数据失败");})
}

在组件内调用时, 将参数传入即可。

this.$store.dispatch("getMoviesRankingInDouban", this.Ranking);

使用辅助函数 mapActions。

 methods: {...mapMutations(['action1', // 映射为组件内的同名方法]),...mapActions({action2AnotherName: 'action2' // 将action2 映射为组件内名为action2AnotherName的方法.})}

组合 Action

对于多个action相互依赖顺序的情况下, 可以使用promise来判断上一个action的结束. 再进行下一步的action操作。
将getMoviesRankingInDouban的action用promise包装一下, 在此次请求结束后, 根据此次请求返回的电影的id, 根据id再次请求电影的信息。

getMoviesRankingInDouban({ commit, state }, number) {let num = number.number - 1 === 0 ? 0 : number.number - 1 || 1;return new Promise((resolve, reject) => {axios({method: "get",url: "v2/movie/top250?start=" + num + "&count=1"}).then(res => {commit("haveRestult", res.data.subjects[0] || {});resolve();}).catch(err => {console.log(err, "获取豆瓣数据失败");reject()})})
}

在组件内,封装依据id获取电影信息的方法。

getMovieMsgById(id){this.$ajax.get("v2/movie/subject/" + this.$store.state.searchResult.id).then((res) => {alert(JSON.stringify(res.data));}).catch((err) => {console.log(err)})
}

页面按钮绑定点击事件searchMovieById, 事件中 调用getMoviesRankingInDouban, 成功后, 调用getMovieMsgById方法。

searchMovieById(){this.$store.dispatch({type:"getMoviesRankingInDouban",number: this.Ranking}).then(() => {this.getMovieMsgById();}).catch((err) => {console.log(err);})
},

http://www.ppmy.cn/server/95840.html

相关文章

[Day 39] 區塊鏈與人工智能的聯動應用:理論、技術與實踐

區塊鏈的安全性分析 區塊鏈技術已經成為現代數字經濟的一個重要組成部分&#xff0c;提供了去中心化、透明和不可篡改的數據存儲與交易系統。然而&#xff0c;隨著區塊鏈技術的廣泛應用&#xff0c;其安全性問題也日益受到關注。本篇文章將詳細探討區塊鏈技術的安全性&#xf…

关于企微群聊天工具功能的开发---PHP+JS+CSS+layui (手把手教学)

文章目录 前言准备工作PHP代码示例前端代码示例 主要是js踩的小坑&笔记最终达成的效果总结 前言 公司要求开发企微群聊天工具。首先一个客户一个群&#xff0c;其余群成员都是公司销售、设计师、工长、售后等人员。要求开发一个群聊天工具&#xff0c;工长点击进来以后就可…

写一个批处理,压缩一个文件夹下的所有图片大小

在不同的操作系统和环境中,处理图片压缩的方式会有所不同。考虑到使用Windows环境,并且希望使用批处理脚本来实现这一需求,下面是一个基本的批处理脚本示例 @echo off setlocal enabledelayedexpansionREM 设置图片目录和输出目录 set "inputDir=D:\images\w" se…

【C++标准模版库】list的介绍及使用

list 一.list的介绍二.list的使用1.list 构造函数2.list 空间大小3.list 增删查改4.list 迭代器的使用1.正向迭代器2.反向迭代器 5.list 其他成员函数 三.vector与list关于sort性能的比较 一.list的介绍 C中的list标准模板库&#xff08;STL&#xff09;是C标准库中的一个重要组…

Mac电脑玩Steam游戏 黑神话悟空可以在steam上玩吗 黑神话悟空成为Steam全球周销量第一

《黑神话&#xff1a;悟空》游戏基于《西游记》原著的世界观背景设计了主线、支线剧情&#xff0c;努力还原西游原著背景的同时&#xff0c;也在产品开发与设计过程中加入了众多中国传统文化元素。游戏提供数字标准版和数字豪华版两种版本&#xff0c;售价分别为268元和328元&a…

嵌入式初学-C语言-练习三

#部分题目可能在之前的博客中有&#xff0c;请谅解&#xff0c;保证常见题型均被发出# 1.计算n以内所有正奇数的和 ? n值通过键盘输入 代码&#xff1a; 1 /*2 需求&#xff1a;计算n以内所有正奇数的和 ? n值通过键盘输入3 */4 #include <stdio.h>5 6 int main()7 …

[qt] 线程等待与唤醒

对于生产者与消费者的数据处理的另一种好的解决方法是使用QWaitCondition类,允许线程在一定的条件下唤醒其他多个线程来共同处理。 一 定义公共变量 DataSize: 生产者生产数据的大小BufferSize: 也就是这个缓冲区的大小,每个单元是一个int&#xff0c;也有可能是一个链表,结构…

React(四):DOCX文件在线预览

效果 注意 ⚠️注意&#xff1a;部分文件预览存在问题 依赖 $ yarn add docx-preview $ yarn add jszip源码 import ./index.scss; import {useRef} from react; import type {UploadRequestOption} from rc-upload/lib/interface; import {Upload, Button, message} from an…