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 相关文章推荐
一个选择最快的服务器转向代码
Apr 27 Javascript
jQuery循环滚动新闻列表示例代码
Jun 17 Javascript
jquery ajax结合thinkphp的getjson实现跨域的方法
Jun 06 Javascript
Web 开发中Ajax的Session 超时处理方法
Jan 19 Javascript
js 判断登录界面的账号密码是否为空
Feb 08 Javascript
vue获取input输入值的问题解决办法
Oct 17 Javascript
vuex进阶知识点巩固
May 20 Javascript
Vue 项目分环境打包的方法示例
Aug 03 Javascript
Vue 实现展开折叠效果的示例代码
Aug 27 Javascript
js实现动态添加上传文件页面
Oct 22 Javascript
JavaScript文本特效实例小结【3个示例】
Dec 22 Javascript
js实现随机点名功能
Dec 23 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
为什么那些咖啡爱好者大多看不上连锁咖啡店?
2021/03/06 咖啡文化
高亮度显示php源代码
2006/10/09 PHP
php遍历数组的方法分享
2012/03/22 PHP
Symfony2创建基于域名的路由相关示例
2016/11/14 PHP
YII2框架中日志的配置与使用方法实例分析
2020/03/18 PHP
JS 无限级 Select效果实现代码(json格式)
2011/08/30 Javascript
基于pthread_create,readlink,getpid等函数的学习与总结
2013/07/17 Javascript
鼠标经过显示二级菜单js特效
2013/08/13 Javascript
JQueryiframe页面操作父页面中的元素与方法(实例讲解)
2013/11/19 Javascript
Javascript中的方法和匿名方法实例详解
2015/06/13 Javascript
干货分享:让你分分钟学会javascript闭包
2015/12/25 Javascript
JavaScript常用函数工具集:lao-utils
2016/03/01 Javascript
jQuery Easyui Tabs扩展根据自定义属性打开页签
2016/08/15 Javascript
Angular获取手机验证码实现移动端登录注册功能
2017/05/17 Javascript
React根据宽度自适应高度的示例代码
2017/10/11 Javascript
使用mixins实现elementUI表单全局验证的解决方法
2019/04/02 Javascript
JS实现吸顶特效
2020/01/08 Javascript
js实现碰撞检测
2021/01/29 Javascript
[57:37]EG vs Mineski 2018国际邀请赛小组赛BO2 第二场 8.16
2018/08/17 DOTA
python调用windows api锁定计算机示例
2014/04/17 Python
Python文件操作之合并文本文件内容示例代码
2017/09/19 Python
Python实现正弦信号的时域波形和频谱图示例【基于matplotlib】
2018/05/04 Python
对Python强大的可变参数传递机制详解
2019/06/13 Python
wxpython绘制圆角窗体
2019/11/18 Python
Python嵌入C/C++进行开发详解
2020/06/09 Python
html5视频播放_动力节点Java学院整理
2017/07/13 HTML / CSS
Spartoo芬兰:欧洲最大的网上鞋店
2016/08/28 全球购物
现代生活方式的家具和装饰:Dot & Bo
2018/12/26 全球购物
大学生自我评价怎样写好
2013/10/23 职场文书
历史专业个人求职信分享
2013/12/20 职场文书
物流管理专业职业生涯规划书
2014/01/06 职场文书
竞选村长演讲稿
2014/04/28 职场文书
消防安全宣传口号
2014/06/10 职场文书
2014年文员工作总结
2014/11/18 职场文书
出生证明格式
2015/06/15 职场文书
股东合作协议书模板2篇
2019/11/05 职场文书