Vue3渲染器的设计 - 自定义渲染器 - 代码抽离封装优化

<!DOCTYPE html>

<html lang="en">

  <head>

    <meta charset="UTF-8" />

    <meta name="viewport" content="width=device-width, initial-scale=1.0" />

    <title>使用配置项抽离封装API</title>

  </head>

  <body>

    <div id="app"></div>

    <script>

      /**

       * 自定义渲染器

       */

      function createRenderer(options) {

        const {

          createElement,

          insert,

          setElementText

        } = options

        function render(vnode, container) {

          if (vnode) {

            patch(container._vnode, vnode, container);

          } else {

            container.innerHTML = "";

          }

          container._vnode = vnode;

        }

        function patch(n1, n2, container) {

          // console.log('container', container);

          if (!n1) {

            mountElement(n2, container);

          } else {

            // 打补丁

          }

        }

        // 主要改动这里

        function mountElement(vnode, container) {

          const el = createElement(vnode.type);

          if (typeof vnode.children === "string") {

            setElementText(el, vnode.children)

          }

          insert(el, container)

        }

        return { render };

      }

      // 测试代码

      const renderer = createRenderer({

        createElement(tag) {

          return document.createElement(tag)

        },

        setElementText(el, text) {

          el.textContent = text

        },

        insert(el, parent, anchor = null) {

          parent.insertBefore(el, anchor)

        }

      });

      const vnode = {

        type: "h1",

        children: "hello world",

      };

      renderer.render(vnode, document.querySelector("#app"));

    </script>

  </body>

</html>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值