vue3源码分析——实现props,emit,事件处理等

本文深入分析Vue3的源码,详细解释如何实现render中的`this`,包括props的传递、事件注册以及父子组件间的通信(通过props和emit)。通过测试用例、代码分析和实现过程,阐述关键功能的实现思路和解决的难点。
摘要由CSDN通过智能技术生成

引言

本期来实现,setup里面使用props,父子组件通信props和emit等,所有的源码请查看

本期的内容与上一期的代码具有联动性,所以需要明白本期的内容,最后是先看下上期的内容哦!😃😃😃

实现render中的this

在render函数中,可以通过this,来访问setup返回的内容,还可以访问this.$el等

测试用例

由于是测试dom,jest需要提前注入下面的内容,让document里面有app节点,下面测试用例类似在html中定义一个app节点哦

 let appElement: Element;beforeEach(() => {appElement = document.createElement('div');appElement.id = 'app';document.body.appendChild(appElement);});afterEach(() => {document.body.innerHTML = '';}) 

本功能的测试用例正式开始

test('实现代理对象,通过this来访问', () => { let that;const app = createApp({render() {// 在这里可以通过this来访问that = this;return h('div', { class: 'container' }, this.name);},setup() {return {name: '123'}}});const appDoc = document.querySelector('#app')app.mount(appDoc);// 绑定值后的htmlexpect(document.body.innerHTML).toBe('<div id="app"><div class="container">123</div></div>'); const elDom = document.querySelector('#container')// el就是当前组件的真实domexpect(that.$el).toBe(elDom);}) 

分析

上面的测试用例

1.setup返回是对象的时候,绑定到render的this上面
2.$el则是获取的是当前组件的真实dom

解决这两个需求:

1.需要在render调用的时候,改变当前函数的this指向,但是需要思考的一个问题是:this是啥,它既要存在setup,也要存在el,咋们是不是可以用一个proxy来绑定呢?在哪里创建呢 可以在处理组件状态setupStatefulComponent来完成改操作
2.el则是在mountElement中挂载真实dom的时候,把当前的真实dom绑定在vnode当中

编码

针对上面的分析,需要在setupStatefulComponent中来创建proxy并且绑定到ins

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值