👾 Vue3 Custom Renderer 特性使用

2,176 阅读3分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第1天,点击查看活动详情

写这篇文章的灵感是来自:

公司的一个内部项目中的表格,以及业界有些在线流程图编辑器的编辑渲染区域等都是通过canvas画的,从未接触过canvas的我对此表示震惊,难道canvas不应该是一线一点的画,这一个页面得画多久并且接口数据该怎么显示呢,同事说可以去了解了解custom renderer这个特性。

custom renderer 顾名思义:自定义渲染器

怎么去理解这个概念呢,Vue是一个基于mvvm模型的框架。

在传统mvc模式,我们使用jquery都需要手动使用appendChild、createElement等domAPI来更新视图,而mvvm模型,只需要关注业务逻辑,当我们的使用逻辑改变model层的数据后,view层就能响应到并进行更新。

我们再往深度思考些,我们在使用vue这些框架时候,为啥就不需要去使用这些domAPI了呢,这就是mvvm的魅力,这些操作都是框架底层进行的,无需我们手动操作,而更加专注于业务逻辑层的开发工作。

最后我的理解是,渲染器就是通过控制、完善这些dom的操作来达到渲染目的。而自定义渲染器,就是我们作为用户可以去改变控制这些操作来实现自定义底层的domAPI。

让我们来看一段代码:使用vue时候,我们在main文件中经常会写出以下的代码。

createApp(app).mount('#app')

先告诉你结果:当你写这串代码后,你就告诉了vue采取默认浏览器dom平台的模式。 那我们要自定义这个平台能力,那自然就是要对这串代码进行改写了!

如何改变vue默认浏览器dom平台模式。

让我们从源码来分析createApp干了些什么?

image-20220930235537451.png

调用createRender传入了默认的配置项 得到的renderer渲染器,所以我们可以理解为createApp是使用的默认平台。

1.默认配置项是什么?即rendererOptions image-20220930235908463.png ps: pure这个注释是为了如果该函数无执行的话删去该代码,方便打包工具进行treeshaking,降低包体积

我们会发现其实默认传入的配置项,就是一些进行过重写的原生domAPI而已

image-20221001000201911.png

2.调用的createRender函数是什么?

简略的讲就是创建渲染器函数,下面来看看这个函数体内容

image-20221001000833459.png

image.png

最后返回一个对象,对象属性是3个函数,其中它的属性createApp执行后得到的就是一个app实例(createApp执行后会拿到一个app实例对象,这个对象包含了mount,use,component,mixin等方法,这就是为什么我们createApp()后可以链式调用.use/.mount等方法)

话说回来,我们要怎么去修改vue的渲染平台呢?即改变默认的渲染方式。

怎么改变?声明一个渲染器配置项 image.png 最后进行挂载 image.png 让我们来看下canvasStage这个文件干了什么?(借助pixi.js能力进行绘制canvas) image.png 最后让我们来看看App这个组件代码

image.png

让我们来看看最终的渲染效果

foo.gif

感谢大家的观看~