• 列表渲染


    1.用v-for把一个数组对应为一组元素

    可以用v-for指令基于一个数组来渲染一个列表。v-for指令需要使用item in items形式的特殊语法,其中items是源数据数组,而item则是被迭代的数组元素的别名。

    <!DOCTYPE html>
    <html lang="en" xmlns:v-on="http://www.w3.org/1999/xhtml">
    <head>
        <meta charset="UTF-8">
        <title>学习example</title>
        <script src="../static/vue.js" type="text/javascript" charset="utf-8"></script>
    </head>
    <body>
    <div id="app">
        <ul>
            <li v-for="item in items">
                {{item.message}}
            </li>
        </ul>
    </div>
    
    <script type="text/javascript">
        var vm = new Vue({
            el: "#app",
            data: {
                items: [
                    {message: 'Foo'},
                    {message: 'Bar'},
                ]
            },
        });
    </script>
    <style type="text/css">
    </style>
    </body>
    </html>
    

     2.在v-for块中,可以访问所有父作用域的property。v-for还支持一个可选的第二个参数,即当前项的索引。

    <!DOCTYPE html>
    <html lang="en" xmlns:v-on="http://www.w3.org/1999/xhtml">
    <head>
        <meta charset="UTF-8">
        <title>学习example</title>
        <script src="../static/vue.js" type="text/javascript" charset="utf-8"></script>
    </head>
    <body>
    <div id="app">
        <ul>
            <li v-for="item,index in items">
                {{parentMessage}} {{index}} : {{item.message}}
            </li>
        </ul>
    </div>
    
    <script type="text/javascript">
        var vm = new Vue({
            el: "#app",
            data: {
                parentMessage: 'Parent',
                items: [
                    {message: 'Foo'},
                    {message: 'Bar'},
                ]
            },
        });
    </script>
    <style type="text/css">
    </style>
    </body>
    </html>
    

     3.在v-for里使用对象

    <!DOCTYPE html>
    <html lang="en" xmlns:v-on="http://www.w3.org/1999/xhtml">
    <head>
        <meta charset="UTF-8">
        <title>学习example</title>
        <script src="../static/vue.js" type="text/javascript" charset="utf-8"></script>
    </head>
    <body>
    <div id="app">
        <ul>
            <li v-for="value in object">
                {{value}}
            </li>
        </ul>
    </div>
    
    <script type="text/javascript">
        var vm = new Vue({
            el: "#app",
            data: {
                object: {
                    title: 'how to do lists in vue',
                    author: 'jane doe',
                    publishedAt: "2020-09-20",
                }
            },
        });
    </script>
    <style type="text/css">
    </style>
    </body>
    </html>
    

     4.提供第二个参数为property名称(也就是键名),第三个参数作为索引。

    <!DOCTYPE html>
    <html lang="en" xmlns:v-on="http://www.w3.org/1999/xhtml">
    <head>
        <meta charset="UTF-8">
        <title>学习example</title>
        <script src="../static/vue.js" type="text/javascript" charset="utf-8"></script>
    </head>
    <body>
    <div id="app">
        <ul>
            <li v-for="(value,name,index) in object">
                {{index}}   -    {{name}}    -    {{value}}
            </li>
        </ul>
    </div>
    
    <script type="text/javascript">
        var vm = new Vue({
            el: "#app",
            data: {
                object: {
                    title: 'how to do lists in vue',
                    author: 'jane doe',
                    publishedAt: "2020-09-20",
                }
            },
        });
    </script>
    <style type="text/css">
    </style>
    </body>
    </html>
    

     5.维护状态

    当Vue正在更新使用v-for渲染的元素列表时,它默认使用“就地更新”的策略。如果数据项的顺序被改变,Vue将不会移动DOM元素来匹配数据项的顺序,而是就地更新每个元素,并且确保它们在每个索引位置正确渲染。
    这个默认的模式是高效的,但是只适用于不依赖子组件状态或临时DOM状态的列表渲染输出。
    为了给Vue一个提示,以便它能跟踪每个节点的身份,从而重用和重新排序现有元素,你需要为每项提供一个唯一key attribute。
    建议尽可能在使用v-for时提供key attribute,除非遍历输出的DOM内容非常简单,或者是刻意依赖默认行为以获取性能上的提升。
    因为它是Vue识别节点的一个通用机制,key并不仅与v-for特别关联。

    <!DOCTYPE html>
    <html lang="en" xmlns:v-on="http://www.w3.org/1999/xhtml">
    <head>
        <meta charset="UTF-8">
        <title>学习example</title>
        <script src="../static/vue.js" type="text/javascript" charset="utf-8"></script>
    </head>
    <body>
    <div id="app">
        <ul>
            <li v-for="(value,name,index) in object" :key="index">
                {{index}} - {{name}} - {{value}}
            </li>
        </ul>
    
        <ul>
            <li v-for="item,index in items" :key="index">
                {{item.message}}
            </li>
        </ul>
    </div>
    
    <script type="text/javascript">
        var vm = new Vue({
            el: "#app",
            data: {
                object: {
                    title: 'how to do lists in vue',
                    author: 'jane doe',
                    publishedAt: "2020-09-20",
                },
                items: [
                    {message: 'Foo'},
                    {message: 'Bar'},
                ]
            },
        });
    </script>
    <style type="text/css">
    </style>
    </body>
    </html>
    

     6.数组检测更新

    (1).变更方法

    Vue将被侦听的数组的变更方法进行了包裹,所以它们也将会触发视图更新。这些被包裹过的方法包括:push()    pop()    shift()    unshift()    splice()    sort()    reverse()

    (2).替换数组

    变更方法,顾名思义,会变更调用了这些方法的原始数组。相比之下,也有非变更方法,例如 filter()concat() 和 slice()。它们不会变更原始数组,而总是返回一个新数组。当使用非变更方法时,可以用新数组替换旧数组

    <!DOCTYPE html>
    <html lang="en" xmlns:v-on="http://www.w3.org/1999/xhtml">
    <head>
        <meta charset="UTF-8">
        <title>学习example</title>
        <script src="../static/vue.js" type="text/javascript" charset="utf-8"></script>
    </head>
    <body>
    <div id="app">
        <ul>
            <li v-for="item,index in items" :key="index">
                {{item.message}}
            </li>
        </ul>
    </div>
    
    <script type="text/javascript">
        var vm = new Vue({
            el: "#app",
            data: {
                items: [
                    {message: 'Foo'},
                    {message: 'Bar'},
                ]
            },
        });
    
        vm.items = vm.items.filter(function (item) {
            return item.message.match(/Foo/);
        })
    </script>
    <style type="text/css">
    </style>
    </body>
    </html>
    

     7.显示过滤或排序后的结果

    想要显示一个数组经过过滤或排序后的版本,而不实际变更或重置原始数据。在这种情况下,可以创建一个计算属性,来返回过滤或排序后的数组。

    <!DOCTYPE html>
    <html lang="en" xmlns:v-on="http://www.w3.org/1999/xhtml">
    <head>
        <meta charset="UTF-8">
        <title>学习example</title>
        <script src="../static/vue.js" type="text/javascript" charset="utf-8"></script>
    </head>
    <body>
    <div id="app">
        <ul>
            <li v-for="n in evenNumbers">
                {{n}}
            </li>
        </ul>
    </div>
    
    <script type="text/javascript">
        var vm = new Vue({
            el: "#app",
            data: {
                numbers: [1, 2, 3, 4, 5]
            },
            computed: {
                evenNumbers: function fn() {
                    return this.numbers.filter(function (number) {
                        return number % 2 === 0;
                    })
                }
            }
            
        })
    </script>
    <style type="text/css">
    </style>
    </body>
    </html>
    

     在计算属性不适用的情况下 (例如,在嵌套 v-for 循环中) 你可以使用一个方法:

    <!DOCTYPE html>
    <html lang="en" xmlns:v-on="http://www.w3.org/1999/xhtml">
    <head>
        <meta charset="UTF-8">
        <title>学习example</title>
        <script src="../static/vue.js" type="text/javascript" charset="utf-8"></script>
    </head>
    <body>
    <div id="app">
        <ul v-for="set in sets">
            <li v-for="n in even(set)">
                {{n}}
            </li>
        </ul>
    </div>
    
    <script type="text/javascript">
        var vm = new Vue({
            el: "#app",
            data: {
                sets: [[1, 2, 3, 4, 5], [6, 7, 8, 9, 10]]
            },
            methods: {
                even: function (numbers) {
                    return numbers.filter(function (num) {
                        return num % 2 === 0;
                    })
                }
            }
    
        })
    </script>
    <style type="text/css">
    </style>
    </body>
    </html>
    
  • 相关阅读:
    [译]ECMAScript 6中的方法定义
    perlrequick中文版
    JavaScript:实例讲解使用ES6中默认参数和剩余参数时的注意事项
    [译]JavaScript引擎中的自动函数内联
    [译]Javascript:Harmony(ECMAScript规范)制定流程
    [译]通过学习其他语言来学习JavaScript
    [译]WebKit中的CSS预加载扫描器
    JavaScript:正则表达式的/y标识
    [译]CSS没有类
    [译]ES6:数组推导式和生成器推导式
  • 原文地址:https://www.cnblogs.com/xidian2014/p/13406481.html
Copyright © 2020-2023  润新知