视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
Vue实现双向绑定的四种方法
2020-11-27 19:44:23 责编:小采
文档
 这篇文章主要介绍了Vue 实现双向绑定的四种方法,非常不错,具有参考借鉴价值,需要的朋友参考下吧

1. v-model 指令

<input v-model="text" />

上例不过是一个语法糖,展开来是:

<input
 :value="text"
 @input="e => text = e.target.value"
/>

2. .sync 修饰符

<my-dialog :visible.sync="dialogVisible" />

这也是一个语法糖,剥开来是:

<my-dialog
 :visible="dialogVisible"
 @update:visible="newVisible => dialogVisible = newVisible"
/>

my-dialog 组件在 visible 变化时 this.$emit('update:visible', newVisible) 即可。

3. model 属性 (JSX/渲染函数中)

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
 }
 }}
 />
 )
 }
}

4. vue-better-sync 插件

有需求如此:开发一个 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>

上面是我整理给大家的,希望今后会对大家有帮助。

相关文章:

jQuery+Cookie实现切换皮肤功能

jQuery实现的回车触发按钮事件功能示例

基于jQuery实现Ajax验证用户名是否可用实例

下载本文
显示全文
专题