Vue 条件渲染

v-if 、v-show 都能控制一个模板标签在页面上显示。

v-if 如果条件不为真是不会挂载到页面上。

v-show 如果条件不为真也会挂载到页面上,只不过不显示出来 display 为 none。

<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8">
        <script src="./vue.v2.6.10.dev.js"></script>
    </head>
    <body>
        <div id="app">
            <div v-if="show">{{message}}</div>
            <div v-show="show">{{message}}</div>
        </div>
        
        <script>
            var vm = new Vue({
                el: '#app',
                data: {
                    show: false,
                    message: "Hello World",
                },
                methods: {
                    
                }
            })
        </script>
    </body>
</html>

v-show 性能比较好,不需要频繁加载、删除。

v-if 、 v-else
需要连在一起写,否则会出错。

<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8">
        <script src="./vue.v2.6.10.dev.js"></script>
    </head>
    <body>
        <div id="app">
            <div v-if="show">{{message}}</div>
            <div v-else>By World</div>
        </div>
        
        <script>
            var vm = new Vue({
                el: '#app',
                data: {
                    show: false,
                    message: "Hello World",
                },
                methods: {
                    
                }
            })
        </script>
    </body>
</html>

v-if
v-else-if
v-else

<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8">
        <script src="./vue.v2.6.10.dev.js"></script>
    </head>
    <body>
        <div id="app">
            <div v-if="show === 'a'">This is A.</div>
            <div v-else-if="show === 'b'">This is B.</div>
            <div v-else>This is others.</div>
        </div>
        
        <script>
            var vm = new Vue({
                el: '#app',
                data: {
                    show: "a",
                },
                methods: {
                    
                }
            })
        </script>
    </body>
</html>

key 值

<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8">
        <script src="./vue.v2.6.10.dev.js"></script>
    </head>
    <body>
        <div id="app">
            <div v-if="show">
                用户名:<input />
            </div>
            <div v-else>
                邮箱名:<input />
            </div>
        </div>
        
        <script>
            var vm = new Vue({
                el: '#app',
                data: {
                    show: false,
                },
                methods: {
                    
                }
            })
        </script>
    </body>
</html>

Vue默认会尝试复用内容,所以假如邮箱名的input有内容的时候,vm.show值变成 true,那么显示的用户名的input也会继承那个内容。
解决这个问题的方案就是加上key,加上key 后就不会复用了。

这是虚拟DOM的优化机制。

<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8">
        <script src="./vue.v2.6.10.dev.js"></script>
    </head>
    <body>
        <div id="app">
            <div v-if="show">
                用户名:<input key="username"/>
            </div>
            <div v-else>
                邮箱名:<input key="password"/>
            </div>
        </div>
        
        <script>
            var vm = new Vue({
                el: '#app',
                data: {
                    show: false,
                },
                methods: {
                    
                }
            })
        </script>
    </body>
</html>