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下操作css的float属性的特殊写法
Aug 22 Javascript
JQuery 将元素显示在屏幕的中央的代码
Feb 27 Javascript
Chrome Form多次提交表单问题的解决方法
May 09 Javascript
用js模拟struts2的多action调用示例
May 19 Javascript
JQuery 两种方法解决刚创建的元素遍历不到的问题
Apr 13 Javascript
解决前端跨域问题方案汇总
Nov 20 Javascript
JS触摸事件、手势事件详解
May 04 Javascript
js轮播图无缝滚动效果
Jun 17 Javascript
node使用UEditor富文本编辑器的方法实例
Jul 11 Javascript
js 两个日期比较相差多少天的实例
Oct 19 Javascript
深入分析element ScrollBar滚动组件源码
Jan 22 Javascript
vue.js实现备忘录demo
Jun 26 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
漫荒推荐:画风超赞的国风漫画推荐 超长假期不无聊
2020/03/08 国漫
php csv操作类代码
2009/12/14 PHP
ThinkPHP验证码使用简明教程
2014/03/05 PHP
简单分析ucenter 会员同步登录通信原理
2014/08/25 PHP
Laravel4中的Validator验证扩展用法详解
2016/07/26 PHP
thinkPHP简单导入和使用阿里云OSSsdk的方法
2017/03/15 PHP
ImageFlow可鼠标控制图片滚动
2008/01/30 Javascript
浅谈javascript的数据类型检测
2010/07/10 Javascript
JavaScript保留两位小数的2个自定义函数
2014/05/05 Javascript
使用jQuery实现返回顶部
2015/01/26 Javascript
Jquery实现遮罩层的方法
2015/06/08 Javascript
AngularJS入门之动画
2016/07/27 Javascript
Backbone View 之间通信的三种方式
2016/08/09 Javascript
element ui table(表格)实现点击一行展开功能
2018/12/04 Javascript
详解实现一个通用的“划词高亮”在线笔记功能
2019/04/23 Javascript
vue 解决文本框被键盘遮住的问题
2019/11/06 Javascript
vue实现移动端项目多行文本溢出省略
2020/07/29 Javascript
Python3实现将文件归档到zip文件及从zip文件中读取数据的方法
2015/05/22 Python
Python中使用asyncio 封装文件读写
2016/09/11 Python
python2.7 mayavi 安装图文教程(推荐)
2017/06/22 Python
python 接口_从协议到抽象基类详解
2017/08/24 Python
Python实现文件内容批量追加的方法示例
2017/08/29 Python
在Python程序员面试中被问的最多的10道题
2017/12/05 Python
python中将zip压缩包转为gz.tar的方法
2018/10/18 Python
Python 列表反转显示的四种方法
2020/11/16 Python
使用CSS3制作一个简单的Chrome模拟器
2015/07/15 HTML / CSS
html5使用canvas绘制太阳系效果
2014/12/15 HTML / CSS
玩具反斗城美国官网:Toys"R"Us
2016/09/17 全球购物
SmartBuyGlasses比利时:购买品牌太阳镜和眼镜
2019/08/09 全球购物
网络工程师个人的自我评价范文
2013/10/01 职场文书
生物科学系大学生的自我评价
2013/12/20 职场文书
高一课前三分钟演讲稿
2014/09/13 职场文书
逃课打麻将检讨书
2014/10/05 职场文书
面试通知单大全
2015/04/20 职场文书
超市店长竞聘书
2015/09/15 职场文书
python数字图像处理:图像的绘制
2022/06/28 Python