Vue组件的实现原理详细分析

 更新时间:2023年01月03日 16:03:09   作者:知奕奕  
在日常业务开发中我们会经常封装一些业务组件,下面这篇文章主要给大家介绍了关于Vue组件的实现原理,文中通过示例代码介绍的非常详细,需要的朋友可以参考下

渲染组件

一个组件内部必须要使用 render 进行渲染,且返回虚拟 DOM

这是一个最简组件实例

const MyComponent = {
  // 组件名称,可选
  name: "MyComponent",
  // 组件的渲染函数,其返回值必须为虚拟 DOM
  render() {
    // 返回虚拟 DOM
    return {
      type: "div",
      children: `我是文本内容`,
    };
  },
};

渲染器中的 mountComponent 函数完成组件的渲染

function mountComponent(vnode, container, anchor) {
  // 通过 vnode 获取组件的选项对象,即 vnode.type
  const componentOptions = vnode.type;
  // 获取组件的渲染函数 render
  const { render } = componentOptions;
  // 执行渲染函数,获取组件要渲染的内容,即 render 函数返回的虚拟
  const subTree = render();
  // 最后调用 patch 函数来挂载组件所描述的内容,即 subTree
  patch(null, subTree, container, anchor);
}

组件更新

组件初始化步骤:

  • 取得 data 函数后用 reactive 将其变成响应式的
  • render 函数内将 this 指向 state,并将 state 作为第一个参数传入 render 函数

将渲染任务包装到一个副作用函数 effect 里面,即可实现响应式更新数据

若要使每次响应式数据修改后,effect 仅执行一次,则需要引入调度器概念

这是书中给出的最简调度器实例

即先把 effect 放入微任务队列,等执行栈清空再调出来执行

// 任务缓存队列,set可以自动去重
const queue = new Set();
// 一个标志,代表是否正在刷新任务队列
let isFlushing = false;
// 创建一个立即 resolve 的 Promise 实例
const p = Promise.resolve();
// 调度器的主要函数,用来将一个任务添加到缓冲队列中,并开始刷新队列
function queueJob(job) {
  // 将 job 添加到任务队列 queue 中
  queue.add(job);
  // 如果还没有开始刷新队列,则刷新之
  if (!isFlushing) {
    // 将该标志设置为 true 以避免重复刷新
    isFlushing = true;
    // 在微任务中刷新缓冲队列
    p.then(() => {
      try {
        // 执行任务队列中的任务
        queue.forEach((job) => job());
      } finally {
        // 重置状态
        isFlushing = false;
        queue.clear = 0;
      }
    });
  }
}

父子组件

这是一个简单的父子组件代码

// 子组件
<template>
  <MyComponent :title="title" />
</template>
// 父组件
const vnode = {
  type: MyComponent,
  props: {
    title: 'A Big Title'
  }
}

父组件更新导致子组件更新(被动更新)过程:

  • 父组件自更新
  • 渲染器检查 subTree 发现存在 vnode,则调用 patchComponent 实现子组件更新

setup函数

setup 函数为配合组合式 API 所引入的

他有如下两种返回值形式

// 返回函数
const comp = {
  setup() {
    return () => {
      return {
        type: "div",
        children: "give up for vuejs",
      };
    };
  },
};
// 返回对象
const comp = {
  setup() {
    const count = ref(0);
    return {
      count,
    };
  },
  render() {
    return {
      type: "div",
      children: `count is ${this.count}`,
    };
  },
};

setup 接收两个参数,分别是 props 以及 setupContext

setupContext 包含以下四个主要对象

  • slots 插槽
  • emit 自定义事件
  • attrs 自定义属性
  • expose 暴露

emit 实现

只需要实现一个 emit 函数并将其添加到 setupContext 对象中

到此这篇关于Vue组件的实现原理详细分析的文章就介绍到这了,更多相关Vue组件实现原理内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Vue实战记录之登陆页面的实现

    Vue实战记录之登陆页面的实现

    最近学习过程中常碰到让用户登录注册这种,这篇文章主要给大家介绍了关于Vue实战记录之登陆页面实现的相关资料,需要的朋友可以参考下
    2021-06-06
  • vue-cli webpack模板项目搭建及打包时路径问题的解决方法

    vue-cli webpack模板项目搭建及打包时路径问题的解决方法

    这篇文章主要介绍了vue-cli webpack模板项目搭建以及打包时路径问题的解决方法,需要的朋友可以参考下
    2018-02-02
  • Vue3中依赖注入provide、inject的使用

    Vue3中依赖注入provide、inject的使用

    这篇文章主要介绍了Vue3中依赖注入provide、inject的使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-10-10
  • Vue中router-link常用属性使用案例讲解

    Vue中router-link常用属性使用案例讲解

    这篇文章主要介绍了Vue中router-link常用属性使用案例讲解,本文结合实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-01-01
  • 解决VUE项目在IIS部署出现:Uncaught SyntaxError: Unexpected token < 报错

    解决VUE项目在IIS部署出现:Uncaught SyntaxError: Unexpected&n

    这篇文章介绍了解决VUE项目在IIS部署出现:Uncaught SyntaxError: Unexpected token < 报错的方法,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-04-04
  • 加载 vue 远程代码的组件实例详解

    加载 vue 远程代码的组件实例详解

    vue-cli 作为 Vue 官方推荐的项目构建脚手架,它提供了开发过程中常用的,热重载,构建,调试,单元测试,代码检测等功能。我们本次的异步远端组件将基于 vue-cli 开发
    2017-11-11
  • Vue+vite创建项目关于vite.config.js文件的配置方法

    Vue+vite创建项目关于vite.config.js文件的配置方法

    Vue项目创建时,我们见过vue-cli 创建项目和webpack 创建项目等方式,这篇文章主要介绍了Vue+vite创建项目关于vite.config.js文件的配置方法,需要的朋友可以参考下
    2023-06-06
  • Vue3中el-table表格数据不显示的原因和解决方法

    Vue3中el-table表格数据不显示的原因和解决方法

    这篇文章主要给大家介绍了Vue3中el-table表格数据不显示的原因和解决方法,文中有详细的代码示例供大家参考,如果有遇到相同问题的朋友可以参考阅读本文,希望能够帮到您
    2023-11-11
  • Vue2与Vue3兄弟组件通讯bus的区别及用法

    Vue2与Vue3兄弟组件通讯bus的区别及用法

    这篇文章主要介绍了Vue2与Vue3兄弟组件通讯bus的区别及用法,有需要的朋友可以借鉴参考下,希望可以有所帮助,祝大家多多进步早日升职加薪
    2021-09-09
  • 精读《Vue3.0 Function API》

    精读《Vue3.0 Function API》

    这篇文章主要介绍了精读《Vue3.0 Function API》,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-05-05

最新评论