Vuex 使用 v-model 配合 state的方法
v-model 最好用的就是配合 data 達成 Two-way Binding,但若使用 Vuex 之後,是否還能使用 v-model 搭配 state 繼續 Two-way Binding 呢 ?
Version
Vue 2.5.17
Vuex 3.0.1
V-model vs. Data
HelloWorld.vue
<template> <div> <div> <input type="text" v-model="name"> </div> <div> {{ name }} </div> </div> </template> <script> / data / const data = function() { return { name: '', }; }; export default { name: 'HelloWorld', data, }; </script>
Vue 的 v-model 標準寫法,直接將 <input> 綁定到 name data。
Value vs. Input
但若將 name data 提升到 Vuex 的 name state 之後,就沒這麼簡單了。
Vuex 強調的是 Unidirection Dataflow, state 只能被讀取,要寫入 state 必須靠 mutation , v-model 無法直接寫入 state 。
v-model 本質是 value property binding 與 input event 的 syntatic sugar,可以回歸基本動作,使用 value 與 input 實現。
HelloWorld.vue
<template> <div> <div> <input type="text" :value="name" @input="onInputName"> </div> <div> {{ name }} </div> </div> </template> <script> import { mapState } from 'vuex'; / puted / const puted = mapState(['name']); / methods / const onInputName = function(e) { this.$store.mit('setName', e.target.value); }; const methods = { onInputName, }; export default { name: 'HelloWorld', puted, methods, }; </script>
第 4 行
<input type="text" :value="name" @input="onInputName">
將 name 綁定到 value ,將 onInputName() 綁定到 input event。
16 行
const puted = mapState(['name']);
從 name state 建立 name puted。
19 行
const onInputName = function(e) { this.$store.mit('setName', e.target.value); };
定義 onInputName()
,負責接收 input event,呼叫 setName mutations 修改 name state。
store.js
import Vue from 'vue'; import Vuex from 'vuex'; Vue.use(Vuex); / state / const state = { name: '', }; / mutations / const setName = (state, payload) => state.name = payload; const mutations = { setName, }; export default new Vuex.Store({ strict: true, state, mutations, });
很標準的 Vuex 寫法,由 setName mutation 負責修改 name state。
這種寫法雖然可行,但似乎喪失了原本 v-model 的特色,又必須走回頭路使用 event
V-model vs. Computed with Setter
HelloWorld.vue
<template> <div> <div> <input type="text" v-model="name"> </div> <div> {{ name }} </div> </div> </template> <script> / puted / const name = { get() { return this.$store.state.name; }, set(value) { this.$store.mit('setName', value); }, }; const puted = { name, }; export default { name: 'HelloWorld', puted, }; </script>
第 4 行
<input type="text" v-model="name">
v-model 回來了,但綁定的是 name puted,而不是 name data。
14 行
const name = { get() { return this.$store.state.name; }, set(value) { this.$store.mit('setName', value); }, }
建立 name puted,為了讓 v-model 能運作,特別將 name puted 加上 setter。
- get() 負責從 name state 抓資料
- set() 負責呼叫 setName mutation 寫入 state
透過有 setter 的 puted,我們就能繼續使用 v-model 了。
Conclusion
雖然使用 value vs. input 寫法也行,但 v-model vs. puted with setter 寫法更優雅,實務上建議用此
Sample Code
完整的範例可以在我的 上找到
Reference
以上所述是长沙网络推广给大家介绍的Vuex 使用 v-model 配合 state的方法 ,希望对大家有所帮助,如果大家有任何疑问请给我留言,长沙网络推广会及时回复大家的。在此也非常感谢大家对狼蚁SEO网站的支持!
编程语言
- 宿迁百度关键词排名指南:实现精准营销的关键
- 四川SEO优化怎么做网络推广
- 立昂技术备案老域名收购:如何为您的业务赋能
- 安徽百度关键词seo贵不贵,一般需要多少钱
- 吉林百度快照排名怎么做电话营销
- 多伦新手做SEO怎么做
- 甘肃优化关键词排名推广怎么做论坛营销
- 沙雅SEO网站推广:提升您的在线可见性
- 四川SEO优化如何提升销售额和销售量
- 聂荣网站排名优化:提升网站可见性的全方位指
- 涞水SEO:提升地方企业在线可见性的策略
- 辽宁百度seo排名怎样做网站排名
- 临湘哪有关键词排名优化:提升网站可见度的关
- 黑龙江百度网站优化有没有优惠
- 凉城优化关键词排名推广:提升您的网络可见性
- 萝北整站优化:提升您网站流量和排名的全面指