通过v-model指令控制组件的隐藏、显示

在开发项目的过程中,我们通常会有自定义组件的时候,那么在自定义组件后,我们如何去对组件进行类似于常用的UI组件库里面那些通过v-model来展示、隐藏组件的功能效果呢?好吧~接下来我直接上代码

1.新建一个叫child.vue的vue组件文件

内容如下:

<!--child.vue-->
<template>
    <div class="tips_wrap" v-if="showChild">
		我是自定义组件child
    </div>
</template>
<script>
export default {
    model: {
        prop: 'showChild'
    },
    props: {
        showChild: {
            type: Boolean,
            default: true
        }
    },
    methods: {
        closeChild() {
            this.$parent.showChild= !this.$parent.showChild
            // 或者可以这样写,子组件用input事件传递值,父组件直接用v-model里面的属性进行接收
            this.$emit('input', false)
        }
    }
}
</script>

2.将这个组件注册在全局

方便直接使用,也可以不注册,在main.js文件里面引入并注册:

// 引入自定义组件
import Child from '@/components/Child'
// 注册自定义组件
Vue.component('Child', Child)

3.在父组件文件里面写入Child组件

并加上v-model="showChild":

<template>
    <Child v-model="showChild"></Child>
</template>
<script>
export default {
    data() {
        return {
            showChild: true
        }
    }
}
</script>

好了,到此实现自定义组件通过v-model指令控制组件的隐藏、显示 

在组件中实现v-model

v-model本质是语法糖,它负责监听用户的输入事件以更新数据,并对一些极端场景进行一些特殊处理。

1.v-model使用的属性和事件

v-model在内部为不同的输入元素使用不同的属性并抛出不同的事件

  • input输入框(type为text)、textarea元素使用value属性和input事件
  • checkbox、radio使用checked属性和change事件
  • select下拉框使用value属性和change事件

2.自定义组件中输入框的v-model

在父组件中使用自定义组件myInput,使用v-model传入数据

<myInput v-model="name" />

以上写法相当于如下

<my-input :value="msg" @input="(e)=>{msg=e}"/>

v-model是value属性和input事件的语法糖

1、第一种写法

在组件的props中,通过value接收父组件v-model传过来的数据。

在输入时,通过$emit触发input事件,并将当前的输入值传过去,就会在父组件上触发input事件,并将传来的值赋给父组件上的值

<template>
  <div class="myInput">
    <input
      type="text"
      :value="value"
      @input="$emit('input', $event.target.value)"
    />
  </div>
</template>
<script>
export default {
  props: {
    value:{}
  },
};
</script>

2、第二种写法

一般以第一种写法就可以达到目的了。

一个组件上的 v-model 默认会利用名为 value 的 prop 和名为 input 的事件,但是像单选框、复选框等类型的输入控件可能会将 value attribute 用于不同的目的。使用model可以改变接收的属性名和抛出的事件名,model 选项可以用来避免这样的冲突

以input(type为text)标签的v-model为例,使用model后:

model: {
    prop: "xxxxx",
    event: "yyyyy",
  },
  • 就将原来要接收的value属性改为了xxxxx属性,
  • 原来要抛出的input事件,改为了yyyyy事件
  • 所以,在props中接收xxxxx属性
  • 触发事件时,触发yyyyy事件
<myInput v-model="name" />

此时就相当于如下代码

<my-input :xxxxx="msg" @yyyyy="(e)=>{msg=e}"/>
<template>
  <div class="myInput">
    <input
      type="text"
      :value="xxxxx"
      @input="$emit('yyyyy', $event.target.value)"
    />
  </div>
</template>
<script>
export default {
  model: {
    prop: "xxxxx",
    event: "yyyyy",
  },
  props: {
    xxxxx: String,
  },
};
</script>

一个组件中只能写一个输入框,因为v-model只能绑定一个数据;

如果想写一个组件,在组件内有多个输入框,就只能传一个对象给子组件了。

3.通过v-model控制组件的显示

在一些组件库中,一些组件例如dialog组件,可以通过v-model来控制dialog的显示与隐藏,这是怎么实现的?

isShow控制组件box的显示与否

<box v-model="isShow"/>

在box组件中,

  • 通过props的value接收v-model传过来的值;
  • 定义一个变量showModal,并将value的值同步赋值给它;
  • 使用showModal控制组件的显示隐藏;
  • 点击box组件时,将showModal设为false,同时触发input事件,并将当前的showModal值传过去;
  • 父组件响应input事件,将v-model绑定的值赋值;
  • div元素使用的是value属性和input事件(div元素可以变成输入框,它上面存在input事件)
