您好,登錄后才能下訂單哦!
<input v-model="text" />
上例不過是一個語法糖,展開來是:
<input :value="text" @input="e => text = e.target.value" />
<my-dialog :visible.sync="dialogVisible" />
這也是一個語法糖,剝開來是:
<my-dialog :visible="dialogVisible" @update:visible="newVisible => dialogVisible = newVisible" />
my-dialog 組件在 visible 變化時 this.$emit('update:visible', newVisible)
即可。
Vue 在 2.2.0 版本以后,允許自定義組件的 v-model ,這就導致在 JSX / 渲染函數中實現 v-model 時得考慮組件的不同配置,不能一律如此(假使 my-dialog 組件的 model 為 { prop: 'visible', event: 'change' } ):
{ render(h) { return h('my-dialog', { props: { value: this.dialogVisible }, on: { input: newVisible => this.dialogVisible = newVisible } }) } }
而應如此:
{ render(h) { return h('my-dialog', { props: { visible: this.dialogVisible }, on: { change: newVisible => this.dialogVisible = newVisible } }) } }
然而,利用 model 屬性,完全可以做到不用管它 prop 、 event 的目的:
{ render(h) { return h('my-dialog', { model: { value: this.dialogVisible, callback: newVisible => this.dialogVisible = newVisible } }) } }
JSX 中這樣使用:
{ render() { return ( <my-dialog {...{ model: { value: this.dialogVisible, callback: newVisible => this.dialogVisible = newVisible } }} /> ) } }
有需求如此:開發一個 Prompt 組件,要求同步用戶的輸入,點擊按鈕可關閉彈窗。
一般我們會這樣做:
<template> <div v-show="_visible"> <div>完善個人信息</div> <div> <div>尊姓大名?</div> <input v-model="_answer" /> </div> <div> <button @click="_visible = !_visible">確認</button> <button @click="_visible = !_visible">取消</button> </div> </div> </template> <script> export default { name: 'prompt', props: { answer: String, visible: Boolean }, computed: { _answer: { get() { return this.answer }, set(value) { this.$emit('input', value) } }, _visible: { get() { return this.visible }, set(value) { this.$emit('update:visible', value) } } } } </script>
寫一兩個組件還好,組件規模一旦擴大,寫雙向綁定真能寫出毛病來。于是,為了解放生產力,有了 vue-better-sync 這個輪子,且看用它如何改造我們的 Prompt 組件:
<template> <div v-show="actualVisible"> <div>完善個人信息</div> <div> <div>尊姓大名?</div> <input v-model="actualAnswer" /> </div> <div> <button @click="syncVisible(!actualVisible)">確認</button> <button @click="syncVisible(!actualVisible)">取消</button> </div> </div> </template> <script> import VueBetterSync from 'vue-better-sync' export default { name: 'prompt', mixins: [ VueBetterSync({ prop: 'answer', // 設置 v-model 的 prop event: 'input' // 設置 v-model 的 event }) ], props: { answer: String, visible: { type: Boolean, sync: true // visible 屬性可用 .sync 雙向綁定 } } } </script>
vue-better-sync 統一了 v-model 和 .sync 傳遞數據的方式,你只需 this.actual${PropName} = newValue
或者 this.sync${PropName}(newValue)
即可將新數據傳遞給父組件。
GitHub: fjc0k/vue-better-sync
總結
以上所述是小編給大家介紹的Vue 實現雙向綁定的四種方法,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對億速云網站的支持!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。