文章目录

  • 属性&事件传值双向绑定
  • v-model组件双向绑定
  • .sync修饰符双向绑定
  • 总结

!!!这边文章记录的是 vue2 的概念,vue3 对双向绑定进行了改动,不要把一下代码放到 vue3 中运行。vue3 双向绑定的改动参考 这里

作者:玄晓乌屋
最后更新时间:2019/6/25

vue 自定义组件双向绑定没有直接一步到位的方式,全都是是通过属性传值和事件传值实现的。v-model 不能直接支持组件的双向绑定。

属性&事件传值双向绑定

这种方式最复杂,也最容易理解,前提是需要深刻理解事件传值和属性传值。
新建一个组件 Com.vue

<template><!-- 单项绑定props值到value --><!-- 监听input事件,提交组件事件myInput并传递更新的值 --><input :value="query" @input="$emit('myInput',$event.target.value)">
</template>
<script>
export default {// 获取props值props: ['query']
}
</script>

新建一个 .vue 文件引入 Com.vue 组件并调用:

<template><div id="home"><!-- 传递query给Com组件,并设置myInput事件更新当前组件的query --><Com :query="query" @myInput="val => query=val"/>{{query}}</div>
</template><script>
import Com from '../components/Com'
export default {components: { Com },data() {return {query: null}}
}
</script>

解释:
这种通过事件和组件传值的方式并不难,就是在父组件中传值给子组件,并设置一个事件。
子组件获取到值后先单项绑定到某个地方,上面绑到了 input 元素中,在 input 元素中通过监听 input 事件来提交组件事件 myInput 。如果学过 react ,这就是简单的状态提升。

总结:属性&事件传值双向绑定可控性很好,支持多个数据的双向绑定,但是复杂和凌乱,单个数据可以使用,但是多个数据会造成代码可读性很低,不实用。

v-model组件双向绑定

官方对v-model指令做了一些准备工作,和上述 属性&事件传值的双向绑定 相比:
v-model 默认传递一个名为 value的值和默认绑定一个名为input的事件更新这个值。
注意:使用v-model时,默认属性和事件名是固定的valueinput
如下:

<template><div id="home"><Com v-model="query"/><Com :value="query" @input="v => query=v"/><!-- 上面两行等价 -->{{query}}</div>
</template>

实现:
修改 Com.vue 文件如下:

<template><!-- 单项绑定value --><!-- 监听input事件提交组件事件input,注意这两个input不一样了,前一个是<input/>元素的事件,后一个是组件的事件 --><input :value="value" @input="$emit('input',$event.target.value)">
</template>
<script>
export default {// 这个值改成valueprops: ['value']
}
</script>

新建任意 .vue 文件引入 Com.vue 组件:

<template><div id="home"><Com v-model="query"/><Com :value="query" @input="v => query=v"/><!-- 上面两行等价 -->{{query}}</div>
</template><script>
import Com from '../components/Com'
export default {components: { Com },data() {return {query: null}}
}
</script>

此时在页面上有两个input框,两边的值都绑定同一个值query
如图:

总结:v-model 虽然简化了 属性&事件传值双向绑定 的模式,但是只能传一个值,并且传递固定属性 value 和固定触发事件input,只适用于传单个值的组件,比如常见的表单组件。

.sync修饰符双向绑定

.sync修饰符简化了 属性&事件传值的双向绑定 的模式,虽然比v-model的方式稍微麻烦点,但是支持多个数据在组件上双向绑定。
使用.sync修饰符修饰一个单项绑定到组件的属性,会默认绑定一个update:myPropName的事件,myPropName是绑定的属性名。
修改 Com.vue 组件如下:

<template><!-- 监听input事件,提交.sync修饰符提供的update:<myPropName>事件 --><input :value="value" @input="$emit('update:value',$event.target.value)">
</template>
<script>
export default {props: ['value']
}
</script>

新建一个 .vue 文件引入 Com.vue 并使用:

<template><div id="home"><Com :value.sync="query"/>{{query}}</div>
</template><script>
import Com from '../components/Com'
export default {components: { Com },data() {return {query: null}}
}
</script>

上述方式依旧可以实现双向数据绑定。
总结:实用简单,代码可读性较好,可控性好,可以支持多个数据的双向数据绑定。

总结

以上提供3种方式,属性&事件传值双向绑定比较复杂,但是逻辑清晰,是组件双向数据绑定的核心。v-model组件双向绑定简单,适用于单个数据。.sync修饰符双向绑定可控性好,适用于多个属性双向绑定。

