vue之v-if和v-show

摘要:
V-ifv-if主要用于条件渲染。DOCTYPEHtml˃vuemessageinfor˃vardemo1=newVuev-if如所示,当值为true时,将呈现页面;如果值为false,则不会呈现页面。V-else和V-else if我们可以使用V-else指令来表示V-if的“else块”。v-else元素必须跟在v-if或v-else if元素之后,否则将无法识别它。v-else-if是一个“else if块”,它充当v-if,可以在一个链中多次使用。V-if和V-showv-show也是根据条件显示元素的指令。带有v-show的元素始终呈现并保留在DOM中。V-show只是切换元素的CSS属性显示。

v-if

v-if主要用来进行条件渲染。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>vue</title>
    <script src="./vue.js"></script>
</head>
<body>
    <div id="demo">
        <p v-if="message">message</p>
        <p v-if="infor">infor</p>
    </div>
    <script>
        vardemo1 = newVue({
            el:'#demo',
            data:{
                message:true,
                infor:false
            },
        })
    </script>    
</body>
</html>

vue之v-if和v-show第1张

v-if的简单用法如上面所示,当值为true时进行渲染,当值为false时,页面中不会进行渲染。

v-else和v-else-if

我们可以使用v-else指令来表示v-if的“else 块”,v-else元素必须紧跟在v-if或者v-else-if元素的后面——否则它将不会被识别。而v-else-if则是充当v-if的“else-if 块”,可以链式地使用多次。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>vue</title>
    <script src="./vue.js"></script>
</head>
<body>
    <div id="demo">
        <p v-if="message">hello</p>
        <button @click="A">点我</button>
        <div v-if="type === 1">A</div>
        <div v-else-if="type === 2">B</div>
        <div v-else-if="type === 3">C</div>
        <div v-else>D</div>
        <button @click="B">点我</button>
    </div>
    <script>
        vardemo1 = newVue({
            el:'#demo',
            data:{
                message:true,
                type:0
            },
            methods:{
                A:function(){
                    this.message=false
                },
                B(){
                    if(this.type > 6){
                        this.type = 1;
                    }else{
                        this.type++;
                    }
                },
            }
        })
    </script>        
</body>
</html>

vue之v-if和v-show第2张

在上面的例子中,通过点击事件改变了type的值,从而改变了页面元素的渲染。

key管理可复用的元素

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>vue</title>
    <script src="./vue.js"></script>
</head>
<body>
    <div id="demo">
        <span v-if="loginType === 'username'">
         <label>Username</label>
         <input placeholder="Enter your username" >
     </span>
     <span v-else>
         <label>Email</label>
         <input placeholder="Enter your email address" >
     </span>
     <button v-on:click="test">切换</button>
    </div>
    <script>
        vardemo1 = newVue({
            el:'#demo',
            data:{
                loginType: 'username'
            },
            methods:{
                test:function(){
                    if(this.loginType != 'username'){
                        return this.loginType = 'username'
                    }
                    return this.loginType = 'email'
                }
            }
        })
    </script>        
</body>
</html>

vue之v-if和v-show第3张vue之v-if和v-show第4张

在上面的例子中,首先显示的是用户名输入框,点击切换后显示的邮箱输入框,一切都很正常。但是当我们在用户名输入框中输入相应内容后再点击切换,会发现我们刚刚输入的用户名出现在了邮箱处:

vue之v-if和v-show第5张vue之v-if和v-show第6张

之所以会出现这种情况,是因为Vue 会尽可能高效地渲染元素,通常会复用已有元素而不是从头开始渲染。这么做,除了使 Vue 变得非常快之外,还有一些有用的好处。所以,在上面的代码中切换loginType将不会清除用户已经输入的内容。因为两个模版使用了相同的元素,<input>不会被替换掉——仅仅是替换了它的placeholder

虽然这样能高效快速的渲染元素,但是又很多实际情况是不希望元素被复用的,要解决上面的问题,除了将元素再进行包裹外,Vue 还提供了一种方式来声明“这两个元素是完全独立的——不要复用它们”。只需添加一个具有唯一值的key属性即可:

