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 相关文章推荐
ASP中进行HTML数据及JS数据编码函数
Nov 11 Javascript
window.event快达到全浏览器支持了,以后使用就方便了
Nov 30 Javascript
Jquery 切换不同图片示例代码
Dec 05 Javascript
浅析Cookie中的Path与domain
Dec 18 Javascript
jquery结婚电子请柬特效源码分享
Aug 21 Javascript
jQuery+HTML5美女瀑布流布局实现方法
Sep 21 Javascript
JS实现新浪博客左侧的Blog管理菜单效果代码
Oct 22 Javascript
基于JavaScript实现的希尔排序算法分析
Apr 14 Javascript
xmlplus组件设计系列之分隔框(DividedBox)(8)
May 02 Javascript
Javascript创建类和对象详解
May 31 Javascript
Vue2.0点击切换类名改变样式的方法
Aug 22 Javascript
JavaScript中this的学习笔记及用法整理
Feb 17 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脚本中include文件出错解决方法
2008/11/20 PHP
php download.php实现代码 跳转到下载文件(response.redirect)
2009/08/26 PHP
php中定时计划任务的实现原理
2013/01/08 PHP
基于jquery自定义图片热区效果
2012/07/21 Javascript
javascript 使用 NodeList需要注意的问题
2013/03/04 Javascript
javascript重写alert方法的实例代码
2013/03/29 Javascript
JQuery判断子iframe何时加载完成解决方案
2013/08/20 Javascript
JS生成随机字符串的多种方法
2014/06/10 Javascript
使用DNode实现php和nodejs之间通信的简单实例
2015/07/06 NodeJs
字符串反转_JavaScript
2016/04/28 Javascript
jQuery处理XML文件的几种方法
2016/06/14 Javascript
NW.js 简介与使用方法
2018/02/01 Javascript
JavaScript设计模式之装饰者模式定义与应用示例
2018/07/25 Javascript
vue项目打包部署到服务器的方法示例
2018/08/27 Javascript
vue-cli 引入jQuery,Bootstrap,popper的方法
2018/09/03 jQuery
vue实现设置载入动画和初始化页面动画效果
2019/10/28 Javascript
JS精确判断数据类型代码实例
2019/12/18 Javascript
JS数组Reduce方法功能与用法实例详解
2020/04/29 Javascript
用vue写一个日历
2020/11/02 Javascript
Vue常用API、高级API的相关总结
2021/02/02 Vue.js
[01:01:23]完美世界DOTA2联赛PWL S2 Forest vs FTD.C 第一场 11.26
2020/11/30 DOTA
利用python-pypcap抓取带VLAN标签的数据包方法
2019/07/23 Python
python3的数据类型及数据类型转换实例详解
2019/08/20 Python
Python生态圈图像格式转换问题(推荐)
2019/12/02 Python
CSS3实现曲线阴影和翘边阴影
2016/05/03 HTML / CSS
Booking.com美国:全球酒店预订网站
2017/04/18 全球购物
美国最佳选择产品网站:Best Choice Products
2019/05/27 全球购物
Seavenger官网:潜水服、浮潜、靴子和袜子
2020/03/05 全球购物
中层干部岗位职责
2013/12/18 职场文书
中学教师自我鉴定
2014/02/07 职场文书
珍惜时间演讲稿
2014/05/14 职场文书
2015年保卫科工作总结
2015/05/14 职场文书
《秋天的雨》教学反思
2016/02/19 职场文书
2016年社区植树节活动总结
2016/03/16 职场文书
干货分享:推荐信写作技巧!
2019/06/21 职场文书
导游词之晋城蟒河
2019/12/12 职场文书