Vue自定义组件使用事件修饰符的踩坑记录

下面就是“Vue自定义组件使用事件修饰符的踩坑记录”的详细攻略:

问题

在Vue自定义组件中,如果要使用事件修饰符,在事件名称后面添加修饰符,比如@click.capture@keydown.enter等。但是一个常见的问题是,如果我们给自定义组件添加了v-model,那么在使用v-model双向绑定数据的时候,事件修饰符就会失效。具体表现为,即使添加@blur.prevent修饰符,输入框失焦事件依然会继续冒泡。

解决方案

解决这个问题的方法是,自定义组件要正确地触发原生事件。

第一种方法

一种比较常见的方法是,在自定义组件中通过$emit触发原生事件。

下面是一个例子,假设我们有一个自定义组件my-input,它是一个输入框,同时支持v-model

<template>
  <input :value="value" @input="handleChange">
</template>

<script>
export default {
  props: ['value'],
  methods: {
    handleChange(e) {
      this.$emit('input', e.target.value);
    }
  }
}
</script>

使用这个组件的时候,可以像下面这样使用事件修饰符:

<my-input v-model="value" @blur.prevent></my-input>

但是,这样的话,输入框的失焦事件就不会冒泡了。

为了解决这个问题,我们可以在触发input事件的同时,也将原生的input事件触发出去:

<template>
  <input :value="value" @input="handleChange" @blur="handleBlur">
</template>

<script>
export default {
  props: ['value'],
  methods: {
    handleChange(e) {
      this.$emit('input', e.target.value);
    },
    handleBlur(e) {
      this.$emit('blur', e);
    }
  }
}
</script>

现在,我们就可以在组件里正确地触发原生事件了。

第二种方法

另一种方法是,在组件内部禁用事件冒泡,再手动触发对应的事件。

下面是一个例子,同样假设我们有一个自定义组件my-input

<template>
  <input :value="value" @input="handleChange" @blur="handleBlur">
</template>

<script>
export default {
  props: ['value'],
  methods: {
    handleChange(e) {
      this.$emit('input', e.target.value);
    },
    handleBlur(e) {
      e.stopPropagation();
      this.$emit('blur', e);
    }
  }
}
</script>

这个组件会禁用事件冒泡,同时在失焦事件上手动触发blur事件,这样就可以正确地使用事件修饰符了。使用方式和上面一样:

<my-input v-model="value" @blur.prevent></my-input>

总结

以上就是Vue自定义组件使用事件修饰符的踩坑记录的两种解决方法。第一种方法比较好理解,就是在组件里手动触发原生事件。第二种方法是在组件内部禁用事件冒泡,再手动触发对应的事件。在实际使用中,可以根据项目的需要选择合适的方式来解决问题。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Vue自定义组件使用事件修饰符的踩坑记录 - Python技术站

(0)
上一篇 2023年5月29日
下一篇 2023年5月29日

相关文章

  • Vue开发指南之重点知识梳理

    Vue开发指南之重点知识梳理攻略 目录结构 一个Vue.js项目的目录结构一般如下: ├── build // webpack配置文件 │ ├── build.js │ ├── check-versions.js │ ├── utils.js │ ├── vue-loader.conf.js │ ├── webpack.base.conf.js │ ├── …

    Vue 2023年5月27日
    00
  • Vue中render方法的使用详解

    接下来我将详细讲解“Vue中render方法的使用详解”的完整攻略。 什么是render方法? render 方法是 Vue 2.0 中引入的一个新特性,主要作用是代替模板,通过 render 方法直接操作 DOM 元素。采用 render 方法编写组件的方式被称为函数式编程,相对于之前的声明式编程方式,具有更强的可控性和扩展性。 render方法的参数 r…

    Vue 2023年5月28日
    00
  • Vue中$router.push()路由切换及如何传参和获取参数

    Vue中$router.push()方法是用来切换路由的,它可以用来实现在单页面应用中不同页面之间的跳转,也可以用来传递参数。下面是如何使用$router.push()方法进行路由切换及参数传递的完整攻略。 1. 基本用法 使用$router.push()方法进行路由切换很简单,只需在方法中传入你想要跳转的目标路由即可。例如,如果你想要从当前路由跳转到名为”…

    Vue 2023年5月27日
    00
  • vue3中defineComponent 的作用详解

    下面就是对“vue3中defineComponent 的作用详解”的完整攻略: 什么是 defineComponent defineComponent 是 Vue 3 中的一个工厂函数,用来创建一个组件。我们可以将其看作是一个替代 Vue 2.x 中的 Vue.extend 和单文件组件中的 export default。 defineComponent 可…

    Vue 2023年5月27日
    00
  • vue再次进入页面不会再次调用接口请求问题

    Vue再次进入页面不会再次调用接口请求问题,主要是因为Vue实现了单页应用(SPA)的机制,它使用了Vue-router来处理路由,当我们切换路由时,Vue-router只会切换组件,而不会重新请求数据。下面是详细的解释和攻略过程。 1. Vue-router实现SPA Vue使用Vue-router来实现路由,Vue-router是Vue.js官方的路由管…

    Vue 2023年5月28日
    00
  • Vue项目配置router.js流程分析讲解

    Vue项目可以使用Vue Router来实现页面的路由管理。在配置Vue项目中使用Vue Router,需要在项目中引入Vue Router并在router.js文件中进行路由的配置。下面是Vue项目配置router.js的详细攻略: 安装Vue Router 在Vue项目中使用Vue Router 需要先安装Vue Router。可以使用npm来进行安装,…

    Vue 2023年5月28日
    00
  • vue中实现上传文件给后台实例详解

    针对“vue中实现上传文件给后台的实例详解”,我的回答将分为以下几个部分说明: 概述 前端实现步骤 后端实现步骤 示例说明1 示例说明2 1. 概述 Vue是一种现代化的JavaScript框架,它能够帮助我们快速构建交互式界面。在许多Web应用程序中,我们需要允许用户上传文件到我们的服务器。尽管Vue本身并不提供文件上传功能,但通过结合一些其他的JavaS…

    Vue 2023年5月28日
    00
  • 在vue中,v-for的索引index在html中的使用方法

    在vue中,v-for指令允许我们遍历数组或对象,并根据每个元素生成相应的DOM节点。当我们遍历一个数组时,可以通过v-for指令获取每个元素对应的索引index值,在渲染DOM节点时可以使用该索引值。 v-for索引index在HTML中的使用方法 在HTML结构中,我们可以使用 {{ }} 语法来引用v-for指令中的索引index值。例如: <d…

    Vue 2023年5月27日
    00
合作推广
合作推广
分享本页
返回顶部