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 相关文章推荐
Javascript 遍历对象中的子对象
Jul 03 Javascript
Mootools 1.2教程 同时进行多个形变动画
Sep 15 Javascript
YUI的Tab切换实现代码
Apr 11 Javascript
ASP.NET jQuery 实例9  通过控件hyperlink实现返回顶部效果
Feb 03 Javascript
jquery手风琴特效插件
Feb 04 Javascript
jQuery实现鼠标点击弹出渐变层的方法
Jul 09 Javascript
怎么限制input的text里输入的值只能是数字(正则、js)
May 16 Javascript
浅谈JS中json数据的处理
Jun 30 Javascript
微信小程序 标签传入数据
May 08 Javascript
详解Vue-cli代理解决跨域问题
Sep 27 Javascript
如何优雅地在vue中添加权限控制示例详解
Mar 07 Javascript
JS实现的排列组合算法示例
Jul 16 Javascript
微信小程序实现吸顶效果
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
php array_pop()数组函数将数组最后一个单元弹出(出栈)
2011/07/12 PHP
ThinkPHP水印功能实现修复PNG透明水印并增加JPEG图片质量可调整
2014/11/05 PHP
thinkPHP框架动态配置用法实例分析
2018/06/14 PHP
PHP多进程通信-消息队列使用
2019/03/08 PHP
PHP设计模式之简单工厂和工厂模式实例分析
2019/03/25 PHP
一个简单的js鼠标划过切换效果
2010/06/30 Javascript
探讨js中的双感叹号判断
2013/11/11 Javascript
使用Raygun来自动追踪AngularJS中的异常
2015/06/23 Javascript
AngularJS中过滤器的使用与自定义实例代码
2016/09/17 Javascript
Bootstrap缩略图与警告框学习使用
2017/02/08 Javascript
移动端利用H5实现压缩图片上传功能
2017/03/29 Javascript
webstorm中配置nodejs环境及npm的实例
2018/05/15 NodeJs
vue 实现左右拖拽元素并且不超过他的父元素的宽度
2018/11/30 Javascript
angularjs实现table表格td单元格单击变输入框/可编辑状态示例
2019/02/21 Javascript
jQuery实现checkbox全选、反选及删除等操作的方法详解
2019/08/02 jQuery
一文看懂如何简单实现节流函数和防抖函数
2019/09/05 Javascript
Vue 使用Props属性实现父子组件的动态传值详解
2019/11/13 Javascript
JS插入排序简单理解与实现方法分析
2019/11/25 Javascript
Python中的命令行参数解析工具之docopt详解
2017/03/27 Python
Python基于matplotlib实现绘制三维图形功能示例
2018/01/18 Python
Python中pandas模块DataFrame创建方法示例
2018/06/20 Python
flask框架使用orm连接数据库的方法示例
2018/07/16 Python
Python动态赋值的陷阱知识点总结
2019/03/17 Python
python 3.6.7实现端口扫描器
2019/09/04 Python
python创建学生成绩管理系统
2019/11/22 Python
python中栈的原理及实现方法示例
2019/11/27 Python
如何安装并在pycharm使用selenium的方法
2020/04/30 Python
使用Keras预训练模型ResNet50进行图像分类方式
2020/05/23 Python
一文解决django 2.2与mysql兼容性问题
2020/07/15 Python
Nordgreen台湾官网:极简北欧设计手表
2019/08/21 全球购物
奶茶店创业计划书范文
2014/01/17 职场文书
《口技》教学反思
2014/02/21 职场文书
绿色小区申报材料
2014/08/22 职场文书
搞笑结婚保证书
2015/05/08 职场文书
雷锋的观后感
2015/06/10 职场文书
2015秋季开学典礼主持词
2015/07/16 职场文书