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 相关文章推荐
JS弹出对话框返回值代码(asp.net后台)
Dec 28 Javascript
Table冻结表头示例代码
Aug 20 Javascript
顶部缓冲下拉菜单导航特效的JS代码
Aug 27 Javascript
js 时间格式与时间戳的相互转换示例代码
Dec 25 Javascript
小结Node.js中非阻塞IO和事件循环
Sep 18 Javascript
JavaScript实现俄罗斯方块游戏过程分析及源码分享
Mar 23 Javascript
【经典源码收藏】基于jQuery的项目常见函数封装集合
Jun 07 Javascript
jQuery下拉框的简单应用
Jun 24 Javascript
jquery+Jscex打造游戏力度条
Sep 12 Javascript
JavaScript实现单例模式实例分享
Dec 22 Javascript
Vue项目中配置pug解析支持
May 10 Javascript
ant-design-vue 快速避坑指南(推荐)
Jan 21 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访问查询mysql数据的三种方法
2006/10/09 PHP
php数据访问之查询关键字
2016/05/09 PHP
php实现的三个常用加密解密功能函数示例
2017/11/06 PHP
短信提示使用 特效
2007/01/19 Javascript
JavaScript 事件对象的实现
2009/07/13 Javascript
JavaScript window.location对象
2014/11/14 Javascript
jQuery实现的漂亮表单效果代码
2015/08/18 Javascript
js+css实现超简洁的二级下拉菜单效果代码
2015/09/07 Javascript
Javascript实现图片加载从模糊到清晰显示的方法
2016/06/21 Javascript
jQuery解决input元素的blur事件和其他非表单元素的click事件冲突问题
2016/08/15 Javascript
Seajs是什么及sea.js 由来,特点以及优势
2016/10/13 Javascript
jquery+css实现下拉列表功能
2017/09/03 jQuery
使用InstantClick.js让页面提前加载200ms
2017/09/12 Javascript
JavaScript设计模式之调停者模式实例详解
2018/02/03 Javascript
Javascript 编码约定(编码规范)
2018/03/11 Javascript
Vue源码解析之数组变异的实现
2018/12/04 Javascript
微信公众号平台接口开发 获取access_token过程解析
2019/08/14 Javascript
微信小程序转发事件实现解析
2019/10/22 Javascript
判断JavaScript中的两个变量是否相等的操作符
2019/12/21 Javascript
ES6中Set和Map用法实例详解
2020/03/02 Javascript
Vue页面手动刷新,实现导航栏激活项还原到初始状态
2020/08/06 Javascript
vue自定义组件(通过Vue.use()来使用)即install的用法说明
2020/08/11 Javascript
[34:39]Secret vs VG 2018国际邀请赛淘汰赛BO3 第二场 8.23
2018/08/24 DOTA
在Python的web框架中配置app的教程
2015/04/30 Python
Python模块WSGI使用详解
2018/02/02 Python
Python3实现购物车功能
2018/04/18 Python
解决python升级引起的pip执行错误的问题
2018/06/12 Python
Python爬虫常用小技巧之设置代理IP
2018/09/13 Python
Python 一键获取百度网盘提取码的方法
2019/08/01 Python
Python迷宫生成和迷宫破解算法实例
2019/12/24 Python
Python单元测试及unittest框架用法实例解析
2020/07/09 Python
澳大利亚女士时装在线:Rockmans
2018/09/26 全球购物
为什么会有内存对齐
2016/10/10 面试题
幼儿园大班新学期寄语
2014/01/18 职场文书
公安机关党的群众路线教育实践活动剖析材料
2014/10/10 职场文书
学习作风建设心得体会
2014/10/22 职场文书