• Vue vfor 循环更优雅的 7 种方式


    v-for循环最基本的用法是这样的:

    <ul>
      <li v-for='product in products'>
        {{ product.name }}
      </li>
    </ul>
    

      

    1. 始终在v-for循环中使用key

    首先,我们讨论的是大多数Vue开发人员已经知道的常见最佳实践——在v-for循环中使用:key。通过设置唯一的键属性,可以确保组件按期望的方式工作。

    如果我们不使用:key,Vue将使DOM尽可能高效。这可能会导致v-for元素出现乱序或其他不可预测的行为。

    如果我们对每个元素都有唯一的键引用,那么就可以更好地预测如何操纵DOM。

    <ul>
      <li 
        v-for='product in products'
        :key='product._id'  
      >
        {{ product.name }}
      </li>
    </ul>
    

      

    2. 在一定范围内使用v-for循环

    虽然大多数时候v-for用于循环数组或对象,但也有我们只想迭代特定次数的情况。

    例如,假设我们正在为在线商店创建分页系统,并且我们只想每页显示10个产品。使用变量来跟踪当前页码,就可以像这样处理分页。

    <ul>
      <li v-for='index in 10' :key='index'>
        {{ products[page * 10 + index] }}
      </li>
    </ul>
    

      

    3. 避免在循环中使用v-if

    一个超常见的错误是使用v-if来过滤v-for循环的数据。

    虽然看上去直观了,但这会导致一个巨大的性能问题——VueJS将优先v-forv-if指令。

    这意味着组件将遍历每个元素,然后再检查v-if条件以查看是否应该呈现。

    如果你将v-ifv-for一起使用,无论条件是什么,都将遍历数组的每一项。

    // 不好的做法!
    <ul>
      <li 
        v-for='product in products' 
        :key='product._id' 
        v-if='product.onSale'
      >
        {{ product.name }}
      </li>
    </ul>
    

      

    那么问题是什么?

    假设products数组有数千个项,但想要渲染的只有3个在售产品。

    每次重新渲染时,即使出售的3种产品根本没有改变,Vue也必须遍历这数千个项。

    必须尽量避免结合使用v-ifv-for的情况。(注:if和for已经在vue3得到了支持,v-if优先级高于v-for了,可以一起使用。)

    接下来介绍两个替代方法。

    4. 使用computed属性或方法

    为了避免上述问题,我们应该在模板中进行迭代之前过滤数据。有两种非常相似的方法可以做到:

    • 使用computed属性
    • 使用过滤方法

    随你选择,下面让我们快速介绍这两个方法。

    首先,我们只需要设置一个computed属性。为了获得与之前的v-if相同的功能,代码看起来像这样。

    <template>
      <ul>
        <li v-for="products in productsOnSale" :key="product._id">
          {{ product.name }}
        </li>
      </ul>
    </template>
    
    <script>
      export default {
        data () {
          return {
            products: []
          }
        },
        computed: {
          productsOnSale: function () {
            return this.products.filter(product => product.onSale)
          }
        }
      }
    </script>
    

      

    这样的好处是:

    1. 数据属性只会在依赖项发生变化时重新评估
    2. 模板只遍历在售的产品,而不是每一个产品

    使用过滤方法的代码几乎相同,但使用方法会改变访问模板内值的方式。但是,如果我们希望能够将变量传递给过滤过程,那么就应该选择方法这条路。

    <template>
      <ul>
        <li v-for="products in productsOnSale(50))" :key="product._id">
          {{ product.name }}
        </li>
      </ul>
    </template>
    
    <script>
      export default {
       data () {
        return {
         products: []
        }
       },
       methods: {
        productsOnSale (maxPrice) {
         return this.products.filter(product => product.onSale && product.price < maxPrice)
        }
       }
      }
    </script>
    

      

    5. 或者在循环外包一层元素

    在决定是否完全渲染列表时,你可能还是想要将v-forv-if结合起来。

    例如,如果我们只想在用户登录时呈现产品列表怎么办。

    错误代码:

    <ul>
      <li 
        v-for='product in products' 
        :key='product._id' 
        v-if='isLoggedIn' <!-- HERE -->
      >
        {{ product.name }}
      </li>
    </ul>
    

      

    这有什么问题?

    和之前一样。Vue模板会优先考虑v-for——所以会遍历每个元素并检查v-if

    即使最后什么都不渲染,也会循环数千个元素。

    对于此示例,有一个简单的解决方案是移动v-if语句。

    更好的代码!

    <ul v-if='isLoggedIn'> <!-- Much better -->
      <li 
        v-for='product in products' 
        :key='product._id' 
      >
        {{ product.name }}
      </li>
    </ul>
    

      

    这要好得多,因为如果isLoggedInfalse——那就根本不需要迭代。

    6. 访问循环中的索引

    除了遍历数组并访问每个元素之外,我们还可以跟踪每个项目的索引。

    为此,我们需要在项目之后添加一个索引值。这样做超级简单,但对于分页、显示列表索引、显示排名等都很有用。

    <ul>
      <li v-for='(products, index) in products' :key='product._id' >
        Product #{{ index }}: {{ product.name }}
      </li>
    </ul>
    

      

    7. 迭代对象

    到目前为止,我们只研究了使用v-for来遍历数组。但是我们也可以很轻松地学会迭代对象的键值对。

    与访问元素的索引类似,我们需要向循环中添加另一个值。如果我们使用单个参数循环对象,我们将循环所有项。

    如果我们添加另一个参数,则将获得项和键。如果我们添加第三个参数,则还可以访问v-for循环的索引。

    假设我们想遍历产品中的每个属性。那么代码如下:

    <ul>
      <li v-for='(products, index) in products' :key='product._id' >
        <span v-for='(item, key, index) in product' :key='key'>
          {{ item }}
        </span>
      </li>
    </ul>
    

      

    代码改变了我们,也改变了世界
  • 相关阅读:
    软件工程阅读笔记02
    软件工程阅读笔记01
    四则运算二
    第十七周学习进度条
    个人总结以及建议
    写api接口神器--带你5分钟了解swagger
    nginx的配置和基本参数说明
    larval 使用redis做缓存
    Laravel——缓存使用
    开启redis-server提示 # Creating Server TCP listening socket *:6379: bind: Address already in use--解决方法
  • 原文地址:https://www.cnblogs.com/wencaiguagua/p/15717994.html
Copyright © 2020-2023  润新知