javascript - Vue 3 - 发出原始值不会触发输入?
问题描述
我在使用 Vue3 $emit 时遇到了一个奇怪的问题。我正在重构我自己的 Vue2“表单输入”组件,它基本上是一个用于呈现文本输入、(多)选择选项、文本区域或任何其他基本输入字段的包装器。
该组件用于将值绑定到 v-model,因此它通过“this.$emit('input', this.value)”发出输入。
由于 Vue 3 将输入更改为 update:modelValue,因此我进行了此修改并另外向组件提供了“Emits”-property-list。一切似乎都在工作......
但后来我意识到 Vue-multiselect 3(NPM 包“vue-multiselect”:“^3.0.0-alpha.2”)正在发出原始值,一个整数,它不会触发父组件上的@input。
form-input.vue
<input v-if="resolveType === 'text' || resolveType === 'number' || resolveType === 'tel' || resolveType === 'email'"
v-model="localValue"
@input="$emit('update:modelValue', $event.target.value)"
/>
<multiselect v-model="localValue"
class="full-width-tags"
@update:model-value="$emit('update:modelValue', $event)"
/>
// Please note that multiselects $event is an integer, I have checked this multiple times from console.log
...当我在父组件上侦听@input 时,似乎“文本”类型的字段会触发事件侦听器,但多选不会。这些组件的唯一区别是多选发送原始值(整数),而输入发送事件对象。
有人可以解释为什么 @input 对事件对象和原始值的处理方式不同,以及如何修复我的多选发出以便它发出输入?目前我正在为多选一个接一个地发出“update:modelValue”和“input”事件,但我只是想知道是否有更简单的方法?
解决方案
从您的问题来看,您似乎已经阅读了 Vue 3 迁移指南 - 特别是关于更改v-model
自定义组件的部分并将您更改form-input
为发出update:modelValue
事件而不是input
事件
那么为什么要使用而不是监听组件的更新form-input
呢?@input
@update:modelValue
@input
放置在父组件上的唯一原因form-input
是由于此更改
简而言之 - 因为您的组件声明它发出update:modelValue
事件(使用emits
选项),所以放置在其上的每个其他事件侦听器都直接绑定到组件的根元素 -<input>
在这种情况下为原生
这不是你想要的。只需更改<form-input @input="..." />
为<form-input @update:modelValue="..." />
推荐阅读
- python - 如何在 HoloViews/Bokeh 中的绘图之间创建带有小部件(选择器)和交互性(点击流)的仪表板?
- laravel - 使用 laravel 在数字海洋空间的现有文件中找不到文件异常
- facebook - 如何在每天下午 6 点自动将新文件上传到 Facebook Marketplace?
- javascript - 在 Chrome、Firefox 等中的某些页面没有加载 JavaScript,但在 Brave 中正确加载
- amazon-cloudformation - 在 CloudFormation 模板中指定外部 EDGE 网关 ApiId 的格式是什么?
- python - 网络抓取 coinmarketcap - 未获取所有数据
- javascript - 带有 CSV 文件的 CakePHP 4.x Ajax 请求
- variables - 将变量作为参数传递给 GAMS 中的新模型
- javascript - 如何取消转义 JSON 字符串化 textarea 值?
- angular - 我的 Angular UI 没有根据我从 .Net Core API 的 HTTP GET 请求返回的列表进行更新