• 双向数据绑定原理


    Vue 里面

    <!DOCTYPE html>
    <html lang="en">
    <head>
      <meta charset="UTF-8">
      <meta name="viewport" content="width=device-width, initial-scale=1.0">
      <meta http-equiv="X-UA-Compatible" content="ie=edge">
      <title>Document</title>
    </head>
    <body>
      <div id="app">
        <input type="text" v-model="msg">
        <div>{{msg}}</div>
      </div>
    </body>
    <script src="https://cn.vuejs.org/js/vue.js"></script>
    <script>
      let vm = new Vue({
        el: '#app',
        data: {
          msg: '数据双向绑定',
        },
      });
    </script>
    </html>

    -----------------------------

    然后 自己实现一个

    原理大概是==》

      1 将数据和节点挂在在一起

    <!DOCTYPE html>
    <html lang="en">
    <head>
      <meta charset="UTF-8">
      <meta name="viewport" content="width=device-width, initial-scale=1.0">
      <meta http-equiv="X-UA-Compatible" content="ie=edge">
      <title>Document</title>
    </head>
    <body>
      <div id="app">
        <input type="text" v-model="msg">
        <div>{{msg}}</div>
      </div>
    </body>
    <script>
      // 将数据和节点绑定在一起
      function comPile(el) {
        let ele = document.querySelector(el);
      }
      comPile('#app');
    </script>
    </html>

      2 我们不要直接操作Dom节点,可能会导致页面的回流,导致页面的重新渲染,这样效率会很低。我们应该把ele下面的Dom 都放到内存里面操作,操作好了再放到页面上。

      3 我们怎么把Dom 放到 内容里面呢   我们可以创建一个文档碎片 

    let fragment = document.createDocumentFragment();

      4 取ele 下面的第一个元素,直到取完为止,并且将内容放到文档碎片里面。

          let child;
          while ((child = ele.firstChild)) {
            fragment.appendChild(child);
          }
          // todo 这里可以干一些事情是不会导致页面回流的
          ele.appendChild(fragment);

      5 fragment 在这里是一个 nodeList 类数组(不能用数组的一些方法) 转成我们的原生数组

     

    Array.from(fragment).forEach(node => {
     // ...
    })

      6 

  • 相关阅读:
    Title标题及Description描述字数
    网站优化十忌
    link和domain的区别
    什么是回合制游戏
    人文社科核心、中文核心、北大核心期刊
    锚文本
    笔记本声音尖叫的问题
    Educational Technology Journals(转)
    配置SharePoint门户网站的基本思路
    SEO 如何优化单个页面16招
  • 原文地址:https://www.cnblogs.com/xzqyun/p/9948627.html
Copyright © 2020-2023  润新知