如何删除 vue 3 中已弃用的 $listeners

use*_*584 13 javascript migration vue.js vuejs3

在从 vue 2 迁移到 vue 3 的过程中,我收到一些编译警告。弃用$listenersin 组件就是这些警告之一。我已经检查了官方文档以$attrs通过删除$listeners. 我是 vue 3 的新手。所以,无法理解如何处理与侦听器相关的那些警告。

这是片段:

第一种情况: 组件 1

    <template>
    <div>
        <input ref="input"
               :value="txtField"
               @input="txtField=$event.target.value"
               :type="inputType"
               :class="inputClass"
               :placeholder="placeholder"
               :disabled="disabled"
               :readonly="readonly"
               :onfocus="disabled&&'this.blur();'"
               :tabindex="tabindex"
               v-on="listenersInput" // here is the method where $listeners used
               @keyup.enter="enterHandler"
               @blur="validateOnEvent"/>
     </div>
</template>

//method 

listenersInput() {
            //var vm = this;
            return Object.assign({}, this.$listeners, {
                input: function(event){ /*vm.$emit('input',event.target.value);*/}
            });
        },
Run Code Online (Sandbox Code Playgroud)

第二种情况: 组件 2

<template>
  <custom-button 
      v-bind="buttonProps"
      v-on="$listeners"
      :class="buttonClass"
      @click="tooggle">
  </custom-button>
</template>
Run Code Online (Sandbox Code Playgroud)

这两种情况该如何处理呢?

小智 12

在 Vue 3 中$listeners移至$attrs你可以使用v-bind="$attrs". 这是文档中的一篇文章

附加文档:https://vuejs.org/guide/components/attrs.html#nested-component-inheritance

  • 您不仅可以提供链接,还可以在此处复制相关代码以便于阅读。 (8认同)

Man*_*los 8

在 Vue 2 中,您可以使用 绑定所有事件侦听器v-on="$listeners"

在 Vue 3 中,根据文档,如果要将 Fallthrough 属性应用于非根元素,则必须使用v-bind="$attrs"还包括事件侦听器的元素。

所以这个 Vue 2 代码:

<div>
  <my-button v-on="$listeners">click me</my-button>
</div>
Run Code Online (Sandbox Code Playgroud)

在 Vue 3 中看起来像这样:

<div>
  <my-button v-bind="$attrs">click me</my-button>
</div>
Run Code Online (Sandbox Code Playgroud)

  • 尽管这是官方建议,但这是有些不正确的建议。虽然 $attrs 现在包含 $listeners,但它还包含其他内容,组件可能依赖这些内容绑定到默认包装元素或其他位置,因此这对于任何实现它的组件来说都是一个重大更改。 (4认同)
  • 你是对的@Damon,但我找不到更干净的方法。欢迎提出建议 (2认同)