• 672 vue列表渲染:v-for支持的类型,template元素,数组更新检测,v-for中的key,VNode,diff算法,源码


    列表渲染


    v-for基本使用


    v-for支持的类型


    01_v-for的基本使用.html

    <!DOCTYPE html>
    <html lang="en">
    <head>
      <meta charset="UTF-8">
      <meta http-equiv="X-UA-Compatible" content="IE=edge">
      <meta name="viewport" content="width=device-width, initial-scale=1.0">
      <title>Document</title>
    </head>
    <body>
      <div id="app"></div>
    
      <template id="my-app">
        <h2>电影列表</h2>
        <ul>
          <!-- 遍历数组 -->
          <li v-for="(movie, index) in movies">{{index+1}}.{{movie}}</li>
        </ul>
        <h2>个人信息</h2>
        <ul>
          <!-- 遍历对象 -->
          <li v-for="(value, key, index) in info">{{value}}-{{key}}-{{index}}</li>
        </ul>
        <h2>遍历数字</h2>
        <ul>
          <li v-for="(num, index) in 10">{{num}}-{{index}}</li>
        </ul>
      </template>
    
      <script src="../js/vue.js"></script>
      <script>
        const App = {
          template: '#my-app',
          data() {
            return {
              movies: [
                "星际穿越",
                "盗梦空间",
                "大话西游",
                "教父",
                "少年派"
              ],
              info: {
                name: "why",
                age: 18,
                height: 1.88
              }
            }
          }
        }
    
        Vue.createApp(App).mount('#app');
      </script>
    </body>
    </html>
    

    template元素


    02_v-for和template.html

    <!DOCTYPE html>
    <html lang="en">
    <head>
      <meta charset="UTF-8">
      <meta http-equiv="X-UA-Compatible" content="IE=edge">
      <meta name="viewport" content="width=device-width, initial-scale=1.0">
      <title>Document</title>
    </head>
    <body>
      <div id="app"></div>
    
      <template id="my-app">
        <ul>
          <template v-for="(value, key) in info">
            <li>{{key}}</li>
            <li>{{value}}</li>
            <li class="divider"></li>
          </template>
        </ul>
      </template>
    
      <script src="../js/vue.js"></script>
      <script>
        const App = {
          template: '#my-app',
          data() {
            return {
              info: {
                name: "why",
                age: 18,
                height: 1.88
              }
            }
          }
        }
    
        Vue.createApp(App).mount('#app');
      </script>
    </body>
    </html>
    

    数组更新检测


    03_数组的修改方法.html

    <!DOCTYPE html>
    <html lang="en">
    <head>
      <meta charset="UTF-8">
      <meta http-equiv="X-UA-Compatible" content="IE=edge">
      <meta name="viewport" content="width=device-width, initial-scale=1.0">
      <title>Document</title>
    </head>
    <body>
      <div id="app"></div>
    
      <template id="my-app">
        <h2>电影列表</h2>
        <ul>
          <li v-for="(movie, index) in movies">{{index+1}}.{{movie}}</li>
        </ul>
        <input type="text" v-model="newMovie">
        <button @click="addMovie">添加电影</button>
      </template>
    
      <script src="../js/vue.js"></script>
      <script>
        const App = {
          template: '#my-app',
          data() {
            return {
              newMovie: "",
              movies: [
                "星际穿越",
                "盗梦空间",
                "大话西游",
                "教父",
                "少年派"
              ]
            }
          },
          methods: {
            addMovie() {
              this.movies.push(this.newMovie);
              this.newMovie = "";
    
              // this.movies = this.movies.filter(item => item.length > 2);
            }
          }
        }
    
        Vue.createApp(App).mount('#app');
      </script>
    </body>
    </html>
    

    v-for中的key是什么作用?


    认识VNode


    虚拟DOM


    插入F的案例


    Vue源码对于key的判断


    没有key的操作(源码)


    没有key的过程如下


    有key执行操作(源码)


    有key的diff算法如下(一)


    有key的diff算法如下(二)


    有key的diff算法如下(三)


    04_key案例-插入f元素.html

    <!DOCTYPE html>
    <html lang="en">
    <head>
      <meta charset="UTF-8">
      <meta http-equiv="X-UA-Compatible" content="IE=edge">
      <meta name="viewport" content="width=device-width, initial-scale=1.0">
      <title>Document</title>
    </head>
    <body>
      <div id="app"></div>
    
      <template id="my-app">
        <ul>
          <li v-for="item in letters" :key="item">{{item}}</li>
        </ul>
        <button @click="insertF">插入F元素</button>
      </template>
    
      <script src="../js/vue.js"></script>
      <script>
        const App = {
          template: '#my-app',
          data() {
            return {
              letters: ['a', 'b', 'c', 'd']
            }
          },
          methods: {
            insertF() {
              // D9A9EF  90D0E8  90D0EA
              this.letters.splice(2, 0, 'f')
            }
          }
        }
    
        Vue.createApp(App).mount('#app');
      </script>
    </body>
    </html>
    

  • 相关阅读:
    UVA1401 Remember the word DP+Trie
    LG5202 「USACO2019JAN」Redistricting 动态规划+堆/单调队列优化
    模拟赛总结合集
    LG5201 「USACO2019JAN」Shortcut 最短路树
    LG5200 「USACO2019JAN」Sleepy Cow Sorting 树状数组
    LG5196 「USACO2019JAN」Cow Poetry 背包+乘法原理
    20190922 「HZOJ NOIP2019 Round #7」20190922模拟
    LG2530 「SHOI2001」化工厂装箱员 高维DP+记忆化搜索
    LG2893/POJ3666 「USACO2008FEB」Making the Grade 线性DP+决策集优化
    关于对QQ 输入法的评价
  • 原文地址:https://www.cnblogs.com/jianjie/p/14784257.html
Copyright © 2020-2023  润新知