列表渲染

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>

 

posted on 2020-07-30 21:36  lina2014  阅读(56)  评论(0编辑  收藏  举报

导航