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 相关文章推荐
jquery 关键字“拖曳搜索”之“拖曳”以及 图片“提示自适应放大”效果 的实现
Apr 18 Javascript
JS实现遮罩层效果的简单实例
Nov 12 Javascript
jQuery团购倒计时特效实现方法
May 07 Javascript
jQuery实现的倒计时效果实例小结
Apr 16 Javascript
基于BootStarp的Dailog
Apr 28 Javascript
Angular2搜索和重置按钮过场动画
May 24 Javascript
vue增删改查的简单操作
Jul 15 Javascript
jQuery+HTML5实现WebGL高性能烟花绽放动画效果【附demo源码下载】
Aug 18 jQuery
详解vue项目中使用token的身份验证的简单实践
Mar 08 Javascript
javascript实现贪吃蛇经典游戏
Apr 10 Javascript
Openlayers绘制地图标注
Sep 28 Javascript
JavaScript如何操作css
Oct 24 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实现的仿阿里巴巴实现同类产品翻页
2009/12/11 PHP
smarty模板引擎之内建函数用法
2015/03/30 PHP
mod_php、FastCGI、PHP-FPM等PHP运行方式对比
2015/07/02 PHP
php批量修改表结构实例
2017/05/24 PHP
php7安装mongoDB扩展的方法分析
2017/08/02 PHP
PHP超级全局变量【$GLOBALS,$_SERVER,$_REQUEST等】用法实例分析
2019/12/11 PHP
javascript之学会吝啬 精简代码
2010/04/25 Javascript
JQuery入门—JQuery程序的代码风格详细介绍
2013/01/03 Javascript
Javascript基础知识(三)BOM,DOM总结
2014/09/29 Javascript
js实现仿爱微网两级导航菜单效果代码
2015/08/31 Javascript
[原创]Javascript 实现广告后加载 可加载百度谷歌联盟广告
2016/05/11 Javascript
AngularJS 模块详解及简单实例
2016/07/28 Javascript
jsp 网站引入外部css或者js失效问题解决
2016/10/31 Javascript
微信公众号开发 实现点击返回按钮就返回到聊天界面
2016/12/15 Javascript
利用vue实现模态框组件
2016/12/19 Javascript
Angularjs中的ui-bootstrap的使用教程
2017/02/19 Javascript
Vue 2.X的状态管理vuex记录详解
2017/03/23 Javascript
微信小程序自定义组件之可清除的input组件
2018/07/17 Javascript
JS实现随机生成10个手机号的方法示例
2018/12/07 Javascript
vue登录以及权限验证相关的实现
2019/10/25 Javascript
vue-cli3中配置alias和打包加hash值操作
2020/09/04 Javascript
[01:17]辉夜杯战队访谈宣传片—EHOME
2015/12/25 DOTA
教你学会使用Python正则表达式
2017/09/07 Python
python用pandas数据加载、存储与文件格式的实例
2018/12/07 Python
Django之使用内置函数和celery发邮件的方法示例
2019/09/16 Python
Python3+Appium安装及Appium模拟微信登录方法详解
2021/02/16 Python
绿色美容,有机护肤品和化妆品:Safe & Chic
2018/10/29 全球购物
初中同学聚会邀请函
2014/02/03 职场文书
毕业典礼主持词大全
2014/03/26 职场文书
服装设计师求职信
2014/06/04 职场文书
医学求职自荐信
2014/06/21 职场文书
大学专科求职信
2014/07/02 职场文书
无房证明范本
2014/09/17 职场文书
悬崖上的金鱼姬观后感
2015/06/15 职场文书
nginx搭建图片服务器的过程详解(root和alias的区别)
2021/03/31 Servers
python调试工具Birdseye的使用教程
2021/05/25 Python