v-model 最好用的就是配合 data 達(dá)成 Two-way Binding,但若使用 Vuex 之後,是否還能使用 v-model 搭配 state 繼續(xù) Two-way Binding 呢 ?

創(chuàng)新互聯(lián)專注于寶興企業(yè)網(wǎng)站建設(shè),響應(yīng)式網(wǎng)站設(shè)計(jì),商城網(wǎng)站開發(fā)。寶興網(wǎng)站建設(shè)公司,為寶興等地區(qū)提供建站服務(wù)。全流程定制網(wǎng)站制作,專業(yè)設(shè)計(jì),全程項(xiàng)目跟蹤,創(chuàng)新互聯(lián)專業(yè)和態(tài)度為您提供的服務(wù)
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 標(biāo)準(zhǔn)寫法,直接將 <input> 綁定到 name data。
Value vs. Input
但若將 name data 提升到 Vuex 的 name state 之後,就沒這麼簡(jiǎn)單了。
Vuex 強(qiáng)調(diào)的是 Unidirection Dataflow, state 只能被讀取,要寫入 state 必須靠 mutation ,因此 v-model 無(wú)法直接寫入 state 。
v-model 本質(zhì)是 value property binding 與 input event 的 syntatic sugar,因此可以回歸基本動(dòng)作,使用 value 與 input 實(shí)現(xiàn)。
HelloWorld.vue
<template>
<div>
<div>
<input type="text" :value="name" @input="onInputName">
</div>
<div>
{{ name }}
</div>
</div>
</template>
<script>
import { mapState } from 'vuex';
/** computed */
const computed = mapState(['name']);
/** methods */
const onInputName = function(e) {
this.$store.commit('setName', e.target.value);
};
const methods = {
onInputName,
};
export default {
name: 'HelloWorld',
computed,
methods,
};
</script>第 4 行
<input type="text" :value="name" @input="onInputName">
將 name 綁定到 value ,將 onInputName() 綁定到 input event。
16 行
const computed = mapState(['name']);
從 name state 建立 name computed。
19 行
const onInputName = function(e) {
this.$store.commit('setName', e.target.value);
};定義 onInputName() ,負(fù)責(zé)接收 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,
});很標(biāo)準(zhǔn)的 Vuex 寫法,由 setName mutation 負(fù)責(zé)修改 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>
/** computed */
const name = {
get() {
return this.$store.state.name;
},
set(value) {
this.$store.commit('setName', value);
},
};
const computed = {
name,
};
export default {
name: 'HelloWorld',
computed,
};
</script>第 4 行
<input type="text" v-model="name">
v-model 回來了,但綁定的是 name computed,而不是 name data。
14 行
const name = {
get() {
return this.$store.state.name;
},
set(value) {
this.$store.commit('setName', value);
},
}
建立 name computed,為了讓 v-model 能運(yùn)作,特別將 name computed 加上 setter。
透過有 setter 的 computed,我們就能繼續(xù)使用 v-model 了。
Conclusion
雖然使用 value vs. input 寫法也行,但 v-model vs. computed with setter 寫法更優(yōu)雅,實(shí)務(wù)上建議用此
Sample Code
完整的範(fàn)例可以在我的 GitHub 上找到
Reference
Vuex , Form Handling
總結(jié)
以上所述是小編給大家介紹的Vuex 使用 v-model 配合 state的方法 ,希望對(duì)大家有所幫助,如果大家有任何疑問請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)創(chuàng)新互聯(lián)網(wǎng)站的支持!
網(wǎng)站題目:Vuex使用v-model配合state的方法
網(wǎng)站URL:http://www.chinadenli.net/article34/iphspe.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供軟件開發(fā)、搜索引擎優(yōu)化、關(guān)鍵詞優(yōu)化、品牌網(wǎng)站建設(shè)、微信小程序、面包屑導(dǎo)航
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)