Vue 不使用Vuex的情况下进行状态管理
在封装自己的Vue ui库的时候,往往要封装一些比较复杂的组件,比如说table,form之类。这些组件由于功能繁杂,还涉及到子组件嵌套及通信,如果没有一套状态管理方案的话很容易导致代码难以阅读、难以维护、难以修改等问题,但引入vuex的话又过于沉重。鉴于业内已经有element-ui这样比较成熟的案例,我们可以看看element-ui是怎么在没有vuex的情况下进行状态管理的。
Element-ui主要以两种形式进行状态管理:provider和自定义store。provider比较简单,父组件将数据装入providder,子组件用inject进行接收。这种方法优点是拿来即用,十分简单。缺点是子组件无法修改数据。所有局限性还是比较大的。
第二种方法是封装自定义store。我们参考element-ui中table组件,element-ui首先定义了一个table-store.js文件,存放store:
const TableStore = function(table, initialState = {}) {
if (!table) {
throw new Error('Table is required.');
}
this.table = table;
this.states = {
...
}
TableStore.prototype.mutations = {
...
}
TableStore.prototype.actions = {
...
}
除了没有actions以外其他基本和vuex差不多。
element-ui写tableStore用的是es5语法,这里用一个异步设置msg字段的typescript案例来进行讲解:
export class TestStore {
public states: IState = {
msg: ''
};
public commit(action: string, ...args: any[]) {
const mutations = this.mutations as any;
if (mutations[action]) {
mutations[action].apply(this, [this.states].concat(args));
} else {
throw new Error(`Action not found: ${action}`);
}
}
public mutations = {
setMsg(states: IState, msg: any) {
states.msg = msg;
}
};
}
interface IState {
msg: string
}
使用的时候先在父组件上挂载store并传递给子组件:
<template>
<div class="home">
<img alt="Vue logo" src="../assets/logo.png">
<HelloWorld :store="store" />
'
<p>
{{store.states.msg}}
</p>
</div>
</template>
<s cript lang="ts">
import { Component, Vue } from 'vue-property-decorator';
import HelloWorld from '@/components/HelloWorld.vue';
import { TestStore } from '@/utils/testStore';
@Component({
components: {
HelloWorld,
}
})
export default class Home extends Vue {
store: TestStore = new TestStore();
}
</s cript>
然后子组件用props接受store,并提交setMsg操作:
<template>
</template>
<s cript lang="ts">
import { Component, Prop, Vue } from 'vue-property-decorator';
@Component({
})
export default class HelloWorld extends Vue {
@Prop() private store!: any;
public created() {
setTimeout(() => {
this.store.commit('setMsg', 'changed');
}, 1000);
}
}
</s cript>
然后Home组件template中的msg就会在相应的时间更新。这样我们就实现了不依赖vuex进行状态管理。
Vue 不使用Vuex的情况下进行状态管理的更多相关文章
- vue组件通讯方法汇总(在不使用vuex的情况下)
前三种是父子组件通讯,最后一种是平级组件.
- STL容器存储的内容动态分配情况下的内存管理
主要分两种情况:存储的内容是指针:存储的内容是实际对象. 看以下两段代码, typedef pair<VirObjTYPE, std::list<CheckID>*> VirO ...
- vue的中vuex为何需要mutation更新状态,vue-router的路由的理解
); ); ); history.back(); history.forward(); // 修改历史,包括二个方法pushState.replaceState二个方法(objState,title, ...
- Redux/Mobx/Akita/Vuex对比 - 选择更适合低代码场景的状态管理方案
近期准备开发一个数据分析 SDK,定位是作为数据中台向外输出数据分析能力的载体,前端的功能表现类似低代码平台的各种拖拉拽.作为中台能力的载体,SDK 未来很大概率会需要支持多种视图层框架,比如Vue2 ...
- Vue状态管理
1.导出Vuex import Vuex from 'vuex' 2.定义store /*状态管理*/ const store = new Vuex.Store({ state: { headerSh ...
- 状态管理之 Flux、Redux、Vuex、MobX(概念篇)
本文是对 Flux.Redux.Vuex.MobX 几种常用状态管理模式的总结,偏向于概念层面,不涉及过多代码. 状态管理 什么是状态管理? 状态管理就是,把组件之间需要共享的状态抽取出来,遵循特定的 ...
- vuex状态管理工具
父子组件之间的通信 props传递 父 向子单向传递:且每次 父组件更新时 子组件的props会跟着更新: 如果需要 子组件把数据传递给父组件,就需要在子组件上绑定自定事件 在子组件使用this ...
- Vue状态管理vuex
前面的话 由于多个状态分散的跨越在许多组件和交互间各个角落,大型应用复杂度也经常逐渐增长.为了解决这个问题,Vue提供了vuex.本文将详细介绍Vue状态管理vuex 引入 当访问数据对象时,一个 V ...
- 从壹开始前后端分离 [ Vue2.0+.NET Core2.1] 二十三║Vue实战:Vuex 其实很简单
前言 哈喽大家周五好,马上又是一个周末了,下周就是中秋了,下下周就是国庆啦,这里先祝福大家一个比一个假日嗨皮啦~~转眼我们的专题已经写了第 23 篇了,好几次都坚持不下去想要中断,不过每当看到群里的交 ...
随机推荐
- el-table中操作一栏怎么根据当前行的信息显示编辑、删除、编辑完成按钮
对每个按钮是否显示,使用v-show绑定变量,因为每一行的v-show绑定的变量必须是唯一的(不然的话操作此行,其他行的状态也会跟着变化),所以不可能提前在.ts中对变量进行初始化,只能使用本行的字段 ...
- [剑指Offer] 35.数组中的逆序对
题目描述 在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对.输入一个数组,求出这个数组中的逆序对的总数P.并将P对1000000007取模的结果输出. 即输出P%1000 ...
- delphi保存文件的命名规则
没有固定的标准.自己可以定义 .你可以参考PASCAL命名法则.查一下PASCAL命名. 我习惯用UMain,FMain,UDM,DM,UAboutBox,AboutBox.....程序相关内容都放在 ...
- hdu 2874 Connections between cities (并查集+LCA)
Connections between cities Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (J ...
- P2574 XOR的艺术
题目描述 AKN觉得第一题太水了,不屑于写第一题,所以他又玩起了新的游戏.在游戏中,他发现,这个游戏的伤害计算有一个规律,规律如下 1. 拥有一个伤害串为长度为n的01串. 2. 给定一个范围[l,r ...
- Noip2016滚粗记QAQ
day1 t1 XBG #include<map> #include<cstdio> #include<string> #include<string.h&g ...
- TYVJ 1035 / codevs 2171 棋盘覆盖
Problem Description 给定一个n * m的棋盘,已知某些各自禁止放置,求最多往棋盘上放多少长度为2宽度为1的骨牌(骨牌不重叠) Input 第一行为n,m(表示有m个删除的格子)第二 ...
- 莫比乌斯反演题表II
bzoj3994:[SDOI2015]约数个数和 **很好推+有个小结论bzoj3309:DZY Loves Math ***很好推+线筛某函数/卡常bzoj4816:[Sdoi2017]数字表格 * ...
- MySQL里执行SHOW INDEX结果中Cardinality的含义
今天在写一个Perl脚本,想自动化查找出MySQL数据库中可能无效的索引,于是根据朝阳的书上提到的一些规则,我来设计了一些判断方法,其中发现某个我想要的值就是SHOW INDEX FROM table ...
- Bash script: report largest InnoDB files
The following script will report the largest InnoDB tables under the data directory: schema, table & ...