vuex和表单
当使用vue构建大型应用时,使用vuex管理一部分状态是很好的选择。
但是因为vuex的状态要通过mutation handler改变,这就意味着在表单中无法使用v-model的双向绑定。
处理方式主要有以下2种。
使用:value而不是v-model
这个方法是官方文档里给出来的,具体方法如下:
1
<input :value="person.name" @input="updatePersonName" />
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
// ...
import { updatePerson } from '../vuex/person/actions';
// ...
vuex: {
getters: {
person({ person }) {
return person;
}
},
actions: {
updatePerson
}
},
methods: {
updatePersonName(e) {
this.updatePerson('name', e.target.value);
}
}
// ...
这个方法在使用中文输入法会存在问题,所以为了处理好中文输入,需要考虑其他方法。
使用临时变量和v-model
另一个方法是使用临时变量和v-model,这是我更喜欢使用的方法。
1
<input v-model="tmpName" @input="updatePersonName" />
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
// ...
import { updatePerson } from '../vuex/person/actions';
// ...
data() {
return {
tmpName: ''
};
},
vuex: {
getters: {
person({ person }) {
return person;
}
},
actions: {
updatePerson
}
},
methods: {
updatePersonName() {
this.updatePerson('name', this.tmpName);
}
},
ready() {
this.tmpName = this.person.name;
}
// ...
这个方法和上一个方法主要有3处不同:
- 使用
v-model进行双向绑定 - 使用临时变量存储要改变的状态
- 在组件生命周期的
ready阶段给临时变量赋值