【Vue3从零开始-第二章】2-7 列表循环渲染详解

简介: 【Vue3从零开始-第二章】2-7 列表循环渲染详解

]UWOD(KIB9LJS9~S[T{QHM9.png


前言


上一篇文章中,详细讲过了vue的条件渲染,今天我们继续深入了解一下vue的列表循环渲染。大家在之前的例子中也有用过,下面我们就详细的讲解一下。


回顾


<script>
    const app = Vue.createApp({
        data(){
            return {
                listArray: ['dell', 'lee', 'teacher']
            }
        },
        template: `
            <div>
                <div v-for="item in listArray">
                    {{item}}
                </div>    
            </div>
        `
    });
    const vm = app.mount('#root');
</script>
复制代码


CIE6412X]L_CSD8_LU@TF{I.png


在第一章的文章中,我们写过一个todoList的例子,知道了v-for指令可以在vue模板中做循环操作,在循环过程中,我们获取到listArray之后,将listArray中的每一项都赋给item,然后将item渲染出来,就可以在浏览器中看到循环之后的内容了。


template: `
    <div>
        <div v-for="(item, index) in listArray">
            {{item}} - {{index}}
        </div>    
    </div>
`
复制代码


{8}XBX[VKR7H1JCEE5{N`9O.png


在之前的内容中,我们还知道可以在循环的时候加上index作为数组循环的下标,下标是从 0 开始的,然后将index也在模板上输出出来,就可以在页面上看到item对应的下标了。


对象循环


之前我们看到的例子只是循环数组,那如果想要获取到对象中的每一项该怎么循环输出呢?


<script>
    const app = Vue.createApp({
        data(){
            return {
                listObject: {
                    firstName: 'dell',
                    lastName: 'lee',
                    job: 'teacher'
                }
            }
        },
        template: `
            <div>
                <div v-for="(value, key, index) in listObject">
                    {{value}} - {{key}} - {{index}}
                </div>    
            </div>
        `
    });
    const vm = app.mount('#root');
</script>
复制代码


KFXDY~WY]TE]4O23G$BT437.png


template中可以看到,循环的是对象时,可以指定返回三个值:valuekeyindex,顺序可不能乱哦。当然也可以直接输出value的,后面的两个值非必填项哦~


优化循环性能 - key


<script>
    const app = Vue.createApp({
        data(){
            return {
                listArray: ['dell', 'lee', 'teacher']
            }
        },
        methods: {
            handleAddBtnClick(){
                this.listArray.push('hello')
            }
        },
        template: `
            <div>
                <div v-for="(item, index) in listArray">
                    {{item}} - {{index}}
                </div>    
                <button v-on:click='handleAddBtnClick'>添加</button>
            </div>
        `
    });
    const vm = app.mount('#root');
</script>
复制代码


QQVM4HSM}UZYDHNJJXK2TEC.png


  • 当我们点击添加按钮时,会在数组后面添加一个数据,然后将页面重新渲染,但是重新渲染整个页面对于浏览器来说是比较浪费性能的,因为每次都要将已经渲染过的数据再渲染一遍。


这时候,我们就可以给循环上添加key作为唯一值,让循环渲染出来的数据都可以通过这个key来判断是否需要重新渲染。


template: `
    <div>
        <div v-for="(item, index) in listArray" :key="index">
            {{item}} - {{index}}
        </div>    
        <button v-on:click='handleAddBtnClick'>添加</button>
    </div>
`
复制代码


  • 此时看到的效果其实和没有加key看上去是一样的,但是当数据量大了之后,vue底层代码会通过判断key,然后看看之前有没有渲染过这个DOM元素,如果已经有了,就可以复用,不需要重新渲染了。


  • 在做循环的时候,一定要在循环的DOM元素上加上key,且这个key的值必须是唯一的。上面的例子中我们使用的是index作为key的值,但是这也有个弊端,如果插入值是在中间或者数组


  • 前面添加的话,那么循环的时候还是会重新渲染所有的DOM元素。


  • 在实际项目开发过程中,最好能使用后台返回的数据id作为唯一值,或者自己确定一个不会改变的唯一值作为key


数组变更函数


在上面的例子中,我们用到了push函数,在对数组操作的时候,还有popunshiftshiftsplicesortreverse等等原生js中操作数组的函数。


handleAddBtnClick(){
    this.listArray.reverse()
}
复制代码


32X$BJH5N))23U$L2H4{89H.png


  • 上面就是以reverse函数作为例子去操作data中的数组,可以看到点击按钮的时候会直接修改数组,修改后也会重新渲染到页面上。


  • 还有更多的函数,大家可以都去试一试。


替换数组


<script>
    const app = Vue.createApp({
        data(){
            return {
                listArray: ['dell', 'lee', 'teacher']
            }
        },
        methods: {
            handleAddBtnClick(){
                this.listArray = ['see', 'you']
            }
        },
        template: `
            <div>
                <div v-for="(item, index) in listArray" v-bind:key="index">
                    {{item}} - {{index}}
                </div>    
                <button v-on:click='handleAddBtnClick'>变更</button>
            </div>
        `
    });
    const vm = app.mount('#root');
</script>
复制代码


IRQOONK[YQ3EZO7OM25ZATX.png


之前的内容中,我们对数组进行过直接修改替换数据值,在数组也是适用这个规则的。


  • 直接将listArray数组赋新的值,即可变成一个新的数组然后重新渲染到页面上。


除了直接赋值之外,还可以用concat函数或者filter过滤掉数组内容等方式获得新的数组并重新渲染。


handleAddBtnClick(){
    this.listArray = ['see', 'you'].filter(item => item === 'you');
}
复制代码


UV_%FQ$APN2Y[8H[U8B95%T.png


除了更新整个数组之外,还可以根据下标去更新数组中的某一个内容。


handleAddBtnClick(){
    this.listArray[1] = 'Hello'
}
复制代码


M[DNOQY$H(CWQ3_`8O[`ARR.png


循环判断


在循环的时候,我们经常会对一些值进行过滤,这时候就要将之前学到的v-if指令和v-for进行结合使用了。


按照一般思维,我们会把v-if指令写在和v-for同一个DOM元素上。


template: `
    <div>
        <div v-for="(item, index) in listArray" v-bind:key="index" v-if="item !== 'lee'">
            {{item}} - {{index}}
        </div>
    </div>
`
复制代码


XQV4IO`(F)W983}8[}30UKC.png


但是打开浏览器之后会发现好像并没有起作用,这是因为当v-forv-if放在同一个DOM元素上时,v-if的层级会比较高,也就是会先执行v-if,之后再执行v-for


那此时可能会想,我们可以在v-for指令执行的DOM元素里面在加一层DOM元素去执行v-if指令。


template: `
    <div>
        <div v-for="(item, index) in listArray" v-bind:key="index">
            <div v-if="item !== 'lee'">
                {{item}} - {{index}}
            </div>
        </div>
    </div>
`
复制代码



R[4WD[R{ZR0P3D{85_TR`PI.png

这时候页面上已经渲染出我们想要的效果了,但是打开浏览器控制台会发现,里面的DOM元素层级好像有点多了,而且被隐藏的DOM元素外层也还有一个DOM元素包裹的。那么有没有一种写法可以只有一层DOM元素去循环判断呢?


  • 答案是有的。


template: `
   <div>
       <template v-for="(item, index) in listArray" v-bind:key="index">
           <div v-if="item !== 'lee'">
               {{item}} - {{index}}
           </div>
       </template>
   </div>
`
复制代码


)I)3]HUFYYFV9J)NKP_BCSF.png


  • 将原来的div改为template去做v-for的循环操作,会发现template元素也会像div一点作为一个DOM元素,但其实template只是一个占位符,并不会像div一样渲染到页面上。


总结


本章主要是把列表循环渲染详细的讲解了一遍,在文章中我们对数组的操作、变更、替换等都通过小例子试验了一遍,更多好玩的等着大家去发现哦~

看完这一章之后,大家可以回头去看看第一章中的todoList例子,可以将这两块代码进行一个融合操作,看看自己是否真的学会了。

相关文章
|
28天前
|
缓存 JavaScript UED
Vue3中v-model在处理自定义组件双向数据绑定时有哪些注意事项?
在使用`v-model`处理自定义组件双向数据绑定时,要仔细考虑各种因素,确保数据的准确传递和更新,同时提供良好的用户体验和代码可维护性。通过合理的设计和注意事项的遵循,能够更好地发挥`v-model`的优势,实现高效的双向数据绑定效果。
129 64
|
28天前
|
JavaScript 前端开发 API
Vue 3 中 v-model 与 Vue 2 中 v-model 的区别是什么?
总的来说,Vue 3 中的 `v-model` 在灵活性、与组合式 API 的结合、对自定义组件的支持等方面都有了明显的提升和改进,使其更适应现代前端开发的需求和趋势。但需要注意的是,在迁移过程中可能需要对一些代码进行调整和适配。
110 60
|
3天前
|
JavaScript API 数据处理
vue3使用pinia中的actions,需要调用接口的话
通过上述步骤,您可以在Vue 3中使用Pinia和actions来管理状态并调用API接口。Pinia的简洁设计使得状态管理和异步操作更加直观和易于维护。无论是安装配置、创建Store还是在组件中使用Store,都能轻松实现高效的状态管理和数据处理。
17 3
|
1月前
|
JavaScript 前端开发 算法
vue学习第7章(循环)
欢迎来到瑞雨溪的博客,一名热爱JavaScript和Vue的大一学生。本文介绍了Vue中的v-for指令,包括遍历数组和对象、使用key以及数组的响应式方法等内容,并附有综合练习实例。关注我,将持续更新更多优质文章!🎉🎉🎉
25 1
vue学习第7章(循环)
|
28天前
|
前端开发 JavaScript 测试技术
Vue3中v-model在处理自定义组件双向数据绑定时,如何避免循环引用?
Web 组件化是一种有效的开发方法,可以提高项目的质量、效率和可维护性。在实际项目中,要结合项目的具体情况,合理应用 Web 组件化的理念和技术,实现项目的成功实施和交付。通过不断地探索和实践,将 Web 组件化的优势充分发挥出来,为前端开发领域的发展做出贡献。
33 8
|
27天前
|
存储 JavaScript 数据管理
除了provide/inject,Vue3中还有哪些方式可以避免v-model的循环引用?
需要注意的是,在实际开发中,应根据具体的项目需求和组件结构来选择合适的方式来避免`v-model`的循环引用。同时,要综合考虑代码的可读性、可维护性和性能等因素,以确保系统的稳定和高效运行。
30 1
|
27天前
|
JavaScript
Vue3中使用provide/inject来避免v-model的循环引用
`provide`和`inject`是 Vue 3 中非常有用的特性,在处理一些复杂的组件间通信问题时,可以提供一种灵活的解决方案。通过合理使用它们,可以帮助我们更好地避免`v-model`的循环引用问题,提高代码的质量和可维护性。
38 1
|
28天前
|
JavaScript
在 Vue 3 中,如何使用 v-model 来处理自定义组件的双向数据绑定?
需要注意的是,在实际开发中,根据具体的业务需求和组件设计,可能需要对上述步骤进行适当的调整和优化,以确保双向数据绑定的正确性和稳定性。同时,深入理解 Vue 3 的响应式机制和组件通信原理,将有助于更好地运用 `v-model` 实现自定义组件的双向数据绑定。
|
1月前
|
JavaScript 索引
Vue 3.x 版本中双向数据绑定的底层实现有哪些变化
从Vue 2.x的`Object.defineProperty`到Vue 3.x的`Proxy`,实现了更高效的数据劫持与响应式处理。`Proxy`不仅能够代理整个对象,动态响应属性的增删,还优化了嵌套对象的处理和依赖追踪,减少了不必要的视图更新,提升了性能。同时,Vue 3.x对数组的响应式处理也更加灵活,简化了开发流程。
|
1月前
|
JavaScript 前端开发 API
从Vue 2到Vue 3的演进
从Vue 2到Vue 3的演进
40 0

热门文章

最新文章