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 相关文章推荐
js null undefined 空区别说明
Jun 13 Javascript
JavaScript的React Web库的理念剖析及基础上手指南
May 10 Javascript
Bootstrapvalidator校验、校验清除重置的实现代码(推荐)
Sep 28 Javascript
Vue监听数组变化源码解析
Mar 09 Javascript
JavaScript 数据类型详解
Mar 13 Javascript
vue-router 中router-view不能渲染的解决方法
May 23 Javascript
node+express+ejs使用模版引擎做的一个示例demo
Sep 18 Javascript
node实现登录图片验证码的示例代码
Apr 20 Javascript
详解vuejs2.0 select 动态绑定下拉框支持多选
Apr 25 Javascript
微信小程序 swiper 组件遇到的问题及解决方法
May 26 Javascript
js实现查询商品案例
Jul 22 Javascript
vue.js Router中嵌套路由的实用示例
Jun 27 Vue.js
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+ajax注册实时验证功能
2016/07/20 PHP
php 截取GBK文档某个位置开始的n个字符方法
2017/03/08 PHP
thinkphp5修改view到根目录实例方法
2019/07/02 PHP
FormValidate 表单验证功能代码更新并提供下载
2008/08/23 Javascript
javascript IFrame 强制刷新代码
2009/07/23 Javascript
jQuery滚动加载图片效果的实现
2013/03/06 Javascript
Jquery实现网页跳转或用命令打开指定网页的解决方法
2013/07/09 Javascript
Query中click(),bind(),live(),delegate()的区别
2013/11/19 Javascript
深入解读JavaScript中的Iterator和for-of循环
2015/07/28 Javascript
基于ajax实现文件上传并显示进度条
2015/08/03 Javascript
js简单正则验证汉字英文及下划线的方法
2016/11/28 Javascript
vue+element实现批量删除功能的示例
2018/02/28 Javascript
写一个移动端惯性滑动&amp;回弹Vue导航栏组件 ly-tab
2018/03/06 Javascript
vue树形结构获取键值的方法示例
2018/06/21 Javascript
vue-cli配置环境变量的方法
2018/07/09 Javascript
解决vue+router路由跳转不起作用的一项原因
2020/07/19 Javascript
prettier自动格式化去换行的实现代码
2020/08/25 Javascript
python基础教程之获取本机ip数据包示例
2014/02/10 Python
python中django框架通过正则搜索页面上email地址的方法
2015/03/21 Python
Python数据类型学习笔记
2016/01/13 Python
python常用知识梳理(必看篇)
2017/03/23 Python
python 实现A*算法的示例代码
2018/08/13 Python
详解Python安装tesserocr遇到的各种问题及解决办法
2019/03/07 Python
python数据分析工具之 matplotlib详解
2020/04/09 Python
通过代码实例了解Python3编程技巧
2020/10/13 Python
Python实现粒子群算法的示例
2021/02/14 Python
HTML5中的Scoped属性使用实例
2014/04/23 HTML / CSS
世界最大的票务市场:viagogo
2017/02/16 全球购物
优秀部门获奖感言
2014/02/14 职场文书
建筑工地质量标语
2014/06/12 职场文书
暖通工程师岗位职责
2014/06/12 职场文书
过程装备与控制工程专业求职信
2014/07/02 职场文书
高中课前三分钟演讲稿
2014/09/13 职场文书
中学生清明节演讲稿
2015/03/18 职场文书
小区保洁员岗位职责
2015/04/10 职场文书
给老婆的保证书怎么写
2015/05/08 职场文书