<div id="demo">
        <span v-if="loginType === 'username'">
         <label>Username</label>
         <input placeholder="Enter your username"key="username-input">
     </span>
     <span v-else>
         <label>Email</label>
         <input placeholder="Enter your email address"key="email-input">
     </span>
     <button v-on:click="test">切换</button>
    </div>

vue之v-if和v-show第7张vue之v-if和v-show第8张

这样就可以按照实际运用情况来处理不希望被复用的元素了,需要注意的时,在这里<label>元素仍然会被高效地复用,因为它们没有添加key属性。

v-if和v-show

v-show也是根据条件展示元素的指令。带有v-show的元素始终会被渲染并保留在 DOM 中。v-show是简单地切换元素的 CSS 属性display

例如在上面的第一个例子中,页面中渲染了一个p元素,页面结构如下:

vue之v-if和v-show第9张

可是当我们将v-if换成v-show时,页面上依旧只显示了一个p元素,但页面结构却不一样了。

<body>
    <div id="demo">
        <p v-show="message">message</p>
        <p v-show="infor">infor</p>
    </div>
    <script>
        vardemo1 = newVue({
            el:'#demo',
            data:{
                message:true,
                infor:false
            },
        })
    </script>    
</body>

vue之v-if和v-show第10张vue之v-if和v-show第11张

也就说,虽然第二个p元素没有显示出来,但是页面渲染时是存在的,只是多了一个隐藏属性。

通过上面的例子,我们不难发现两者的不同:

  • v-if是真正的条件渲染,因为它会确保在切换过程中条件块内的事件监听器和子组件适当地被销毁和重建。
  • v-if是惰性的,只有当条件为true时才会渲染,如果条件为false则什么都不做
  • v-if有很高的切换开销,适用于条件不太容易改变的时候
  • v-show不管条件是true还是false都会进行渲染。并且只是简单地基于 CSS 进行切换
  • v-show有很高的初始渲染开销,适用于非常频繁地切换

免责声明:文章转载自《vue之v-if和v-show》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇virtio 驱动的数据结构理解C# 解决串口接收数据不完整下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

《Vue项目的创建以及初始化(两种方法)》

  Vue项目创建初始化两种方法,一是命令创建,二是在它的ui图形界面去创建(我一般用ui,主要懒得打那么多命令)~   创建的时候一定要确保node是否安装,npm一般都会自带的,检查它们版本的命令就是:node -V 以及 npm -V ,如果要更新npm的版本就可以输入npm install -g npm   先说命令创建初始化:     首先安装v...

在vue项目中stylus的安装及使用

Stylus是一个CSS预处理器。 Stylus安装包安装: dell@DESKTOP-KD0EJ4H MINGW64 /f/gsff-frone $ cnpm install stylus --save-dev √ Installed 1 packages √ Linked 14 latest versions √ Run 0 scripts...

【Vue】10 Vue-Cli 项目创建

简单的Demo案例并不需要Vue-Cli,因为一个页面之内可以总揽 但是真实的项目开发,考虑代码结构,目录结构,部署,热部署,单元测试... 代码量呈几何倍数增长,而且缺少轮子就写起来很痛苦 所以必须安装Vue-Cli来开发: Cli翻译为命令行界面,又被称为脚手架 比框架更加半成品的东西: 安装vue-cli最新版: npm install -g @vu...

vue中 根据音频 获取音频的时长

    <template> <audio ref="audioUrlRefText" :src="fileUrl"/> </template>   方法中:   clientGetRadioTime () { let audio = this.$refs.audioUrlRefText...

nginx代理访问vue打包dist碰到的问题

一开始vue项目npm run build打包成dist放在nginx的html目录下面  C:Program FilesJava ginx-1.12.2conf此时我的文件路径是有空格的,Program Files这两个单词之间有空格。  nginx.conf配置文件里面有空格,格式可能比较严格,我一直报404的错误 后来直接把项目文件下的路径复制上...

VUE内使用RSA加解密

说明:为防止私钥泄漏,由服务端生成两对密钥,分别是(前端公钥+私钥,后端公钥加私钥),采用加解密模式为:前端使用后台公钥加密,使用前端私钥解密;后端使用前端公钥加密,使用后端私钥解密。前后端统一使用公钥加密,私钥解密 一、现在vue项目中安装依赖包jsencrypt   npm install jsencrypt --save-dev 二、在项目中新建js...