Vue 实现双向绑定的四种方法


Posted in Javascript onMarch 16, 2018

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 组件,要求同步用户的输入,点击按钮可关闭弹窗。

Vue 实现双向绑定的四种方法

一般我们会这样做:

<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 实现双向绑定的四种方法,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Javascript 相关文章推荐
javascript 无提示关闭窗口脚本
Aug 17 Javascript
javascript中字符串替换函数replace()方法与c# 、vb 替换有一点不同
Jun 25 Javascript
extjs grid设置某列背景颜色和字体颜色的实现方法
Sep 06 Javascript
javascript修改IMG标签的src问题
Mar 28 Javascript
jQuery中even选择器的定义和用法
Dec 23 Javascript
酷! 不同风格页面布局幻灯片特效js实现
Feb 19 Javascript
Node.js设置CORS跨域请求中多域名白名单的方法
Mar 28 Javascript
关于vuex的学习实践笔记
Apr 05 Javascript
pace.js和NProgress.js两个加载进度插件的一点小总结
Jan 31 Javascript
React Native 自定义下拉刷新上拉加载的列表的示例
Mar 01 Javascript
JS实现调用本地摄像头功能示例
May 18 Javascript
vue强制刷新组件的方法示例
Feb 28 Javascript
p5.js入门教程之鼠标交互的示例
Mar 16 #Javascript
JS匿名函数和匿名自执行函数概念与用法分析
Mar 16 #Javascript
解决npm管理员身份install时出现权限的问题
Mar 16 #Javascript
vue-router相关基础知识及工作原理
Mar 16 #Javascript
axios post提交formdata的实例
Mar 16 #Javascript
在vue组件中使用axios的方法
Mar 16 #Javascript
axios发送post请求,提交图片类型表单数据方法
Mar 16 #Javascript
You might like
PHP+.htaccess实现全站静态HTML文件GZIP压缩传输(一)
2007/02/15 PHP
php+mysqli批量查询多张表数据的方法
2015/01/29 PHP
PHP5.2中PDO的简单使用方法
2016/03/25 PHP
实例讲解PHP表单验证功能
2019/02/15 PHP
php并发加锁问题分析与设计代码实例讲解
2021/02/26 PHP
javascript编程起步(第七课)
2007/01/10 Javascript
JavaScript 开发中规范性的一点感想
2009/06/23 Javascript
Jquery.TreeView结合ASP.Net和数据库生成菜单导航条
2010/08/27 Javascript
js实现弹窗插件功能实例代码分享
2013/12/12 Javascript
jQuery手动点击实现图片轮播特效
2020/04/20 Javascript
修改node.js默认的npm安装目录实例
2018/05/15 Javascript
Javascript实现时间倒计时功能
2018/11/17 Javascript
解决vue组件props传值对象获取不到的问题
2019/06/06 Javascript
学习LayUI时自研的表单参数校验框架案例分析
2019/07/29 Javascript
详解微信小程序入门从这里出发(登录注册、开发工具、文件及结构介绍)
2020/07/21 Javascript
[00:58]2016年国际邀请赛勇士令状宣传片
2016/06/01 DOTA
探寻python多线程ctrl+c退出问题解决方案
2014/10/23 Python
Python中pygal绘制雷达图代码分享
2017/12/07 Python
Python抽象和自定义类定义与用法示例
2018/08/23 Python
Python模拟百度自动输入搜索功能的实例
2019/02/14 Python
Python3模拟登录操作实例分析
2019/03/12 Python
Python创建或生成列表的操作方法
2019/06/19 Python
Python列表与元组的异同详解
2019/07/02 Python
Python udp网络程序实现发送、接收数据功能示例
2019/12/09 Python
Python 3.8 新功能大揭秘【新手必学】
2020/02/05 Python
联想德国官网:Lenovo Germany
2018/07/04 全球购物
美国领先的宠物用品和宠物食品零售商:Petco
2020/10/28 全球购物
给排水工程师岗位职责
2013/11/21 职场文书
揭牌仪式策划方案
2014/05/28 职场文书
运动会拉拉队口号
2014/06/09 职场文书
学校运动会广播稿100条
2014/09/14 职场文书
单位工作证明格式模板
2014/10/04 职场文书
安全保证书
2015/01/16 职场文书
看上去很美观后感
2015/06/10 职场文书
编写python程序的90条建议
2021/04/14 Python
JavaWeb 入门:Hello Servlet
2021/07/16 Java/Android