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 相关文章推荐
input 高级限制级用法
Mar 26 Javascript
6个DIV 135或246间隔一秒轮番显示效果
Jul 24 Javascript
输入框过滤非数字的js代码
Sep 18 Javascript
JavaScript日期类型的一些用法介绍
Mar 02 Javascript
跟我学习javascript的prototype使用注意事项
Nov 17 Javascript
JS实现在文本指定位置插入内容的简单示例
Dec 22 Javascript
详解js的作用域、预解析机制
Feb 05 Javascript
JS如何获取地址栏的参数实例讲解
Oct 06 Javascript
关于layui的下拉搜索框异步加载数据的解决方法
Sep 28 Javascript
Vue自定义指令结合阿里云OSS优化图片的实现方法
Nov 12 Javascript
Vue组件模板的几种书写形式(3种)
Feb 19 Javascript
微信小程序换肤功能实现代码(思路详解)
Aug 25 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开源开发框架ZendFramework使用中常见问题说明及解决方案
2014/06/12 PHP
php生成数字字母的验证码图片
2015/07/14 PHP
WordPress中创建用户角色的相关PHP函数使用详解
2015/12/25 PHP
关于PHP定时发送服务的解决办法
2017/04/23 PHP
Laravel框架Eloquent ORM简介、模型建立及查询数据操作详解
2019/12/04 PHP
JQuery UI皮肤定制
2009/07/27 Javascript
js自定义事件及事件交互原理概述(二)
2013/02/01 Javascript
js弹出层(jQuery插件形式附带reLoad功能)
2013/04/12 Javascript
纯js分页代码(简洁实用)
2013/11/05 Javascript
jQuery支持动态参数将函数绑定到事件上的方法
2015/03/17 Javascript
jQuery使用中可能被XSS攻击的一些危险环节提醒
2016/05/24 Javascript
jQuery焦点图轮播插件KinSlideshow用法分析
2016/06/08 Javascript
Bootstrap时间选择器datetimepicker和daterangepicker使用实例解析
2016/09/17 Javascript
Bootstrap CDN和本地化环境搭建
2016/10/26 Javascript
jquery组件WebUploader文件上传用法详解
2020/10/23 Javascript
jQuery插件扩展实例【添加回调函数】
2016/11/26 Javascript
微信小程序 require机制详解及实例代码
2016/12/14 Javascript
JavaScript对JSON数据进行排序和搜索
2017/07/24 Javascript
JavaScript类的继承方法小结【组合继承分析】
2018/07/11 Javascript
React路由鉴权的实现方法
2019/09/05 Javascript
细说webpack6 Babel的使用详解
2019/09/26 Javascript
Python的Twisted框架中使用Deferred对象来管理回调函数
2016/05/25 Python
Python实现MySQL操作的方法小结【安装,连接,增删改查等】
2017/07/12 Python
Pycharm配置远程调试的方法步骤
2018/12/17 Python
解决Python中list里的中文输出到html模板里的问题
2018/12/17 Python
在Python中append以及extend返回None的例子
2019/07/20 Python
selenium切换标签页解决get超时问题的完整代码
2020/08/30 Python
python 基于wx实现音乐播放
2020/11/24 Python
python爬虫scrapy基本使用超详细教程
2021/02/20 Python
世界上最大的巴士旅游观光公司:Big Bus Tours
2016/10/20 全球购物
捷克家居装饰及图书音像购物网站:Velký košík
2018/04/16 全球购物
IMPORT的选项IGNORE有什么作用?缺省是什么设置?
2015/09/17 面试题
linux下进程间通信的方式
2013/01/23 面试题
工程力学硕士生的自我评价范文
2013/11/16 职场文书
党的群众路线对照检查材料思想汇报(学校)
2014/10/04 职场文书
pytorch中F.avg_pool1d()和F.avg_pool2d()的使用操作
2021/05/22 Python