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 文件大小判断的实现代码
Apr 07 Javascript
JQuery扩展插件Validate 1 基本使用方法并打包下载
Sep 05 Javascript
浅谈JavaScript字符集
May 22 Javascript
JavaScript中的异常捕捉介绍
Dec 31 Javascript
jquery通过name属性取值的简单实现方法
Jun 20 Javascript
Angualrjs和bootstrap相结合实现数据表格table
Mar 30 Javascript
一次围绕setTimeout的前端面试经验分享
Jun 15 Javascript
JS设计模式之状态模式概念与用法分析
Feb 05 Javascript
Vue中的验证登录状态的实现方法
Mar 09 Javascript
通过实践编写优雅的JavaScript代码
May 30 Javascript
微信小程序(订阅消息)功能
Oct 25 Javascript
深入理解redux之compose的具体应用
Jan 12 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+ajax注册实时验证功能
2016/07/20 PHP
浅谈PHP的数据库接口和技术
2016/12/09 PHP
ThinkPHP5 的简单搭建和使用详解
2018/11/15 PHP
如何在标题栏显示框架内页面的标题
2007/02/03 Javascript
一段效率很高的for循环语句使用方法
2007/08/13 Javascript
dojo学习第二天 ajax异步请求之绑定列表
2011/08/29 Javascript
JS实现随机化快速排序的实例代码
2013/08/01 Javascript
js实现两个值相加alert出来精确到指定位
2013/09/25 Javascript
js实现进度条的方法
2015/02/13 Javascript
鼠标事件的screenY,pageY,clientY,layerY,offsetY属性详解
2015/03/12 Javascript
javascript显式类型转换实例分析
2015/04/25 Javascript
bootstrap-treeview自定义双击事件实现方法
2016/01/09 Javascript
很不错的两款Bootstrap Icon图标选择组件
2016/01/28 Javascript
Bootstrap和Java分页实例第二篇
2016/12/23 Javascript
微信小程序 数组中的push与concat的区别
2017/01/05 Javascript
整理关于Bootstrap警示框的慕课笔记
2017/03/29 Javascript
详解Vue2中组件间通信的解决全方案
2017/07/28 Javascript
基于滚动条位置判断的简单实例
2017/12/14 Javascript
webpack-dev-server自动更新页面方法
2018/02/22 Javascript
解析vue路由异步组件和懒加载案例
2018/06/08 Javascript
vue2.x集成百度UEditor富文本编辑器的方法
2018/09/21 Javascript
js 图片懒加载的实现
2020/10/21 Javascript
[00:36]TI7不朽珍藏III——斯温不朽展示
2017/07/15 DOTA
[01:25:38]DOTA2-DPC中国联赛 正赛 VG vs LBZS BO3 第一场 1月19日
2021/03/11 DOTA
Linux下使用python调用top命令获得CPU利用率
2015/03/10 Python
Python模块搜索概念介绍及模块安装方法介绍
2015/06/03 Python
Python多叉树的构造及取出节点数据(treelib)的方法
2019/08/09 Python
解决selenium+Headless Chrome实现不弹出浏览器自动化登录的问题
2021/01/09 Python
css3中新增的样式使用示例附效果图
2014/08/19 HTML / CSS
HTML5 拖拽批量上传文件的示例代码
2018/03/28 HTML / CSS
Muziker英国:中欧最大的音乐家商店
2020/02/05 全球购物
拾金不昧表扬信范文
2014/01/11 职场文书
人力资源管理毕业求职信
2014/08/05 职场文书
贯彻落实“八项规定”思想汇报
2014/09/13 职场文书
五星红旗迎风飘扬观后感
2015/06/17 职场文书
如何理解PHP核心特性命名空间
2021/05/28 PHP