Vue v-model组件封装(类似弹窗组件)


Posted in Javascript onJanuary 08, 2020

v-model是vue的一个语法糖,限制在input和textarea等这些表单元素中,官网所给的例子也是仅限于表单组件

Vue.component('base-checkbox', {
 model: {
  prop: 'checked',
  event: 'change'
 },
 props: {
  checked: Boolean
 },
 template: `
  <input
   type="checkbox"
   v-bind:checked="checked"
   v-on:change="$emit('change', $event.target.checked)"
  >
 `
})
<base-checkbox v-model="lovingVue"></base-checkbox>

现在我们如果想把v-model用到除表单之外的自定义组件中,该怎么使用呢,其实官网所给的例子也比较清晰了,只是如果死脑筋的话,那就限制住了,没错说的就是我-.-.

<!--封装的类弹窗组件-->
<template>
  <div>
    <div v-show="value">这是v-model的弹窗组件</div>
  </div>
</template>
<script>
export default {
  props:{
    value:{
      type:Boolean,
      default:false
    }
  }
}
</script>
<!--父组件-->
<template>
  <div>
    <v-model v-model="value"></v-model>
    <button @click="value=true">点击显示</button>
    <button @click="value=false">点击消失</button>
  </div>
</template>
<script>
import VModel from "./Vmodel"
export default {
  components:{VModel},
  data:function(){
    return {
      value:true
    }
  }
}
</script>

其实这样父组件这边已经可以通过v-model对显示和消失进行控制了,但是封装组件的 value 这个属性名是不能修改的,必须叫 value ,叫 value1 就不可以了

props:{
    value1:{ //失效
      type:Boolean,
      default:false
    }
  }

原因,看源码

function transformModel (options, data: any) {
 const prop = (options.model && options.model.prop) || 'value' //子组件不存在options.model,默认给value
 const event = (options.model && options.model.event) || 'input'//event="input"
 ;(data.attrs || (data.attrs = {}))[prop] = data.model.value
 const on = data.on || (data.on = {})
 const existing = on[event] //undefined
 const callback = data.model.callback //f()
 if (isDef(existing)) { //false
  if (
   Array.isArray(existing)
    ? existing.indexOf(callback) === -1
    : existing !== callback
  ) {
   on[event] = [callback].concat(existing)
  }
 } else {
  on[event] = callback //把回调赋值给监听的函数
 }
}

so,我们就可以加上model属性,进行代码修改

<template>
  <div>
    <div v-show="value">这是v-model的弹窗组件</div>
    <div @click="cancelClick">组件内部调用</div>
  </div>
</template>
<script>
export default {
  props:{
    value:{
      type:Boolean,
      default:false
    },
    model:{
      prop:"value",
      event:'change'
    }
  },
  methods:{
    cancelClick:function(){
      //内部调用这个方法可以进行控制
      this.$emit("change",false)
    }
  }
}
</script>

当然我们也可以通过model属性,对value这个属性名进行修改,也是实现同样的效果

bool:{
    type:Boolean,
    default:false
  },
model:{
  prop:"bool",
  event:'change'
}

注意如果灭有加model属性的话,对props的value属性名修改的话,是没效果的,默认的v-model的event默认修改的还是value

const prop = (options.model && options.model.prop) || 'value' //子组件不存在options.model,默认给value
 const event = (options.model && options.model.event) || 'input'//event="input"

总结

以上所述是小编给大家介绍的Vue中的 v-model组件封装(类似弹窗组件),希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!

Javascript 相关文章推荐
AJAX使用了UpdatePanel后无法使用alert弹出脚本
Apr 02 Javascript
js中格式化日期时间型数据函数代码
Nov 08 Javascript
jquery日历控件实现方法分享
Mar 07 Javascript
30个经典的jQuery代码开发技巧
Dec 15 Javascript
html的DOM中document对象images集合用法实例
Jan 21 Javascript
JavaScript数组去重的6个方法
Jan 21 Javascript
COM组件中调用JavaScript函数详解及实例
Feb 23 Javascript
javascript实现日期三级联动下拉框选择菜单
Dec 03 Javascript
Vue+mui实现图片的本地缓存示例代码
May 24 Javascript
Vue循环组件加validate多表单验证的实例
Sep 18 Javascript
vue实现图片上传到后台
Jun 29 Javascript
Vue实现简单的留言板
Oct 23 Javascript
jquery实现吸顶导航效果
Jan 08 #jQuery
JS实现网站吸顶条
Jan 08 #Javascript
js实现移动端吸顶效果
Jan 08 #Javascript
vue.js自定义组件实现v-model双向数据绑定的示例代码
Jan 08 #Javascript
微信小程序实现吸顶效果
Jan 08 #Javascript
JS实现吸顶特效
Jan 08 #Javascript
vue项目中在可编辑div光标位置插入内容的实现代码
Jan 07 #Javascript
You might like
php中数据库连接方式pdo和mysqli对比分析
2015/02/25 PHP
PHP在线书签系统分享
2016/01/04 PHP
Netbeans 8.2与PHP相关的新特性介绍
2016/10/08 PHP
PHP遍历目录文件的常用方法小结
2017/02/03 PHP
JS BASE64编码 window.atob(), window.btoa()
2021/03/09 Javascript
javascript入门·对象属性方法大总结
2007/10/01 Javascript
扩展jquery实现客户端表格的分页、排序功能代码
2011/03/16 Javascript
解析瀑布流布局:JS+绝对定位的实现
2013/05/08 Javascript
导航跟随滚动条置顶移动示例代码
2013/09/11 Javascript
css配合jquery美化 select
2013/11/29 Javascript
JavaScript实现强制重定向至HTTPS页面
2015/06/10 Javascript
JS实现带圆弧背景渐变效果的导航菜单代码
2015/10/13 Javascript
jQuery中bind(),live(),delegate(),on()绑定事件方法实例详解
2016/01/19 Javascript
JavaScript数据结构与算法之集合(Set)
2016/01/29 Javascript
jQuery实现的多滑动门,多选项卡效果代码
2016/03/28 Javascript
简单的js表格操作
2016/09/24 Javascript
原生js实现弹出层效果
2017/01/20 Javascript
BootStrap Datetimepicker 汉化的实现代码
2017/02/10 Javascript
javascript 初学教程及五子棋小程序的简单实现
2017/07/04 Javascript
javascript input输入框模糊提示功能的实现
2017/09/25 Javascript
教你用Cordova打包Vue项目的方法
2017/10/17 Javascript
使用Vue-Router 2实现路由功能实例详解
2017/11/14 Javascript
validform表单验证的实现方法
2019/03/08 Javascript
VUE前后端学习tab写法实例
2019/08/06 Javascript
python模拟enum枚举类型的方法小结
2015/04/30 Python
在Python的Django框架中创建语言文件
2015/07/27 Python
Python 类与元类的深度挖掘 II【经验】
2016/05/06 Python
django 2.0更新的10条注意事项总结
2018/01/05 Python
python逆序打印各位数字的方法
2018/06/25 Python
python学习开发mock接口
2019/04/28 Python
python 实现目录复制的三种小结
2019/12/04 Python
django 实现简单的插入视频
2020/04/07 Python
Python3开发环境搭建详细教程
2020/06/18 Python
公务员爱岗敬业心得体会
2016/01/25 职场文书
2019各种承诺书范文
2019/06/24 职场文书
2019年XX公司的晨会制度及流程!
2019/07/23 职场文书