vue 自定义组件双向数据绑定相关推荐

  1. Vue + editor.Md 双向数据绑定Markdown编辑器(vue-editormd-wrap)

    Vue + editor.Md 双向数据绑定组件(vue-editormd-wrap) 先贴上组件的npm主页和源码,如果有下载了开发过程中build版本的用户,将无法使用,请更新为最新版就可以正常使 ...

  2. Vue自定义组件 Vue.component

    Vue.component Vue自定义组件(1) 如果有朋友对Vue基础还不够了解的可以先看下官方的教程 http://doc.vue-js.com/v2/guide/  这个是官方的网址,官方的教 ...

  3. Vue自定义组件并引入

    今天,bug菌为大家带来一期帝王级干货,有关于前端vue的组件教学,深入指引大家在vue中如何创建自定义的组件,并且在vue中引入你自定义的组件: 具有很好的教学价值,希望小伙伴们根据这篇文章可以有所 ...

  4. [vue] vue父子组件双向绑定的方法有哪些?

    [vue] vue父子组件双向绑定的方法有哪些? 1.利用对象的引用关系来实现 2.父子组件之间的数据传递 3.使用.sync修饰符 个人简介 我是歌谣,欢迎和大家一起交流前后端知识.放弃很容易, 但 ...

  5. vue自定义组件,插槽,自定义事件

    vue组件套娃 1. vue自定义组件 2. 组件和插槽套娃 3. vue组件通过自定义事件更改vue实例中的数据 1. vue自定义组件 语法 Vue.component('自定义组件名', {pr ...

  6. vue 嵌套表格组件_使用form-create动态生成vue自定义组件和嵌套表单组件

    使用form-create动态生成vue自定义组件和嵌套表单组件 maker.create 通过建立一个虚拟 DOM的方式生成自定义组件 生成 Maker let rule = [ formCreat ...

  7. vue自定义组件是.vue还是html,Vue自定义组件的四种方式示例详解

    四种组件定义方式都存在以下共性(血泪史) 规则: 1.组件只能有一个根标签 2.记住两个词全局和局部 3.组件名称命名中'-小写字母'相当于大写英文字母(hello-com 相当于 helloCom) ...

  8. 关于datetimepicker和vue v-model指令双向数据绑定失败的问题

    关于datetimepicker和vue v-model指令双向数据绑定失败的问题 1,v-model监听用户输入事件以更新数据,并特别处理一些极端的例子.这是v-model指令的解释. 2,解决方案 ...

  9. Vue自定义组件封装及使用Excel

    Vue自定义组件封装及使用Excel 一.js-xlsx 组件安装 二. 创建vue组件 三.使用 四.效果图 一.js-xlsx 组件安装 npm install xlsx --savenpm in ...

最新文章

  1. eclipse--各类型版本包含插件比较
  2. https HttpsURLConnection请求的单向认证
  3. R语言实战应用精讲50篇(二十七)-时空数据分析-经验空间/时间均值(latex公式+R代码绘图)
  4. 计算机科学与技术专业导向ppt,计算机科学与技术专业导向讲座 第讲.ppt
  5. ubuntu20.04屏幕闪烁与分辨率的问题
  6. 阿里的盔甲、未来20年发展的动力以及对未来的洞察
  7. “not a single-group group function”
  8. Java中单例模式—饿汉式和懒汉式
  9. app.use(express.static)设置静态文件目录小解
  10. git rm -r --cached_程序员一定能用到的git命令:分支+暂存+回退+标签+创建项目仓库...
  11. 利用DOSBox运行汇编超详细步骤
  12. vscode 路径宏_VSCode宏怎么设置?VSCode宏的添加方法!
  13. 如何让网站被百度快速收录
  14. Delphi中BeginUpdate和EndUpdate作用
  15. C# + opengl + Tao 环境配置
  16. 增量式编码器和绝对式编码器的介绍
  17. linux系统制作usb启动盘,教你制作Linux操作系统的USB启动盘
  18. TouchScript中文---The Journey of a Touch Point
  19. 非标准分布随机数生成 - 逆变换ITM与舍选法Rejection
  20. nisi安装包 打印日志语法_NSIS 打包脚本基础

热门文章

  1. 华为nova9鸿蒙系统使用录屏
  2. 泡泡堂网络游戏的设计与实现
  3. cortana无法正确工作解决方案
  4. MySQL的概念与常用的SQL语句
  5. 记录html+css制作一个上下跳动效果的动画
  6. 云计算机怎么打游戏,云即玩游戏盒该如何使用 云即玩游戏盒电脑版的使用方法...
  7. PostgreSQL pg_dump 与 pg_restore 命令
  8. 2022年最新天津机动车签字授权人模拟试题及答案
  9. 如何在kernel中得到cpu的电压和频率
  10. 如何用5分钟绘制剪纸风插画?