1021 Vue 进阶 VuexOneDay

it2025-05-22  16

1021 vuex 组件间的通信 One day

主要讲
ECharts 以后用的非常多,还有 DataV(用的不是很多) 如果项目中有一个图表,是用什么做的,自己写的话要回 svg canvas 学会了可以专攻这个专业,有关数学的一些知识,相对比较麻烦。还有 AntV G2(相对比较多一点 还有语雀文档) 可视化的图形语法 蚂蚁出的 D3(全英文的)查别人写好的例子是用。我们下载的包都是在 npm 下载的,yarn 也是从网上下载安装包的,但是和 npm 不能同时在一个项目中使用。开始 vue 的进阶部分 vuex:组件间通信的终极解决办法.安装 vuex 公共样式 global.css 仓库 store.js问题:简化复杂的操作用计算属性,获取 store 的数据搭配计算属性去使用, 不明白 computed 是什么问题:store.num修改成 x.num 行不行,原因:别人写好的东西不能随便的修改,或者你写的东西放在 Store 里面他不到一定能认识,我可以不识别你写的方法,所以说不可能修改,要根据他的方法规定好,不是两边写了一样方法名就能用,是他的方法里面已经写好了配置项 state 了,你怎么去改他的 state 呢 他有他的意思,不是你想改就能改。点击 handleClick() 修改 srote 的值 不推荐使用,正确方法:组件通过store 的事件方法 commit 调用 store.js 里面的 mutations 对象内的方法进行修改有用!装 Devtools 的一个工具,安装方法也有。在 mutations 对象中设置多个修改的方法以及commit 传的参数是对象的方法,还有传参的时候需要注意的一些事项。 每一个 Vuex 应用的核心就是 store(仓库)。“store”基本上就是一个容器,它包含着你的应用中大部分的状态 (state)。

vue 进阶 vuex:组件间的通信的终极解决办法,组件间交互比较多的就可以使用。

要什么数据跟 vuex 要,改什么也叫 vuex 改做项目必须会的一个知识点,用不用就另说。

介绍

如果您不打算开发大型单页应用,使用 Vuex 可能是繁琐冗余的。确实是如此——如果您的应用够简单,您最好不要使用 Vuex。一个简单的 store 模式就足够您所需了。但是,如果您需要构建一个中大型单页应用,您很可能会考虑如何更好地在组件外部管理状态,Vuex 将会成为自然而然的选择。引用 Redux 的作者 Dan Abramov 的话说就是

Flux 架构就像眼镜:您自会知道什么时候需要它。

每一个 Vuex 应用的核心就是 store(仓库)。“store”基本上就是一个容器,它包含着你的应用中大部分的状态 (state)。Vuex 和单纯的全局对象有以下两点不同:

Vuex 的状态存储是响应式的。当 Vue 组件从 store 中读取状态的时候,若 store 中的状态发生变化,那么相应的组件也会相应地得到高效更新。你不能直接改变 store 中的状态。改变 store 中的状态的唯一途径就是显式地提交 (commit) mutation。这样使得我们可以方便地跟踪每一个状态的变化,从而让我们能够实现一些工具帮助我们更好地了解我们的应用。
安装
npm install vuex --save 或者图形化界面安装 运行依赖 vuex在 assets 文件夹中写全局的公共样式 global.css 引到 main.js 中创建 vuex 在根目录 src 下需要创建一个 store.js 仓库,里面写着我们的共享数据。 导入创建导出引入
计算属性 computed

获取 store.js 里面的数据----获取 store 数据搭配计算属性 computed 简化操作。

<p>展示 store 内共享的数据:{{ num }}</p> computed: { num(){ return this.$store.state.num } }

修改 state 的状态

下列是不可取的方法

handleUpdate(){ this.$store.state.num = 6666 }

上述操作可以修改 store 内的数据,但是绝对不能使用,就和我们之前说的,当 props 是对象的时候子组件不能直接修改,这样修改了之后追踪不到修改的来源,谁的状态要通过谁的事件去修改才行。

想要修改 store 内的数据,必须使用 commit 来触发mutation 函数

如何获取 commit ,如何通过 commit 触发mutation

在组件内直接导入 store , store 内默认就有 commit 方法。import store from '../store'使用 store.commit('StateUpdate') 第一个参数叫 state, state 是个对象用来放组件共享的数据 在这里放的就是共享的组件数据 mutations 方法修改 store 内数据的方法。 更新的方法内默认接收 state 对象 作为第一个参数需要的话可以设置第二个参数接收 commit 传递的第二个参数。对象内可以设置两个属性type payload,载荷数据不能设置第三个或者多个,那么想要传递多条数据可以将第二个参数设置成对象。commit 提交 mutation 可以直接使用 对象形式提交,那么 mutation 函数的第二个参数就会接收这个对象。

