条件渲染

先看个小例子

    <!-- 条件渲染某一块内容 -->
    <div id="vm1">
        <h1 v-if="awesome">Vue is awesome!</h1>
        <button v-on:click="reverse">反转</button>
    </div>

来点Vue代码

    <script type="text/javascript">
        var vm1 = new Vue({
            el: '#vm1',
            data:{
                awesome:true
            },
            methods:{
                reverse:function(){
                    this.awesome = !this.awesome;
                }
            }
        })
  </script>

效果应该也能猜到,点一下,玩一年,呸!点一下这个标题就没了。


点一下,玩一年

懒得去控制台敲代码

有了if,没有else肯定对不起大家(当然else-if也是有的,我懒)

    <!-- if-else结构 -->
    <div id="vm2">
        <h1 v-if="awesome">Vue is awesome!</h1>
        <h1 v-else>Oh no 😢</h1>
        <button v-on:click="reverse">反转</button>
    </div>
<script type="text/javascript">
        var vm2 = new Vue({
            el: '#vm2',
            data:{
                awesome:true
            },
            methods:{
                reverse:function(){
                    this.awesome = !this.awesome;
                }
            }
        })
</script>

反复横跳:


献给喜爱Vue的你

和开始秃头的我

如果想切换多个元素,可以用<template>把它们包起来,官网的示例是这样式的(我做了一点魔改):

    <!-- 天生不可见呢 -->
    <template id="vm3" v-if="ok">
      <h1>Title</h1>
      <p>Paragraph 1</p>
      <p>Paragraph 2</p>
    </template>
    
    <script type="text/javascript">
        var vm3 = new Vue({
            el: '#vm3',
            data: {
                ok: true
            }
        })
    </script>

如果你觉得这个东西能出来结果,那你就错了!事实上<template>标记是Html5新加的元素(原谅我以为它是自定义的),默认display:none;看来还得再想一想。

实际上可以这么用:

    <!-- 以下两种写法在Vue引擎中会报警告,不推荐,只为了展示效果 -->
    <template id="vm4">
        <div v-if="ok">
          Now you see me
        </div>
        <div v-else>
          Now you don't
        </div>
    </template>
    <script type="text/javascript">
        var vm4 = new Vue({
            el: '#vm4',
            computed: {
                ok: function(){
                    return Math.random() > 0.5;
                }
            }
        })
    </script>

在此例子中,ok是一个计算属性,在template下属的div中,所以,显示什么,就得看运气了。


第一把

第。。。把

所以不要尝试让template显示出来。

然后是一个和v-if类似的指令v-show

    <div id="vm5">
        <h1 v-show="ok">Hello!</h1>
        <button v-on:click="reverse">反转</button>
    </div>
    <script type="text/javascript">
        var vm5 = new Vue({
            el: '#vm5',
            data: {
                ok: true
            },
            methods: {
                reverse: function(){
                    this.ok = ! this.ok;
                }
            }
        })
    </script>

效果嘛,很简单。


你好

同样的地方,不一样的你

它们两个的区别,就在于v-if很聪明,如果条件为假,这个元素真的是不渲染的,而v-show很实诚,不论条件真假,元素都给你摆在页面上(为啥没有?F12自己看),然后把display改成none。也就是说,如果这个元素需要频繁切换的话,v-show只会渲染一次,效率较高,如果这个元素切换不频繁的话,v-if比较合适,毕竟元素多的话,渲染速度即成败。。。
最后是一点“原理”的问题。

    <template v-if="loginType === 'username'">
      <label>Username</label>
      <input placeholder="Enter your username">
    </template>
    <template v-else>
      <label>Email</label>
      <input placeholder="Enter your email address">
    </template>

像上面的代码,切换的时候,label和input元素是不会重复渲染的,唯一改变的是input的placeholder属性,所谓换汤不换药。
如果你想让他们加个班,不妨这么做。

    <!-- 加了key的元素不复用 -->
    <template v-if="loginType === 'username'">
      <label>Username</label>
      <input placeholder="Enter your username" key="username-input">
    </template>
    <template v-else>
      <label>Email</label>
      <input placeholder="Enter your email address" key="email-input">
    </template>

加了key标识之后(类似于原生中的id),真的是什么就是什么了,不过label还是照常,因为没加key。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。