vue.js - 将事件绑定到自定义组件
问题描述
使用 Vue3
我正在创建一个自定义组件,并希望将事件绑定到其中的输入。所以在这种情况下,我想做一些与v-bind="inputProps"
. 现在$listeners
是如何被删除的?正如您可能看到的那样,我无法使用v-bind="$attrs"
这些属性,因为这些属性被划分到它们“去”的地方。
我来这里是为了解决问题,但任何关于改进的提示总是一个受欢迎的奖励。
// c-text.vue
<template>
<input
v-if="useAsSingleElement"
v-bind="inputProps"
:class="['c-text', 'c-text--is-single-element']"
@input="$emit('input', $event)"
@blur="$emit('blur')"
@focus="$emit('focus')">
<c-form-item-shell
v-else
:id="id"
:is-required="isRequired"
:label-text="labelText"
:icon="icon"
:icon-class="iconClass"
:errors="errors"
:information="information">
<template #element>
<input
v-bind="inputProps"
class="c-text"
@input="$emit('input', $event.target.value)"
@blur="$emit('blur')"
@focus="$emit('focus')">
</template>
</c-form-item-shell>
</template>
<script>
import { computed } from 'vue'
import CFormItemShell from '@/components/c-form-item-shell.vue'
export default {
components: {
CFormItemShell
},
props: {
useAsSingleElement: { type: Boolean, required: false, default: false },
name: { type: String, required: true },
type: { type: String, required: false, default: 'text' },
placeholder: { type: String, required: false, default: null },
maxlength: { type: [String, Number], required: false, default: null },
minxlength: { type: [String, Number], required: false, default: null },
pattern: { type: String, required: false, default: null },
readonly: { type: Boolean, required: false, default: false },
spellcheck: { type: Boolean, required: false, default: false },
autocomplete: { type: Boolean, required: false, default: true },
id: { type: String, required: true },
isRequired: { type: Boolean, required: false, default: false },
labelText: { type: String, required: false, default: null },
icon: { type: String, required: false, default: null },
iconClass: { type: String, required: false, default: null },
errors: { type: [String, Array], required: false, default: null },
information: { type: [String, Array], required: false, default: null }
},
emits: ['input', 'blur', 'focus'],
setup (props) {
const inputProps = computed(() => {
return {
id: props.id,
name: props.name ? props.name : props.id,
type: props.type,
placeholder: props.placeholder,
maxlength: props.maxlength,
minlength: props.minlength,
pattern: props.pattern,
readonly: props.readonly,
spellcheck: props.spellcheck,
autocomplete: props.autocomplete ? 'on' : 'off'
}
})
return {
inputProps
}
}
}
</script>
解决方案
基于迁移指南:
在 Vue 3 的虚拟 DOM 中,事件监听器现在只是属性,前缀
on
为 ,因此是对象的一部分$attrs
,因此$listeners
已被删除。
所以只需传递您的事件,例如onClick
,onBlur
...和
export default {
inheritAttrs: false
}
推荐阅读
- reactjs - React Router Dom 在构建时重定向错误
- c# - 如何执行此循环以从 IEnumerable 跨 (x,y) 轴打印值?
- regex - 获取字符串中每个单词的首字母并使用正则表达式连接成新单词
- count - 如何计算lisp列表中出现的次数
- java - 如何从 Vector 中的对象获取浮点值?
- c++ - 使用单个输入 C++ 在数组中存储多个整数
- r - 如何从 R 类加载中提取百分比方差信息
- java - Java 是否有不需要添加显式 jar 引用的内部 JSON 库?
- javascript - Javascript 仅使用循环来显示数据数组(并非所有数据数组)
- google-apps-script - 如何仅在 Google Apps 脚本 replaceText() 完成后创建 PDF?