再次强调,我们通过提交 mutation 的方式,而非直接改变 store.state.count,是因为我们想要更明确地追踪到状态的变化。这个简单的约定能够让你的意图更加明显,这样你在阅读代码的时候能更容易地解读应用内部的状态改变。此外,这样也让我们有机会去实现一些能记录每次状态改变,保存状态快照的调试工具。有了它,我们甚至可以实现如时间穿梭般的调试体验。

由于 store 中的状态是响应式的,在组件中调用 store 中的状态简单到仅需要在计算属性中返回即可。触发变化也仅仅是在组件的 methods 中提交 mutation。

Vuex 状态管理模式

就是实现组件之间交互的终极方案。将组件需要交互的数据(data),共享到 vuex 创建的 store(仓库) 内。

Vuex 的创建

安装 vuex npm i vuex

在 src 下新建 store.js 文件用来创建 store store.js

import Vue from "vue"; import Vuex from "vuex"; Vue.use(Vuex) //变成当前项目下的全局 const store = new Vuex.Store){ state:{ count:0 } } export defalut store

在 mian.js 内导入 store ,将 store 加入到整个 vue 的项目实例内。

store 的使用

组件内获取 store 数据// 一般获取 store 内的数据写成计算属性的方式 computed: { count: this.$store.state.count; } 组件内修改 store 数据 需要在创建 store 的时候定义好修改的方法,也就是创建 mutation const store= new Vuex.Store({ ... mutations:{ handleUpdate(state){ state.count++ } } }) 在组件内使用 store.commit('handleUpdate') 来修改 store 中的数据。 <template> <div> <h3>我是父组件 Parent1</h3> <p>展示 store 内共享的数据:{{ num }}{{num12}}</p> <button @click="handleUpdate1">点击减少数据</button> <button @click="handleUpdate">点击增加数据</button> <button @click="handleUpdate2">点击传给数据参数 123546</button> <button @click="handleUpdate3">显示{{num12}}</button> </div> </template> <script> import store from "../store"; export default { name: "Parent1", created() { console.log(this); }, // 简化复杂的操作用计算属性 computed: { num() { return this.$store.state.num; }, num12(){ return this.$store.state.num1 } }, methods: { handleUpdate() { // this.$store.state.num = 6666; // 上述操作可以修改 store 内的数据,但是绝对不能使用,就和我们之前说的,当 props 是对象的时候子组件不能直接修改,这样修改了之后追踪不到修改的来源,谁的状态要谁的事件来修改。 // 想要修改 store 内的数据,必须使用 commit 来触发 mutation 函数 // 如何获取 commit ,如何通过 commit 触发 mutation // 1. 在组件内直接导入 store , store 内默认就有 commit 方法。import store from '../store' // 2. 使用 store.commit('StateUpdate') store.commit("StateUpdate"); }, handleUpdate1() { store.commit("StateUpdate1"); }, handleUpdate2() { store.commit("StateUpdate2", 123456); }, handleUpdate3() { store.commit({ type:'StateUpdate3', num1:'我是 num1', }); }, // mapMutations 的对象语法 // 主要和数组区分 该用法可以和组件 // ...mapMutations({ // jia: ADD, // gai: CHANGE, // }), }, }; </script> <style></style> // 创建 vuex 的 store 仓库(和vue-router 有点像) // 一、导入 vuex 和 vue ,使用 Vue 的 use 方法将 vuex 做成全局的组件中都能用。 import Vuex from "vuex"; import Vue from "vue"; Vue.use(Vuex); // use 就是把 vuex 做成插件,加载到我们整个项目的类里面,创建好的组件就可以直接调用 Store 类实例化的 state 使用。 // 二、创建 store 仓库,需要使用 vuex.Store 类(class) 创建 // 创建的时候需要传递参数 const store = new Vuex.Store({ // 1. 第一个参数叫 state, state 是个对象用来放组件共享的数据 state: { // 在这里放的就是共享的组件数据 num: 1000, num1:'我是空值' }, // 2. mutations 方法修改 store 内数据的方法。 // 更新的方法内默认接收 state 对象 作为第一个参数 // 需要的话可以设置第二个参数接收 commit 传递的第二个参数。 // 对象内可以设置两个属性 type payload,载荷数据 // 不能设置第三个或者多个,那么想要传递多条数据可以将第二个参数设置成对象。 // commit 提交 mutation 可以直接使用 对象形式提交,那么 mutation 函数的第二个参数就会接收这个对象。 // 想要修改共享数据的话,直接对 state 内的数据进行修改即可。 mutations: { StateUpdate(state) { state.num++; }, StateUpdate1(state) { state.num--; }, // 我们管第二个参数叫做 payload StateUpdate2(state, payload) { state.num = payload; }, StateUpdate3(state, payload) { console.log(payload); state.num1 = payload.num1; }, }, }); // 三、将创建好的 store 导出 export default store; // 四、 在 main.js 内导入 store,并且在整个 vue 项目的实例的时候添加上 store // 上述四步完成之后, vue 项目的所有组件内都可以使用了

最新回复(0)