vue 自定义组件_【Vue原理】Event - 白话版

d37a6763ec695b830518ddbb3c53b3b8.png
专注 Vue 源码分享,文章分为白话版和 源码版,白话版助于理解工作原理,源码版助于了解内部详情,让我们一起学习吧
研究基于 Vue版本【2.5.17】

Vue 事件是我最感兴趣的东西之一,一直想研究玩玩

特别是组件自定义事件,很想知道,给子组件绑定自定义事件,子组件是怎么触发的 巴拉巴拉的

开始正文了

在 Vue 中,事件大概分为 4 种

1、自定义事件

2、DOM 事件

3、组件DOM 事件

4、组件自定义事件

然后再细分,就只有两种

1、自定义事件

2、DOM 事件

下面就来粗略说一下事件

如果你觉得排版难看,请点击下面链接

【Vue原理】Event - 白话版​mp.weixin.qq.com
2c74d5aa6ac68dadbe6c3cf56f63b120.png

或者 关注公众号【神仙朱】吧

f6184000282e8f16f27df002bc53f1a5.png

自定义事件

自定义事件 是使用观察者模式建立起来的一种事件机制

分为 个人使用 和 组件使用

自定义事件主要由下面两部分构成

1、有事件存储器

2、绑定事件,触发事件,解绑事件三个函数

在 Vue 中,每个实例都会添加一个属性_events,用来存放本实例上注册的自定义事件

63c895cc53435055866dded214bdab82.png

_events 就是 事件存储器,是一个对象

属性名是 事件名,属性值是事件回调

个人调用自定义事件

我也经常在项目中使用到 自定义事件,像下面这样

49f52c26739956962822e007c894c403.png

没错,$on 就是注册事件,$emit 是 触发事件,$off 就是 解绑事件

在哪个实例上注册的事件,事件就属于哪个实例,正常情况下,你是不可能能触发别的实例上的事件的

而给组件绑定自定义事件 是怎么样的呢?

7adb1666973a7856453dee680041e624.png

结果也是一样的,前面的解析处理可以不管,最后同样是使用内置的 $on 方法去注册事件

而这个事件依然是属于子组件的,存放在 子组件的 _events 中

f4001fae11ed3e3cae9e967d8ae0ba2a.png

所以你可以在子组件中,使用 this.$emit 触发这个事件

DOM 事件

DOM 事件,最后就是直接给 DOM 绑定事件

使用 addEventListeners 绑定事件,没有做任何兼容处理,灰常简单

绑定事件,是在DOM 创建之后,插入页面之前

1、普通标签绑定事件

452c67465a4b8f37e88dfd0407114af8.png

很简单,普通 addEventListener 绑定DOM事件就完事了

事件会被保存在这个节点解析成的 vnode 中,就是 vm._vnode

5ee0fffd9dd26ada1648478ee9a18442.png

2、组件绑定DOM 事件

如果要给组件绑定原生DOM 事件,需要加上 native 这个修饰器

7e5a27937a8ea70419109dc50ecf051f.png

组件绑定的DOM 事件,在父实例解析完毕开始挂载时,遇到子元素是组件,然后去解析组件内部并生成DOM之后才 addEventListener 绑定

绑定的原生事件,会被存放在组件的外壳节点上 vm.$vnode

1e544722bb9308e09e635dadc695b6e6.png

还有,你可能会想,如果这样绑定DOM事件会怎么样?

cf3207d718a517b33b3d38e8ce914ec1.png

问得好,这样并不会绑定DOM事件,而是给组件绑定自定义事件,最后是会存在 子组件的 _events 中的,并不会绑定DOM事件

5861b22b0383b8fc3a0ef9a9622cdaf8.png

然后可以在子组件中用 this.$emit("click") 去触发这个父组件绑定的这个click

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
回答: 在Vue中,我们可以通过自定义组件的v-model来实现双向数据绑定。默认情况下,v-model在组件上使用modelValue作为prop,并以update:modelValue作为对应的事件。可以通过给v-model指定一个参数来更改这些名字。例如,可以这样使用自定义组件v-model:`<MyComponent v-model:title="bookTitle" />`\[1\]。 另一种实现v-model的方式是使用一个可写的计算属性,同时具有getter和setter。getter方法返回modelValue prop的值,而setter方法触发相应的事件。下面是一个示例组件的代码: ```javascript // CustomInput.vue <script> export default { props: \['modelValue'\], emits: \['update:modelValue'\], computed: { value: { get() { return this.modelValue }, set(value) { this.$emit('update:modelValue', value) } } } } </script> <template> <input v-model="value" /> </template> ``` 通过这种方式,我们可以在自定义组件中使用v-model来实现双向数据绑定\[2\]。 此外,组件的v-model上添加的修饰符可以通过modelModifiers prop在组件内访问到。在组件中声明modelModifiers prop,并将其默认值设置为一个空对象。通过这种方式,我们可以在组件中访问到v-model的修饰符。例如,在下面的组件中,我们声明了modelModifiers这个prop,并在created钩子函数中打印出了modelModifiers的值: ```javascript <script> export default { props: { modelValue: String, modelModifiers: { default: () => ({}) } }, emits: \['update:modelValue'\], created() { console.log(this.modelModifiers) // { capitalize: true } } } </script> <template> <input type="text" :value="modelValue" @input="$emit('update:modelValue', $event.target.value)" /> </template> ``` 通过这种方式,我们可以在自定义组件中使用v-model的修饰符\[3\]。 #### 引用[.reference_title] - *1* *2* *3* [Vue定义组件中 v-model 的使用](https://blog.csdn.net/qq_40179479/article/details/126564499)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值