[基础]v-for列表循环详细讲解-2

  • v-for循环数字
  • v-for中如何使用判断
  • template 标签的使用

v-for循环数字

v-for是可以用来循环数字的,比如你要循环1-99的数字,可以直接写成下面的样子。

<span v-for="count in 99">{{count}},</span>

这样就可以快速的循环出1-99的值在页面上。可以在浏览器中看一下这个效果。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <script src="https://unpkg.com/vue@next" ></script>
</head>
<body>
    <div id="app"></div>
</body>
<script>
const app=Vue.createApp({ 
    data(){
        return{
        }
    },
    methods:{
    },
    template:`<span v-for="count in 12">{{count}}<br /></span>`
}) 
const vm=app.mount("#app")
</script>
</html>

18 v-for中使用v-if结合template标签的使用_Vue

v-for中如何使用判断

你看一下,上篇文章写的关于数组循环的小例子,现在的新需求有些变化,由于公司不想招初级前端工程师了,我们想刨除出去,只显示中级和高级。这时候你很可能把代码写成这个样子。

<ul>
    <li 
        v-for="(item,index) in listArray"
        :key="index+item"
        v-if="item != '初级'"
    >
        [{{index}}]{{item}}
    </li>
</ul>

在浏览器中进行预览,你会发现初级的循环项,并没有消失。

这是为什么呢?
因为v-for循环的优先级要高于v-if判断的优先级,所以判断失效。

正确的写法应该是在<li>外层独立出一个标签,在<li>上做循环。
比如写成下面的代码。

template:`<ul>
            <div v-for="(item,index) in listArray" :key="index+item">
                <li v-if="item != '初级'">
                    [{{index}}]{{item}}
                </li>
            </div>
        </ul>`

18 v-for中使用v-if结合template标签的使用_php_02

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <script src="https://unpkg.com/vue@next" ></script>
</head>
<body>
    <div id="app"></div>
</body>
<script>
const app=Vue.createApp({ 
    data(){
        return{
            listArray:['初级','中级','高级']
        }
    },
    methods:{
    },
    template:`<ul>
                <div v-for="(item,index) in listArray" :key="index+item">
                    <li v-if="item != '初级'">
                        [{{index}}]{{item}}
                    </li>
                </div>
            </ul>`
}) 
const vm=app.mount("#app")
</script>
</html>

这时候到浏览器中预览,初级项如愿以偿的消失了。

template 标签的使用

上面的结果完美吗?
当你打开浏览器的控制台,看Elements选项卡时,你会发现DOM结构是有问题的,明明循环出两项,却有3个<div>,而且这种外层套用<div>里边使用<li>的形式,不符合HTML语法的基本结构。

18 v-for中使用v-if结合template标签的使用_Vue_03


为了解决这个问题,Vue给我们提供了<template>模版标签,也就是一个空的占位符,目的就是解决模板中为完成业务逻辑,而使用的无用html标签的现象。

现在可以把上面的代码写成这样。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <script src="https://unpkg.com/vue@next" ></script>
</head>
<body>
    <div id="app"></div>
</body>
<script>
const app=Vue.createApp({ 
    data(){
        return{
            listArray:['初级','中级','高级']
        }
    },
    methods:{
    },
    template:`<ul>
                <template v-for="(item,index) in listArray" :key="index+item">
                <li v-if="item != '初级'">
                    [{{index}}]{{item}}
                </li>
                </template>
            </ul>`
}) 
const vm=app.mount("#app")
</script>
</html>

18 v-for中使用v-if结合template标签的使用_Vue_04


这时候再到浏览器看一下结果,这样就符合我们的期待的样子了。

<ul>
    <!--v-if-->
    <li>...</li>
    <li>...</li>
</ul>

到这也基本讲完了vue3中对于列表循环的基本操作和一些小坑,希望对大家有帮助。

为了方便大家学习,附上本文所有代码:

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <script src="https://unpkg.com/vue@next"></script>
</head>

<body>
    <div id="app"></div>
</body>
<script>
const app = Vue.createApp({
    data() { 
        return { 
            listArray: [
                '初级', 
                '中级', 
                '高级'
            ],
            listObject:{ 
                DogOne:'黑背', 
                DogTwo:'泰迪', 
                DogThree:'金毛' 
            }
        } 
    },
    methods:{
        handleChangeBtnClick(){
            this.listArray.push('willem')
        },
    },
    template: `
        <ul>
            <template v-for="(item,index) in listArray" :key="index+item">
                    <li v-if="item != '初级'">
                        [{{index}}]{{item}}
                    </li>
            </template>
        </ul>

        <button @click="handleChangeBtnClick">点我改变</button>

        <ul>
            <li v-for="(value,key,index) in listObject" :key="key">
                [{{index}}]{{value}}-{{key}}
            </li>
        </ul>

        <span v-for="count in 99">{{count}},</span>
        `
})
const vm = app.mount("#app")
</script>
</html>

18 v-for中使用v-if结合template标签的使用_Vue_05