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 相关文章推荐
突发奇想的一个jquery插件
Nov 19 Javascript
jquery动态加载js三种方法实例
Aug 03 Javascript
JS加jquery简单实现标签元素的显示或隐藏
Sep 23 Javascript
js创建对象几种方式的优缺点对比
Sep 28 Javascript
html5 canvas 详细使用教程
Jan 20 Javascript
Javascript 实现匿名递归的实例代码
May 25 Javascript
微信小程序开发教程之增加mixin扩展
Aug 09 Javascript
详解Webstorm 新建.vue文件支持高亮vue语法和es6语法
Oct 26 Javascript
如何从零开始利用js手写一个Promise库详解
Apr 19 Javascript
微信小程序使用swiper组件实现类3D轮播图
Aug 29 Javascript
搭建一个Koa后端项目脚手架的方法步骤
May 30 Javascript
jQuery实现查看图片功能
Dec 01 jQuery
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 工厂模式使用方法
2010/05/18 PHP
ThinkPHP中数据操作案例分析
2015/09/27 PHP
Yii2中如何使用modal弹窗(基本使用)
2016/05/30 PHP
Windows 下安装 swoole 图文教程(php)
2017/06/05 PHP
IE和Mozilla的兼容性汇总event
2007/08/12 Javascript
将jQuery应用于login页面的问题及解决
2009/10/17 Javascript
createTextRange()的使用示例含文本框选中部分文字内容
2014/02/24 Javascript
jquery实现导航固定顶部的效果仿蘑菇街
2014/10/22 Javascript
探讨跨域请求资源的几种方式(总结)
2016/12/02 Javascript
js实现水平滚动菜单导航
2017/07/21 Javascript
JavaScript实现写入文件到本地的方法【基于FileSaver.js插件】
2018/03/15 Javascript
安装vue-cli的简易过程
2018/05/22 Javascript
详解Eslint 配置及规则说明
2018/09/10 Javascript
你可能不知道的CORS跨域资源共享
2019/03/13 Javascript
js控制随机数生成概率代码实例
2019/03/21 Javascript
JavaScript中交换值的10种方法总结
2020/08/18 Javascript
js 函数性能比较方法
2020/08/24 Javascript
[03:58]2014DOTA2国际邀请赛 龙宝赛后解密DK获胜之道
2014/07/14 DOTA
Python中的pprint折腾记
2015/01/21 Python
python爬虫之urllib3的使用示例
2018/07/09 Python
解决python selenium3启动不了firefox的问题
2018/10/13 Python
django Serializer序列化使用方法详解
2018/10/16 Python
python获取url的返回信息方法
2018/12/17 Python
Python实现的线性回归算法示例【附csv文件下载】
2018/12/29 Python
Python设计模式之桥接模式原理与用法实例分析
2019/01/10 Python
python多进程(加入进程池)操作常见案例
2019/10/21 Python
如何获得EntityManager
2014/02/09 面试题
yy结婚证婚词
2014/01/10 职场文书
酒店销售经理岗位职责
2014/01/31 职场文书
小学二年级评语
2014/04/21 职场文书
领导班子“四风问题”“整改方案
2014/10/02 职场文书
检讨书1000字
2014/10/11 职场文书
推普标语口号大全
2015/12/26 职场文书
python使用pygame创建精灵Sprite
2021/04/06 Python
go 原生http web 服务跨域restful api的写法介绍
2021/04/27 Golang
SpringBoot整合Redis入门之缓存数据的方法
2021/11/17 Redis