如何在Vue中使用v-if、v-show、v-else和v-else-if进行条件渲染/显示

344 阅读3分钟

简介

Vue.js是一个简单的Web应用框架,用于创建动态Web界面和单页应用(SPA)。当我们创建这些应用程序时,经常会想根据一个特定的标准来渲染一些东西--这就是条件渲染的本质。

条件性渲染是指根据一个条件是否为真来渲染不同的用户界面(UI)标记的能力。这个概念经常被用于显示或隐藏组件(切换)、切换应用功能、处理认证和授权等情况。

在这篇文章中,我们将通过使用v-if,v-else-if, 和v-else 指令来了解Vue.js中条件性渲染的各种方式。我们还将看看一些例子,并强调v-ifv-show 之间的区别。

v-if

v-if 指令用于有条件地渲染一个块,这意味着只有当指令的表达式返回一个true 的值时,才会产生带有v-if 属性的块。如果表达式产生一个无效的结果(例如:null,0, empty string,false ),该元素将从DOM中删除

让我们在实际例子上说明这个行为。

<div v-if="login">
    <p>This user has been logged in!... Welcome.</p>
</div>

<script>
export default {
    data() {
        return {
            login: true,
        };
    }
};
</script>

由于login 被设置为true ,包含v-if 指令的<div> 块将被产生,从而被显示。

v-ifvsv-show

值得注意的是,在上面的例子中,v-show 也会起作用,而且功能似乎是相同的,但这两者之间是有区别的。

v-if 有条件地渲染一个元素,而v-show 有条件地显示/显示一个元素。

这意味着,当条件被切换时,v-if 将实际删除和恢复组件,而v-show 只是使它们不可见或可见。下面的动画说明了v-if 是如何实际删除和再现代码块的。

同时,v-show 将始终保持DOM中的元素,只是改变其CSS以切换其外观(通过将其display 设置为none )。

v-else

v-else 指令是一个v-if 指令,允许你在条件渲染中自定义false 值。如果它不是true ,你可以用v-else 来定义应该发生什么来代替。

例如,假设我们有一个密码输入,如果输入的长度小于6,我们希望它产生一个错误信息*"弱密码",如果长度大于6,则显示"强密码"*。

这是一个条件渲染,有一个处理假情况的选项。

<form>
    <input type="password" v-model="password" placeholder="Enter your password" />
    <p v-if="password.length > 6">Strong Password</p>
    <p v-else>Weak Password</p>
</form>

<script>
export default {
    data() {
        return {
            password: ""
        };
    }
};
</script>

注意: v-if/v-else 就像JavaScript中的正则表达式ifif...else

让我们利用这一点来切换一个简单的登录页面的内容,使其根据用户是否登录而改变信息。我们也将根据userLoggedIn 状态来修改按钮的措辞。

<div id="app">
    <div v-if="userLoggedIn">
        <h2>Hello Welcome!</h2>
        <p>You have sucessfully logged in to your user account!</p>
    </div>
    <div v-else>
        <p>Please Log In to access your account!</p>
    </div>
    <button @click="userLoggedIn = !userLoggedIn">
        <p v-if="!userLoggedIn">Login</p>
        <p v-else>LogOut</p>
    </button>
</div>
    
<script>
export default {
    data() {
        return {
            userLoggedIn: false
        };
    }
};
</script>

该按钮的点击事件将切换userLoggedIn 数据项,这将影响显示的数据,如下图所示。

v-else-if

v-else-if extends a v-if 用一个 块。这与JavaScript的 块类似,它允许我们在现有的 中添加一个if语句。当有许多标准需要检查时,可以使用这种方法,并且可以多次链起来。else...if else...if v-if

<form>
    <input type="password" v-model="password" placeholder="Enter your password" />
    <p v-if="password.length < 4">Weak Password</p>
    <p v-else-if="password.length < 7">Fairly Strong Password</p>
    <p v-else>Strong Password</p>
</form>

<script>
export default {
    data() {
        return {
            password: ""
        };
    }
};
</script>

**注意:**当v-ifv-for 都被用于同一个元素时,v-if 会先被评估。这只是意味着不建议在同一个元素上使用v-ifv-for ,因为有隐含的优先权。

总结

在这篇文章中,我们已经看到了如何用v-if,v-else, 和v-else-if 来有条件地渲染一个元素。我们还解释了v-ifv-show 之间的区别。