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 相关文章推荐
js判断一个元素是否为另一个元素的子元素的代码
Mar 21 Javascript
jQuery使用$.get()方法从服务器文件载入数据实例
Mar 25 Javascript
jQuery弹出层插件Lightbox_me使用指南
Apr 21 Javascript
JS动态创建元素的两种方法
Apr 20 Javascript
jQuery遍历json的方法(推荐)
Jun 12 Javascript
基于Javascript实现文件实时加载进度的方法
Oct 12 Javascript
QRCode.js:基于JQuery的生成二维码JS库的使用
Jun 23 jQuery
关于Vue.nextTick()的正确使用方法浅析
Aug 25 Javascript
Angular.js实现获取验证码倒计时60秒按钮的简单方法
Oct 18 Javascript
JS函数内部属性之arguments和this实例解析
Oct 07 Javascript
浅谈layui 表单元素的选中问题
Oct 25 Javascript
Vue切换组件实现返回后不重置数据,保留历史设置操作
Jul 21 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
PHP5各个版本的新功能和新特性总结
2014/03/16 PHP
使用ThinkPHP+Uploadify实现图片上传功能
2014/06/26 PHP
PHP laravel中的多对多关系实例详解
2017/06/07 PHP
php array 转json及java 转换 json数据格式操作示例
2019/11/13 PHP
Nigma vs AM BO3 第二场2.13
2021/03/10 DOTA
javascript编码的几个方法详细介绍
2013/01/06 Javascript
jQuery.prototype.init选择器构造函数源码思路分析
2013/02/05 Javascript
js创建元素(节点)示例
2014/01/02 Javascript
jquery新的绑定事件机制on方法的使用方法
2014/04/15 Javascript
JavaScript中使用Callback控制流程介绍
2015/03/16 Javascript
详解JavaScript逻辑Not运算符
2015/12/04 Javascript
Jquery元素追加和删除的实现方法
2016/05/24 Javascript
AngularJs实现分页功能不带省略号的代码
2016/05/30 Javascript
搭建简单的nodejs http服务器详解
2017/03/09 NodeJs
vue bootstrap小例子一枚
2017/06/09 Javascript
详解angularjs跨页面传参遇到的一些问题
2018/11/01 Javascript
Vue CLI 3.x 自动部署项目至服务器的方法
2019/04/02 Javascript
微信小程序传值以及获取值方法的详解
2019/04/29 Javascript
关于layui表单中按钮自动提交的解决方法
2019/09/09 Javascript
浅谈layer的Icon样式以及一些常用的layer窗口使用方法
2019/09/11 Javascript
vue element-ui实现input输入框金额数字添加千分位
2019/12/29 Javascript
关于element-ui表单中限制输入纯数字的解决方式
2020/09/08 Javascript
Vue自定义多选组件使用详解
2020/09/08 Javascript
Python字符编码判断方法分析
2016/07/01 Python
基于hashlib模块--加密(详解)
2017/06/21 Python
Python封装原理与实现方法详解
2018/08/28 Python
使用Flask-Cache缓存实现给Flask提速的方法详解
2019/06/11 Python
python实现的Iou与Giou代码
2020/01/18 Python
解决pycharm中opencv-python导入cv2后无法自动补全的问题(不用作任何文件上的修改)
2020/03/05 Python
解析pip安装第三方库但PyCharm中却无法识别的问题及PyCharm安装第三方库的方法教程
2020/03/10 Python
Opencv 图片的OCR识别的实战示例
2021/03/02 Python
一些PHP的面试题
2015/05/06 面试题
档案接收函
2014/01/13 职场文书
授权委托书
2015/01/28 职场文书
早安问候语大全
2015/11/10 职场文书
Python利用capstone实现反汇编
2022/04/06 Python