Vue v-if 指令

实例

如果条件为 true,则使用 v-if 指令创建 <div> 元素。

  1. <div v-if="createImgDiv">
  2. <img src="/img_apple.svg" alt="apple">
  3. <p>This is an apple.</p>
  4. </div>

定义与用法

v-if 指令用于有条件地呈现元素。

在元素上使用 v-if 时,后面必须跟一个表达式:

  • 如果表达式的计算结果为 true,则在 DOM 中创建元素及其所有内容。
  • 如果表达式的计算结果为 false,则元素将被销毁。

使用 v-if 切换元素时:

  • 当元素进入和离开 DOM 时,我们可以使用内置的 <Transition> 组件来设置动画。
  • 会触发生命周期钩子,如 'mounted' 和 'unmounted'。
注意:不建议在同一标签上使用 v-ifv-for。如果两个指令都用于同一个标记,那么 v-if 将无法访问 v-for 使用的变量,因为 v-if 的优先级高于 v-for

条件呈现指令

此概述描述了用于条件呈现的不同 Vue 指令是如何一起使用的。

指令详情
v-if可以单独使用,也可以与 v-else-if ,或 v-else 一起使用。如果 v-If 内部的条件为 true,则不考虑 v-else-If 或 v-else。
v-else-if必须在 v-if 或另一个 v-else-if 之后使用。如果 v-else-If 内部的条件为 true,则不考虑后面的 v-else-If 或 v-else。
v-else如果 if 语句的第一部分为 false,则会发生此部分必须放在 if 语句的最后,在 v-if 和 v-else-if 之后。

更多实例

实例 1

将带有数据属性的 v-ifv-else 一起用作条件表达式。

  1. <p v-if="typewritersInStock">
  2. in stock
  3. </p>
  4. <p v-else>
  5. not in stock
  6. </p>
实例 2

将带有比较检查的 v-ifv-else 一起用作条件表达式。

  1. <p v-if="typewriterCount > 0">
  2. in stock
  3. </p>
  4. <p v-else>
  5. not in stock
  6. </p>
实例 3

v-ifv-else-ifv-else 一起使用,根据存储中的打字机数量显示状态消息。

  1. <p v-if="typewriterCount>3">
  2. In stock
  3. </p>
  4. <p v-else-if="typewriterCount>0">
  5. Very few left!
  6. </p>
  7. <p v-else>
  8. Not in stock
  9. </p>
实例 4

v-if 与本地 JavaScript 方法一起用作条件表达式,并与 v-else 一起使用。

  1. <div id="app">
  2. <p v-if="text.includes('pizza')">The text includes the word 'pizza'</p>
  3. <p v-else>The word 'pizza' is not found in the text</p>
  4. </div>
  1. data() {
  2. return {
  3. text: 'I like taco, pizza, Thai beef salad, pho soup and tagine.'
  4. }
  5. }
实例 5

当从 API 接收到数据时,使用 v-if 来呈现 <div> 标记。

  1. <template>
  2. <h1>Example</h1>
  3. <p>Click the button to fetch data with an HTTP request.</p>
  4. <p>Each click generates an object with a random user from <a href="https://random-data-api.com/" target="_blank">https://random-data-api.com/</a>.</p>
  5. <p>The robot avatars are lovingly delivered by <a href="http://Robohash.org" target="_blank">RoboHash</a>.</p>
  6. <button @click="fetchData">Fetch data</button>
  7. <div v-if="data" id="dataDiv">
  8. <img :src="data.avatar" alt="avatar">
  9. <pre>{{ data.first_name + " " + data.last_name }}</pre>
  10. <p>"{{ data.employment.title }}"</p>
  11. </div>
  12. </template>
  13. <script>
  14. export default {
  15. data() {
  16. return {
  17. data: null,
  18. };
  19. },
  20. methods: {
  21. async fetchData() {
  22. const response = await fetch("https://random-data-api.com/api/v2/users");
  23. this.data = await response.json();
  24. },
  25. }
  26. };
  27. </script>
  28. <style>
  29. #dataDiv {
  30. width: 240px;
  31. background-color: aquamarine;
  32. border: solid black 1px;
  33. margin-top: 10px;
  34. padding: 10px;
  35. }
  36. #dataDiv > img {
  37. width: 100%;
  38. }
  39. pre {
  40. font-size: larger;
  41. font-weight: bold;
  42. }
  43. </style>
实例 6

使用 v-if 创建一个组件,以便触发 mounted 的生命周期钩子。

CompOne.vue:

  1. <template>
  2. <h2>Component</h2>
  3. <p>Right after this component is added to the DOM, the mounted() function is called and we can add code to that mounted() function. In this example, an alert popup box appears after this component is mounted.</p>
  4. <p><strong>Note:</strong> The reason that the alert is visible before the component is visible is because the alert is called before the browser gets to render the component to the screen.</p>
  5. </template>
  6. <script>
  7. export default {
  8. mounted() {
  9. alert("The component is mounted!");
  10. }
  11. }
  12. </script>

App.vue:

  1. <template>
  2. <h1>The 'mounted' Lifecycle Hook</h1>
  3. <button @click="this.activeComp = !this.activeComp">Create component</button>
  4. <div>
  5. <comp-one v-if="activeComp"></comp-one>
  6. </div>
  7. </template>
  8. <script>
  9. export default {
  10. data() {
  11. return {
  12. activeComp: false
  13. }
  14. }
  15. }
  16. </script>
  17. <style scoped>
  18. div {
  19. border: dashed black 1px;
  20. border-radius: 10px;
  21. padding: 20px;
  22. margin: 10px;
  23. width: 400px;
  24. background-color: lightgreen;
  25. }
  26. </style>
实例 7

使用 v-if 切换 <p> 元素,以便触发动画。

  1. <template>
  2. <h1>Add/Remove <p> Tag</h1>
  3. <button @click="this.exists = !this.exists">{{btnText}}</button><br>
  4. <Transition>
  5. <p v-if="exists">Hello World!</p>
  6. </Transition>
  7. </template>
  8. <script>
  9. export default {
  10. data() {
  11. return {
  12. exists: false
  13. }
  14. },
  15. computed: {
  16. btnText() {
  17. if(this.exists) {
  18. return 'Remove';
  19. }
  20. else {
  21. return 'Add';
  22. }
  23. }
  24. }
  25. }
  26. </script>
  27. <style scoped>
  28. .v-enter-from {
  29. opacity: 0;
  30. translate: -100px 0;
  31. }
  32. .v-enter-to {
  33. opacity: 1;
  34. translate: 0 0;
  35. }
  36. .v-leave-from {
  37. opacity: 1;
  38. translate: 0 0;
  39. }
  40. .v-leave-to {
  41. opacity: 0;
  42. translate: 100px 0;
  43. }
  44. p {
  45. background-color: lightgreen;
  46. display: inline-block;
  47. padding: 10px;
  48. transition: all 0.5s;
  49. }
  50. </style>

分类导航