Vuejs设计与实现4-渲染器设计

四、渲染器设计

渲染器+响应系统

最简渲染函数

使用以下函数渲染静态字符串或者动态拼接内容

// 渲染函数
function renderer(domString, container) {
  container.innerHTML = domString;
}

// 渲染dom
renderer("<p>123</p>", document.getElementById("main"));

vuereactivity

@vue/reactivity 包包含了副作用函数 effect 以及响应式 ref


渲染器基本原理

渲染器 renderer,渲染 render

虚拟节点(vnode) === 虚拟 DOM(vdom)

渲染器把虚拟 DOM 节点渲染为真实 DOM 节点的过程叫作挂载(mount)

第一次渲染称为挂载
后续渲染称为打补丁(patch),也即更新 dom


DIY 渲染器

createRenderer 函数

这是一个构建渲染器的函数,特别留意其中的打补丁 patch 函数的编写!

patch 的三个参数分别指:旧 vnode,新 vnode,挂载位置

function createRenderer() {
  // dom更新函数
  function patch(n1, n2, container) {}

  // 渲染函数
  function render(vnode, container) {
    // 如果虚拟DOM存在,则执行更新程序
    // 如果不存在,就挂载它
    if (vnode) {
      patch(container._vnode, vnode, container);
    } else {
      if (container._vnode) {
        container.innerHTML = "";
      }
    }
    container._vnode = vnode;
  }
}

构建一个 vnode 然后渲染它

const vnode = {
  type: "h1",
  children: "helloworld",
};

const renderer = createRenderer();
renderer.render(vnode, document.querySelector("#main"));

兼容所有浏览器渲染需求

可以将配置项交予渲染者进行定义,而不写死,这样就可以适配多浏览器了!

首先在渲染器函数内定义三大配置项:

function createRenderer() {

  // 定义三大配置项
  const { createElement, insert, setElementText } = options;

  function mountElement(){...}
}

定义 mountElement

// 挂载元素函数
function mountElement(vnode, container) {
  // 判断元素类型
  const ele = createElement(vnode.type);
  // 如果类型为string,那么设置文本
  if (typeof vnode.children === "string") {
    setElementText(ele, vnode.children);
  }
  // 将新元素插入到指定挂载点
  insert(ele, container);
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Zhillery

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值