vue中关于$event的通俗理解

vue中关于$event的通俗理解

通过对$event的多次打印结果,可见:

$event是指当前触发的是什么事件(鼠标事件,键盘事件等)

$event.target则指的是事件触发的目标,即哪一个元素触发了事件,这将直接获取该dom元素

下面是例子:

<button @click="console.log($event)" name="哈哈">单击</button>

由于鼠标点击,所以触发鼠标单击事件,打印出来的是事件,如下图:

在这里插入图片描述

展开后确实有target属性,且target说明了这是button:
在这里插入图片描述

实际上展开target就可以看到更具体的信息,这里不做演示,其实也就是这个button的各种属性等等,直接就是这dom元素。

且看下面这段代码,直接打印出target:

<button @click="console.log($event.target)" name="哈哈">单击</button>

在这里插入图片描述
可见打印出来的值就是这个元素本身
我们可尝试获取其属性值:

<button @click="console.log($event.target.name)" name="哈哈">单击</button>

在这里插入图片描述
所以我们可以利用$event进行一些函数传值之类的特殊操作

参考链接:https://www.jianshu.com/p/3f2c664e43d8

<think>嗯,用户之前问了关于Vue2和Vue3的diff算法区别,现在又转向v-model的区别。看来他对Vue版本的升级变化很感兴趣,可能是在学习或者迁移项目时需要了解这些差异。用户提供的引用内容里提到了v-model在Vue3中的变化,比如多v-model支持和修饰符的不同,还有sync修饰符在Vue2中的使用。需要结合这些信息来组织回答。 首先,用户的需求是了解v-model在Vue2和Vue3中的实现差异和使用区别,并希望有详细解释和示例。之前的回答已经详细对比了diff算法,这次要确保结构清晰,分点说明,每个部分都给出示例,这样用户更容易理解。 要确定主要区别点。根据引用3,Vue3允许多个v-model绑定,而Vue2只能一个。Vue2使用.sync修饰符实现父子组件双向绑定,而Vue3将其整合到v-model中。此外,默认prop和event名称也有变化,Vue3使用modelValue和update:modelValue,而Vue2是value和input。还有自定义修饰符的处理方式不同。 需要举例说明这些差异,比如在Vue3中如何写多个v-model,如何自定义修饰符,而Vue2中如何通过.sync实现类似功能。同时要对比两者的实现原理,说明Vue3的改进点,比如语法糖的简化,更灵活的多绑定支持。 还要注意用户可能的应用场景,比如表单处理、复杂组件通信,这些实际开发中的情况,给出最佳实践建议,帮助用户理解何时使用哪种方式更合适。 确保回答结构清晰,分核心差异、使用对比、示例详解等部分,每个部分用标题分隔,代码示例用正确的格式,并引用提供的资料中的信息。比如引用3提到的Vue3多v-model写法,引用2和4关于Vue2的.sync和v-model使用,都需要在适当的地方引用。 最后,生成的相关问题要围绕v-model的扩展应用、迁移注意事项等,帮助用户进一步学习。检查是否覆盖了用户的所有需求点,确保信息准确,示例正确,并且语言通俗易懂,符合中文表达习惯。</think>### Vue2 与 Vue3 中 `v-model` 的核心差异与示例详解 --- #### 一、核心差异对比 | **特性** | **Vue2** | **Vue3** | |------------------------|------------------------------------------|------------------------------------------| | **多模型绑定** | 仅支持单个 `v-model` | 支持多个 `v-model`(如 `v-model:prop1`, `v-model:prop2`) | | **默认属性/事件名** | `value` + `input` 事件 | `modelValue` + `update:modelValue` 事件 | | **`.sync`修饰符** | 需通过 `.sync` 修饰符实现双向绑定 | 已整合到 `v-model` 中,`.sync` 被废弃 | | **自定义修饰符** | 仅支持内置修饰符(如 `.trim`) | 支持自定义修饰符(如 `v-model.custom`) | --- #### 二、实现原理差异 1. **Vue2 的 `v-model` 实现** - 本质是语法糖:`value` 属性 + `input` 事件监听 ```javascript // 等价写法 <input :value="msg" @input="msg = $event.target.value"> ``` - **组件通信示例**: ```vue <!-- 子组件 --> <input :value="value" @input="$emit('input', $event.target.value)"> <!-- 父组件 --> <ChildComponent v-model="msg" /> [^4] ``` 2. **Vue3 的 `v-model` 实现** - 语法糖升级为 `modelValue` + `update:modelValue` ```vue <!-- 父组件 --> <ChildComponent v-model:title="pageTitle" v-model:content="pageContent" /> <!-- 等价展开 --> <ChildComponent :title="pageTitle" @update:title="pageTitle = $event" :content="pageContent" @update:content="pageContent = $event" /> [^3] ``` --- #### 三、典型场景对比 **场景1:多属性双向绑定** ```vue <!-- Vue2 需借助 .sync --> <ChildComponent :title.sync="pageTitle" :content.sync="pageContent" /> <!-- Vue3 直接使用多 v-model --> <ChildComponent v-model:title="pageTitle" v-model:content="pageContent" /> [^2][^3] ``` **场景2:自定义修饰符** ```vue <!-- Vue2 无法自定义修饰符 --> <input v-model.trim="msg"> <!-- Vue3 支持自定义处理 --> <input v-model.custom="msg"> ``` ```javascript // Vue3 子组件处理 props: { modelValue: String, modelModifiers: { default: () => ({}) } }, methods: { handleInput(e) { let value = e.target.value if (this.modelModifiers.custom) { value = value.toUpperCase() // 自定义处理 } this.$emit('update:modelValue', value) } } ``` --- #### 四、底层实现差异 1. **Vue2 的编译结果** ```javascript // 输入框的 v-model 编译后 _c('input', { directives: [{ name: 'model', value: msg }], domProps: { value: msg }, on: { input: function($event) { msg = $event.target.value } } }) ``` 2. **Vue3 的编译优化** ```javascript // 多 v-model 编译结果 _createVNode(ChildComponent, { title: pageTitle, "onUpdate:title": $event => (pageTitle = $event), content: pageContent, "onUpdate:content": $event => (pageContent = $event) }) ``` --- #### 五、迁移注意事项 1. **Vue2 升级 Vue3 需修改**: - 替换 `.sync` 为多 `v-model` - 修改 `value` → `modelValue`,`input` → `update:modelValue` 2. **兼容性处理**: ```javascript // Vue3 组件兼容旧写法 props: ['modelValue'], emits: ['update:modelValue'], computed: { value: { get() { return this.modelValue }, set(val) { this.$emit('update:modelValue', val) } } } ``` --- ### 示例详解 **Vue3 多 `v-model` 表单组件** ```vue <!-- Parent.vue --> <FormComponent v-model:username="user.name" v-model:age="user.age" v-model.capitalize="user.nickname" /> <!-- FormComponent.vue --> <template> <input :value="username" @input="$emit('update:username', $event.target.value)"> <input :value="age" @input="$emit('update:age', $event.target.value)"> <input :value="modelValue" @input="handleNickname($event.target.value)" > </template> <script setup> const props = defineProps({ username: String, age: Number, modelValue: String, modelModifiers: { default: () => ({}) } }) const emit = defineEmits(['update:username', 'update:age', 'update:modelValue']) const handleNickname = (val) => { if (props.modelModifiers.capitalize) { val = val.toUpperCase() } emit('update:modelValue', val) } </script> [^1][^3] ``` --- #### 相关问题 1. 如何实现 Vue3 中 `v-model` 的自定义验证逻辑? 2.Vue3 中如何处理 `v-model` 与非表单组件的双向绑定? 3. 为什么 Vue3 废弃了 `.sync` 修饰符?迁移时需要注意哪些问题?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值