vue.js自定义组件实现v-model双向数据绑定的示例代码


Posted in Javascript onJanuary 08, 2020

我们都清楚v-model其实就是vue的一个语法糖,用于在表单控件或者组件上创建双向绑定。

//表单控件上使用v-model
<template>
 <input type="text" v-model="name" />
 <input type="checkbox" v-model="checked"/>
 <!--上面的input和下面的input实现的效果是一样的-->
 <input type="text" :value="name" @input="name=e.target.vlaue"/>
 <input type="checkBox" :checked="checked" @click=e.target.checked/>
 {{name}}
</template>
<script>
export default{
 data(){
  return {
   name:"",
   checked:false,
  }
 }
}
</script>

vue中父子组件的props通信都是单向的。父组件通过props向下传值给子组件,子组件通过$emit触发父组件中的方法。所以自定义组件是无法直接使用v-model来实现v-model双向绑定的。那么有什么办法可以实现呢?

//父组件
<template>
 <div>
  <c-input v-model="form.name"></c-input>
  <c-input v-model="form.password"></c-input>
  <!--上面的input等价于下面的input-->
 <!--<c-input :value="form.name" @input="form.name=e.target.value"/>
  <c-input :value="form.password" @input="form.password=e.target.value"/>-->
 </div>
</template>
<script>
import cInput from "./components/Input"
export default {
 components:{
  cInput
 },
 data() {
  return {
   form:{
    name:"",
    password:""
   },
   
  }
 },
}
</script>
//子组件 cInput
<template>
  <input type="text" :value="inputValue" @input="handleInput">
</template>
<script>
export default {
 props:{
  value:{
   type:String,
   default:"",
   required:true,
  }
 },
 data() {
  return {
   inputValue:this.value,
  }
 },
 methods:{
  handleInput(e){
   const value=e.target.value;
   this.inputValue=value;
   this.$emit("input",value);
  },
 }
}
</script>

根据上面的示例代码可以看出,子组件c-input上绑定了父组件form的值,在子组件中通过:value接收了这个值,然后我们在子组件中修改了这个值,并且通过$emit触发了父组件中的input事件将修改的值又赋值给了form。

综上就实现了自定义组件中的双向数据绑定!

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
在IE中调用javascript打开Excel的代码(downmoon原作)
Apr 02 Javascript
让回调函数 showResponse 也带上参数的代码
Aug 13 Javascript
JavaScript Perfection kill 测试及答案
Mar 23 Javascript
innerHTML 和 getElementsByName 在IE下面的bug 的解决
Apr 09 Javascript
jquery 获取标签名(tagName)示例代码
Jul 11 Javascript
关闭时刷新父窗口两种方法
May 07 Javascript
js判断手机端(Android手机还是iPhone手机)
Jul 22 Javascript
BootStrap Validator使用注意事项(必看篇)
Sep 28 Javascript
js实现canvas保存图片为png格式并下载到本地的方法
Aug 31 Javascript
使用原生js+canvas实现模拟心电图的实例
Sep 20 Javascript
antd Upload 文件上传的示例代码
Dec 14 Javascript
JS秒杀倒计时功能完整实例【使用jQuery3.1.1】
Sep 03 jQuery
微信小程序实现吸顶效果
Jan 08 #Javascript
JS实现吸顶特效
Jan 08 #Javascript
vue项目中在可编辑div光标位置插入内容的实现代码
Jan 07 #Javascript
electron+vue实现div contenteditable截图功能
Jan 07 #Javascript
解决vue elementUI中table里数字、字母、中文混合排序问题
Jan 07 #Javascript
Vue程序化的事件监听器(实例方案详解)
Jan 07 #Javascript
微信小程序服务器日期格式化问题
Jan 07 #Javascript
You might like
Blitz templates 最快的PHP模板引擎
2010/04/06 PHP
PHP+MySQL投票系统的设计和实现分享
2012/09/23 PHP
php用ini_get获取php.ini里变量值的方法
2015/03/04 PHP
javascript attachEvent和addEventListener使用方法
2009/03/19 Javascript
锋利的jQuery 第三章章节总结的例子
2010/03/23 Javascript
JavaScript arguments 多参传值函数
2010/10/24 Javascript
使用js Math.random()函数生成n到m间的随机数字
2014/10/09 Javascript
JavaScript字符串对象split方法入门实例(用于把字符串分割成数组)
2014/10/16 Javascript
CSS3,HTML5和jQuery搜索框集锦
2014/12/02 Javascript
jQuery对指定元素中指定字符串进行替换的方法
2015/03/17 Javascript
jQuery使用$.ajax进行即时验证实例详解
2015/12/11 Javascript
JS数组合并push与concat区别分析
2015/12/17 Javascript
移动端点击态处理的三种实现方式
2017/01/12 Javascript
使用layui前端框架弹出form表单以及提交的示例
2019/10/25 Javascript
JS中的const命令你真懂它吗
2020/03/08 Javascript
如何优雅地取消 JavaScript 异步任务
2020/03/22 Javascript
JavaScript实现简单日历效果
2020/09/11 Javascript
[04:29]2014DOTA2国际邀请赛 主赛事第三日TOPPLAY
2014/07/21 DOTA
[45:50]完美世界DOTA2联赛PWL S3 CPG vs Forest 第二场 12.16
2020/12/17 DOTA
windows下python模拟鼠标点击和键盘输示例
2014/02/28 Python
Python使用py2exe打包程序介绍
2014/11/20 Python
Java分治归并排序算法实例详解
2017/12/12 Python
Python后台管理员管理前台会员信息的讲解
2019/01/28 Python
对pyqt5中QTabWidget的相关操作详解
2019/06/21 Python
python 使用递归实现打印一个数字的每一位示例
2020/02/27 Python
科颜氏英国官网:Kiehl’s英国
2019/11/20 全球购物
领先的荷兰线上超市:荷兰之家Holland at Home(支持中文)
2021/01/21 全球购物
瑞士首家网上药店折扣店:McDrogerie
2020/12/22 全球购物
幼儿园中班新学期寄语
2014/01/18 职场文书
大学理论知识学习自我鉴定
2014/04/28 职场文书
环境卫生倡议书
2014/08/29 职场文书
2014年监理工作总结范文
2014/11/17 职场文书
2015年安全生产工作总结范文
2015/04/02 职场文书
金榜题名主持词
2015/07/02 职场文书
团拜会主持词
2015/07/04 职场文书
酒店宣传语大全
2015/07/13 职场文书