這次帶給大家Vue實現雙向綁定方法總結,Vue實現雙向綁定的注意事項有哪些,下面就是實戰案例,一起來看一下。
#<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> <p v-show="_visible"> <p>完善个人信息</p> <p> <p>尊姓大名?</p> <input v-model="_answer" /> </p> <p> <button @click="_visible = !_visible">确认</button> <button @click="_visible = !_visible">取消</button> </p> </p> </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> <p v-show="actualVisible"> <p>完善个人信息</p> <p> <p>尊姓大名?</p> <input v-model="actualAnswer" /> </p> <p> <button @click="syncVisible(!actualVisible)">确认</button> <button @click="syncVisible(!actualVisible)">取消</button> </p> </p> </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
相信看了本文案例你已經掌握了方法,更多精彩請關注php中文網其它相關文章!
推薦閱讀:
以上是Vue實作雙向綁定方法總結的詳細內容。更多資訊請關注PHP中文網其他相關文章!