学习目标

  • 模仿学习组件库的 message 组件,知道组件原理

主要是学习函数式调用 message (动态挂载) ,单例调用。

源码浅解

vue3 message源码地址
知识点

  • 定时清除功能函数实现,如果 props.duration > 0,说明需要定时清除,duration毫秒过后,且visible 为true,关闭实例。 ```javascript function startTimer() { if (props.duration > 0) { ;({ stop: stopTimer } = useTimeoutFn(() => {
    1. if (visible.value) close()
    }, props.duration)) } }

function clearTimer() { stopTimer?.() }

  1. - 销毁全部实例,创建的时候保存instancescloseAll()的时候就遍历这个数据,将其close()
  2. ```javascript
  3. const instances: MessageQueue = []
  4. export function closeAll(): void {
  5. for (let i = instances.length - 1; i >= 0; i--) {
  6. const instance = instances[i].vm.component
  7. ;(instance?.proxy as any)?.close()
  8. }
  9. }

结构如下图,它有一个全局对象message,这个message是个函数,它接收两个参数 option 和 context。

  1. 处理异常边界情况;
  2. 处理options,生成props;
  3. 获取 document.body 节点,准备把message节点插入,确认插入节点和插入的内容。
  4. 使用createVNode生成虚拟DOM,render(vm, container),然后把container挂在在body上。

image.png

总结

时间比较匆忙,挑了一些感兴趣的内容看。函数式调用组件使用起来比较舒服,核心思路是将生成的DOM动态挂载到document.body上,可以用在项目里。