Vue学习(5)条件渲染与列表渲染

条件渲染

v-if

v-if 指令用于条件性地渲染一块内容。这块内容只会在指令的表达式返回 true 值的时候被渲染。

<h1 v-if="awesome">Vue is awesome!</h1>

v-else

也可以用 v-else 添加一个“else 块”:

<h1 v-if="awesome">Vue is awesome!</h1>
<h1 v-else>Oh no </h1>

v-else-if

v-else-if,顾名思义,充当 v-if 的“else-if 块”,可以连续使用:

<div v-if="type === 'A'">
  A
</div>
<div v-else-if="type === 'B'">
  B
</div>
<div v-else-if="type === 'C'">
  C
</div>
<div v-else>
  Not A/B/C
</div>

v-show

另一个用于根据条件展示元素的选项是 v-show 指令。用法大致一样:

<h1 v-show="ok">Hello!</h1>

不同的是带有 v-show 的元素始终会被渲染并保留在 DOM 中。v-show 只是简单地切换元素的 CSS 的display属性。

v-if vs v-show

一般来说,v-if 有更高的切换开销,而 v-show 有更高的初始渲染开销。因此,如果需要非常频繁地切换,则使用 v-show 较好;如果在运行时条件很少改变,则使用 v-if 较好。

列表渲染

v-for 遍历数组

<div id="app">
    <h2>使用v-for遍历数组</h2>
    <ul>
        <li v-for="(person,index) in persons" :key="person.id">姓名:{{person.name}} 年龄:{{person.age}}
            <button @click="delPerson(index)">删除</button>
        </li>
    </ul>
</div>
<script src="../js/vue.js"></script>
<script>
    const vue = new Vue({
        el: '#app',
        data: {
            persons: [
                {id: 1, name: 'jason', age: 30},
                {id: 2, name: 'mike', age: 20},
                {id: 3, name: 'jay', age: 37},
                {id: 4, name: 'jolin', age: 28},
            ]
        },
        methods: {
            delPerson(index) {
                this.persons.splice(index, 1)
            }
        }
    })
</script>

v-for 遍历对象

<ul id="v-for-object" class="demo">
  <li v-for="value in object">
    {{ value }}
  </li>
</ul>
new Vue({
  el: '#v-for-object',
  data: {
    object: {
      title: 'How to do lists in Vue',
      author: 'Jane Doe',
      publishedAt: '2016-04-10'
    }
  }
})

结果:

DEMO

  • 演示

  • 代码

<div id="app">
    <input type="text" v-model="searchName">
    <ul>
        <li v-for="(person,index) in filterPersons" :key="person.id">姓名:{{person.name}} 年龄:{{person.age}}
        </li>
    </ul>
    <button @click="orderWay='asc'">按年龄升序</button>
    <button @click="orderWay='desc'">按年龄降序</button>
    <button @click="orderWay='original'">原本排序</button>
</div>
<script src="../js/vue.js"></script>
<script>
    const vue = new Vue({
        el: '#app',
        data: {
            persons: [
                {id: 1, name: 'jason', age: 30},
                {id: 2, name: 'mike', age: 20},
                {id: 3, name: 'jay', age: 37},
                {id: 4, name: 'jolin', age: 28},
            ],
            searchName: '',
            orderWay: 'original'
        },
        methods: {},
        computed: {
            filterPersons() {
                let arr =  this.persons.filter((p) => {
                    return p.name.indexOf(this.searchName) !== -1
                })

                return arr.sort((p1, p2) => {
                    if (this.orderWay == 'asc') {
                        return p1.age - p2.age
                    } else if (this.orderWay == 'desc') {
                        return p2.age - p1.age
                    }
                })
            }
        }
    })
</script>

发表评论

邮箱地址不会被公开。 必填项已用*标注