<template>
  <div class="box" @click="hide" v-show="showModal"></div>
</template>
<script>
export default {
  props: {
    value: {
      type: Boolean,
    },
  },
  data() {
    return {
      showModal: false,
    };
  },
  watch: {
    value(val) {
      this.showModal = val;
    },
    showModal(val) {
      this.$emit("input", val);
    },
  },
  methods: {
    hide() {
      this.showModal = false;
    },
  },
};
</script>

以上为个人经验,希望能给大家一个参考,也希望大家多多支持Devmax。

vue自定义组件如何通过v-model指令控制组件的隐藏、显示的更多相关文章

  1. Yii2中组件的注册与创建方法

    这篇文章主要介绍了Yii2之组件的注册与创建的实现方法,非常不错,具有参考借鉴价值,需要的朋友可以参考下

  2. Android ListView UI组件使用说明

    这篇文章主要介绍了Android ListView UI组件使用说明,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

  3. Flutter 首页必用组件NestedScrollView的示例详解

    今天介绍的组件是NestedScrollView,大部分的App首页都会用到这个组件。对Flutter 首页必用组件NestedScrollView的相关知识感兴趣的一起看看吧

  4. React进阶学习之组件的解耦之道

    这篇文章主要给大家介绍了关于React进阶之组件的解耦之道,文中通过详细的示例代码给大家介绍了组件分割与解耦的方法,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面跟着小编来一起学习学习吧。

  5. 使用Vant框架list组件遇到的坑及解决

    这篇文章主要介绍了使用Vant框架list组件遇到的坑及解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

  6. vue实现自定义组件挂载原型上

    这篇文章主要介绍了vue实现自定义组件挂载原型上方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

  7. Vue组件如何设置Props实例详解

    props主要用于组件的传值,他的工作就是为了接收外面传过来的数据,与data、el、ref是一个级别的配置项,下面这篇文章主要给大家介绍了关于Vue组件如何设置Props的相关资料,需要的朋友可以参考下

  8. React.js组件实现拖拽排序组件功能过程解析

    这篇文章主要介绍了React.js组件实现拖拽排序组件功能过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

  9. 解决vue路由组件vue-router实例被复用问题

    这篇文章介绍了解决vue路由组件vue-router实例被复用的问题,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

  10. React组件间通信的三种方法(简单易用)

    React知识中一个主要内容便是组件之间的通信,以下列举几种常用的组件通信方式,本文就详细的介绍一下,感兴趣的可以了解一下

随机推荐

  1. js中‘!.’是什么意思

  2. Vue如何指定不编译的文件夹和favicon.ico

    这篇文章主要介绍了Vue如何指定不编译的文件夹和favicon.ico,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

  3. 基于JavaScript编写一个图片转PDF转换器

    本文为大家介绍了一个简单的 JavaScript 项目,可以将图片转换为 PDF 文件。你可以从本地选择任何一张图片,只需点击一下即可将其转换为 PDF 文件,感兴趣的可以动手尝试一下

  4. jquery点赞功能实现代码 点个赞吧!

    点赞功能很多地方都会出现,如何实现爱心点赞功能,这篇文章主要为大家详细介绍了jquery点赞功能实现代码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  5. AngularJs上传前预览图片的实例代码

    使用AngularJs进行开发,在项目中,经常会遇到上传图片后,需在一旁预览图片内容,怎么实现这样的功能呢?今天小编给大家分享AugularJs上传前预览图片的实现代码,需要的朋友参考下吧

  6. JavaScript面向对象编程入门教程

    这篇文章主要介绍了JavaScript面向对象编程的相关概念,例如类、对象、属性、方法等面向对象的术语,并以实例讲解各种术语的使用,非常好的一篇面向对象入门教程,其它语言也可以参考哦

  7. jQuery中的通配符选择器使用总结

    通配符在控制input标签时相当好用,这里简单进行了jQuery中的通配符选择器使用总结,需要的朋友可以参考下

  8. javascript 动态调整图片尺寸实现代码

    在自己的网站上更新文章时一个比较常见的问题是:文章插图太宽,使整个网页都变形了。如果对每个插图都先进行缩放再插入的话,太麻烦了。

  9. jquery ajaxfileupload异步上传插件

    这篇文章主要为大家详细介绍了jquery ajaxfileupload异步上传插件,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  10. React学习之受控组件与数据共享实例分析

    这篇文章主要介绍了React学习之受控组件与数据共享,结合实例形式分析了React受控组件与组件间数据共享相关原理与使用技巧,需要的朋友可以参考下

返回
顶部