Vue2 使用 v-if、v-else、v-else-if、v-show 以及 v-has 自定義指令實現條件渲染

提示:渲染就是顯示

文章目錄

  • 前言
  • v-if 的基礎用法
  • v-else
  • v-else-if
  • v-show 和 v-if 對比
  • 自定義指令 v-has
  • v-if 和 v-has 結合使用場景
    • 完整示例
    • 補充說明


前言

提示:這里可以添加本文要記錄的大概內容:

在 Vue2 中,可以通過 v-if 和自定義指令(如 v-has)實現靈活的條件渲染。以下是具體實現和示例:

v-if 的優先級高于 v-has,因此 v-if 的條件必須先成立,v-has 才會生效。

v-if 的基礎用法

v-if 根據表達式的布爾值決定是否渲染元素。若表達式為 false,元素會被完全移除 DOM。適合用于不頻繁切換顯示狀態的場景,如果條件頻繁變化,建議改用 v-show,因為 v-show 只是通過 CSS 控制顯示/隱藏,避免頻繁操作 DOM。

【例1】

<div v-if="showFlag">

這段代碼的功能是通過 v-if 指令動態控制一個 div 元素的顯示與隱藏。當 showFlag 的值為 true 時,div 元素會被渲染到頁面上;當 showFlag 的值為 false 時,div 元素不會被渲染。

【例2】

<template v-if='showFlag=== 1'> 

判斷:showFlag是否等于 1
是→渲染模板內容
否→不渲染模板內容

v-else

一般不單獨存在,一般和v-if或者v-else-if一起使用;

<body><div id="app"><p v-if="ok">Yes</p><p v-else>No</p><button @click="toggle()">切換</button></div><script>// 創建 Vue 實例const vm = new Vue({el: "#app",data: {ok: false, // 控制條件渲染},methods: {toggle() {this.ok = !this.ok; // 切換 ok 的值}}});</script>
</body>
  1. 條件渲染

    • 使用 v-if="ok"v-else 來控制顯示 “Yes” 或 “No”。
    • oktrue 時,顯示 “Yes”;當 okfalse 時,顯示 “No”。
  2. 事件綁定

    • 使用 @click="toggle()" 綁定按鈕點擊事件。
    • 點擊按鈕時會調用 toggle() 方法,切換 ok 的值(在 truefalse 之間切換)。
  3. 數據綁定

    • data 中定義了 ok 屬性,默認值為 false
    • 點擊按鈕后,ok 的值會被取反,從而觸發視圖更新。
  4. 測試結果

    • 頁面初始狀態會顯示 “No”,因為 ok 的默認值為 false
    • 點擊 “切換” 按鈕后,ok 的值變為 true,頁面會顯示 “Yes”。
    • 再次點擊按鈕,ok 的值變為 false,頁面會切換回 “No”。

v-else-if

指令時多分支判斷

<div id="app"><div v-if="type === 'A'">Type A</div><div v-else-if="type === 'B'">Type B</div><div v-else-if="type === 'C'">Type C</div><div v-else>Not A, B, or C</div>
</div><script>var wue = new Vue({el: '#app',data: {type: 'A'}});
</script>
  1. HTML 部分

    • 根據 type 的值,Vue 會動態渲染對應的 <div>
    • 如果 type'A',則顯示 “Type A”。
    • 如果 type'B',則顯示 “Type B”。
    • 如果 type'C',則顯示 “Type C”。
    • 如果 type 不是以上任何一種情況,則顯示 “Not A, B, or C”。
  2. JavaScript 部分

    • Vue 實例綁定了 #app 元素,并定義了兩個數據屬性:
      • type: 'A'(當前值為 'A',因此會顯示 “Type A”)。

v-show 和 v-if 對比

v-show 也是用于根據條件展示元素。和v-if不同的是,如果v-if的值是false,則這個元素被銷毀,不在dom中。但是v-show的元素會始終被渲染并保存在dom中,它只是簡單的切換cssdispaly屬性。

注意:v-if有更高的切換開銷
v-show有更高的初始渲染開銷。

<body><div id="app"><p v-if="flag">晴天</p><hr><p v-show="flag">心情好</p><button @click="flag = !flag">切換</button></div><script>var app = new Vue({el: '#app',data: {flag: true // 初始值為 true}});</script>
</body>
  1. 頁面加載時,顯示:
   晴天-----心情好

在這里插入圖片描述

  1. 點擊 “切換” 按鈕后,flag 的值變為 false,頁面更新為:
   -----

在這里插入圖片描述

  1. 再次點擊 “切換” 按鈕,flag 的值變為 true,頁面恢復為:
   晴天-----心情好

在這里插入圖片描述

v-if條件渲染:條件滿足,dom元素顯示,若條件不滿足,dom原始被刪除了;是對dom元素操作的;
v-show 渲染:條件滿足,dom元素style=display:none來顯示原始的顯示和隱藏的;

如果要非常頻繁的切換,則使用v-show較好;如果在運行時條件不太可能改變,則v-if較好

自定義指令 v-has

組件中使用v-has根據按鈕權限,判斷是否顯示該按鈕

    <!-- 需要 create 權限的按鈕 --><button v-has="'buyCarList:create'" @click="handleCreate">新 建</button>
v-has="'buyCarList:create'"

v-has 是一個自定義指令,用于權限控制,動態判斷用戶是否有某個權限。

通常會結合用戶的權限列表(如從后端獲取的權限數據)來判斷是否渲染元素,如果用戶沒有 buyCarList:create 權限,則該按鈕不會被渲染到頁面上。

也就是說前端權限控制僅用于 UI 層隱藏,實際接口調用仍需后端驗證,防止越權操作

具體邏輯通常在全局指令中定義,例如:

  1. 檢查當前用戶的權限列表。
  2. 如果權限列表中包含 buyCarList:create,則渲染該按鈕。
  3. 如果不包含,則隱藏該按鈕。

v-if 和 v-has 結合使用場景

完整示例

<template><div><!-- 普通條件渲染 --><p v-if="showWelcome">歡迎回來,{{ userName }}!</p><!-- 權限控制 --><button v-has="'create'">新建文章</button><button v-has="'delete'" v-if="selectedItem">刪除選中項</button><!-- 權限 + 角色雙重驗證 --><div v-if="user.role === 'admin'" v-has="'audit'">審核功能</div><!-- v-else 配合使用 --><div v-if="isLoading">加載中...</div><div v-else>數據加載完成</div></div>
</template><script>
export default {data() {return {showWelcome: true,userName: 'Alice',selectedItem: null,user: { role: 'editor' }};}
};
</script>
  1. 普通條件渲染
<p v-if="showWelcome">歡迎回來,{{ userName }}!</p>
  • 功能:通過 v-if 指令控制一段文本的顯示與隱藏。
  • 邏輯
    • showWelcome 的值為 true 時,顯示 <p> 標簽中的內容。
    • showWelcome 的值為 false 時,該段內容不會被渲染到 DOM 中。
  • 數據綁定
    • userName 是一個動態變量,用于顯示用戶的名稱(如 “Alice”)。
  • 應用場景:適合用于登錄后歡迎信息的顯示或頁面加載后的提示信息。

  1. 權限控制
<button v-has="'create'">新建文章</button>
<button v-has="'delete'" v-if="selectedItem">刪除選中項</button>
  • 功能:通過自定義指令 v-has 控制按鈕是否顯示,結合 v-if 實現更復雜的條件判斷。
  • 邏輯
    • 第一個按鈕:只有當用戶擁有 'create' 權限時,才會顯示“新建文章”按鈕。
    • 第二個按鈕:不僅需要用戶擁有 'delete' 權限,還需要滿足 selectedItem 不為空的條件(即有選中項時才顯示“刪除選中項”按鈕)。
  • 應用場景
    • 權限控制:確保用戶只能看到自己有權訪問的功能按鈕。
    • 狀態依賴:結合其他條件(如是否有選中項)進一步細化顯示邏輯。

  1. 權限 + 角色雙重驗證
<div v-if="user.role === 'admin'" v-has="'audit'">審核功能</div>
  • 功能:結合角色和權限進行雙重驗證,只有同時滿足條件時才會顯示特定內容。
  • 邏輯
    • 首先檢查 user.role 是否為 'admin'(管理員角色)。
    • 再通過 v-has 檢查用戶是否擁有 'audit'(審核)權限。
    • 只有當這兩個條件都成立時,才會顯示“審核功能”相關內容。
  • 應用場景
    • 多層次權限管理:既要求用戶具有特定角色,又要求具備某些具體權限。
    • 適用于復雜的企業級應用,例如后臺管理系統。
  1. v-else 配合使用:
   <div v-if="isLoading">加載中...</div><div v-else>數據加載完成</div>
  • v-else 必須緊跟在 v-ifv-else-if 后面。
  • isLoadingtrue 時,顯示“加載中…”。
  • isLoadingfalse 時,顯示“數據加載完成”。

補充說明

  1. v-ifv-show 的區別:
    • v-if 是基于條件動態地添加或移除 DOM 元素。
    • v-show 則是通過 CSS 的 display 屬性來控制元素的顯示 / 隱藏。
    • 如果需要頻繁切換顯示狀態,推薦使用 v-show,因為它不會頻繁操作 DOM。

示例:

   <p v-show="showMessage">這是通過 v-show 顯示的消息</p>
  1. 復雜條件判斷:
    如果條件邏輯更復雜,可以考慮使用計算屬性來簡化模板中的邏輯。

    示例:

   <button v-if="isAdmin">管理員操作</button>
   computed: {isAdmin() {return this.user.role === 'admin';}}
  1. v-else-if 的使用:
    如果有多個條件分支,可以使用 v-else-if

    示例:

   <div v-if="score > 90">優秀</div><div v-else-if="score > 60">及格</div><div v-else>不及格</div>

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/76016.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/76016.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/76016.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【項目合集】只能xx養殖系統,STM32、esp8266、OLED屏幕、dht11、光敏、水位、加熱、風扇

硬件 STM32 主控ESP8266 WIIF 模塊煙霧傳感器dht11 溫濕度傳感器光敏傳傳感器&#xff08;偏暗、亮兩種狀態&#xff09;水位檢測OLED 顯示當前狀態&#xff08;環境數據&#xff09;加熱模塊&#xff08;燈代替&#xff09;風扇模塊電源模塊繼電器&#xff08;控制風扇&#…

Java多線程與高并發專題——Condition 和 wait/notify的關系

引入 上一篇關于Condition&#xff0c;我們對Condition有了進一步了解&#xff0c;在之前生產/消費者模式一文&#xff0c;我們講過如何用 Condition 和 wait/notify 來實現生產者/消費者模式&#xff0c;其中的精髓就在于用Condition 和 wait/notify 來實現簡易版阻塞隊列&am…

29_項目

目錄 http.js 1、先注冊賬號 register.html 2、再登錄 login.html 3、首頁 index.html 4 詳情 details.html cart.html css index.css register.css details.css 演示 進階 http.js let baseURL "http://localhost:8888"; let resgiterApi baseURL &…

Next.js 項目生產構建優化

Next.js 項目生產構建優化的完整教程&#xff0c;涵蓋配置、工具鏈和性能調優技巧&#xff0c;助你顯著加速 npm run build&#xff1a; 注&#xff1a;學習階段請先測試環境使用&#xff01; 文章目錄 [toc]一、基礎優化1. 確保使用最新版本2. 清理無用依賴和代碼3. 配置 nex…

【嵌入式學習3】多任務編程

目錄 1、多任務 并發&#xff1a;在一段時間內交替去執行任務 并行&#xff1a; 2、線程 進程與線程 守護線程 1、多任務 在同一時間內執行多個任務&#xff0c;多任務分為并發和并行兩種形式 并發&#xff1a;在一段時間內交替去執行任務 軟件1執行0.01秒&#xff0c;切…

鏈路聚合(Link Aggregation)

目錄 一. 鏈路聚合概述 1. 基本概念 2. 實現條件 3. 成員接口和成員鏈路 二. 鏈路聚合模式 1. 手工模式 2. LACP模式 三. 負載分擔 1. 基于數據包的負載分擔 2. 基于數據流的負載分擔 一. 鏈路聚合概述 1. 基本概念 鏈路聚合&#xff08;Link Aggregation&#xff…

QT圖片輪播器(QT實操學習2)

1.項目架構 1.UI界面 2.widget.h? #ifndef WIDGET_H #define WIDGET_H#include <QWidget>#define TIMEOUT 1 * 1000 QT_BEGIN_NAMESPACE namespace Ui { class Widget; } QT_END_NAMESPACEclass Widget : public QWidget {Q_OBJECTpublic:Widget(QWidget *parent n…

【HTML5】02-列表 + 表格 + 表單

本文介紹 列表、表格、表單的具體使用。 目錄 1. 列表 1.1 無序列表 1.2 有序列表 1.3 定義列表 2. 表格 2.1 基本使用 2.2 表格結構標簽 2.3 合并單元格 3. 表單 3.1 input標簽 3.2 input 標簽占位文本 3.3 單選框 3.4 上傳文件 3.5 多選框 3.6 下拉菜單 3.7…

【數據結構】導航

【數據結構】-CSDN博客 【數據結構】next數組、nextval數組-CSDN博客

開源項目里的 autogen.sh 是做什么?

./autogen.sh 是一個在基于 Autotools 構建系統的開源項目中常見的腳本。它的主要作用是準備構建環境&#xff0c;生成后續編譯所需的關鍵文件。 更具體地說&#xff0c;./autogen.sh 通常會執行以下操作&#xff1a; 檢查構建工具: 它會檢查系統中是否安裝了構建項目所需的工…

RabbitMQ高級特性--發送方確認

目錄 1. confirm確認模式 1.配置RabbitMQ 2.設置確認回調邏輯并發送消息 2.Return退回模式 1.配置RabbitMQ 2.設置返回回調邏輯并發送消息 在使用RabbitMQ的時候, 可以通過消息持久化來解決因為服務器的異常崩潰而導致的消息丟失, 但是還有?個問題, 當消息的生產者將消息發送出…

Python的ASGI Web 服務器之uvicorn

文章目錄 什么是uvicornUvicorn 和 uWSGI 對比區別安裝 Uvicorn使用示例 什么是uvicorn 官網https://www.uvicorn.org/ Uvicorn 是一個用于 Python 的 ASGI Web 服務器實現。 Until recently Python has lacked a minimal low-level server/application interface for async…

MongoDB 創建數據庫

MongoDB 創建數據庫 引言 MongoDB 是一款高性能、可擴展的 NoSQL 數據庫&#xff0c;廣泛應用于大數據領域。在 MongoDB 中&#xff0c;創建數據庫是進行數據存儲的第一步。本文將詳細介紹 MongoDB 數據庫的創建方法&#xff0c;包括手動創建和自動創建兩種方式。 MongoDB 數…

并發編程之最小化共享

文章目錄 **什么是「最小化共享」&#xff1f;****為什么要最小化共享&#xff1f;****如何實現最小化共享&#xff1f;****1. 線程局部存儲&#xff08;Thread-Local Storage&#xff09;****2. 消息傳遞&#xff08;Message Passing&#xff09;****3. 不可變數據&#xff08…

通信之光纖耦合器

以下是關于光纖耦合器的詳細介紹&#xff1a; 定義與原理 - 定義&#xff1a;光纖耦合器是一種能使傳輸中的光信號在特殊結構的耦合區發生耦合&#xff0c;并進行再分配的器件&#xff0c;也叫分歧器、連接器、適配器、光纖法蘭盤。 - 原理&#xff1a;利用不同光纖面緊鄰光纖芯…

自然語言模型的演變與未來趨勢:從規則到多模態智能的跨越

自然語言模型的演變與未來趨勢&#xff1a;從規則到多模態智能的跨越 自然語言處理(NLP)作為人工智能領域最具挑戰性的分支之一&#xff0c;在過去幾十年經歷了翻天覆地的變化。從最初基于規則的系統到如今擁有萬億參數的大型語言模型(LLMs)&#xff0c;這一技術革新不僅徹底改…

筆記本電腦更換主板后出現2203:System configuration is invalid,以及2201、2202系統錯誤的解決

筆記本電腦更換主板后啟動出現2203:System configuration is invalid,以及2201、2202系統錯誤的解決 自用的一臺ThinkpadT490筆記本電腦 ,由于主板故障,不得不更換主板,通過某寶購置主板后進行了更換。 具體拆卸筆記本可搜索網絡視頻教程。 注意: 在更換主板時,注意先拍…

JavaScript中的觀察者模式

以下是關于 觀察者模式(Observer Pattern) 的全面梳理,涵蓋核心概念、實現方式、應用場景及注意事項,幫助我們掌握這一解耦事件通知與處理的經典設計模式: 一、觀察者模式基礎 1. 核心概念 定義:定義對象間 一對多 的依賴關系,當被觀察對象(Subject)狀態變化時,自動…

RAG基建之PDF解析的“流水線”魔法之旅

將PDF文件和掃描圖像等非結構化文檔轉換為結構化或半結構化格式是人工智能的關鍵部分。然而,由于PDF的復雜性和PDF解析任務的復雜性,這一過程顯得神秘莫測。 在RAG(Retrieval-Augmented Generation)基建之PDF解析的“魔法”與“陷阱”中,我們介紹了PDF解析的主要任務,對現…