Vue2.5筆記:v-if 和 v-show指令

来源:https://www.cnblogs.com/beevesnoodles/archive/2018/10/08/9755519.html
-Advertisement-
Play Games

熟悉 Angular 的同學對指令肯定不會陌生,Vue中也借鑒了指令這一特性,在 Vue 中指令都是帶有 v- 的特殊屬性,那麼指令有什麼作用呢? 我的理解就是:指令是用來控制 DOM 元素的行為,例如最簡單的顯示,隱藏。 Vue 中有很多指令,在今後的學習過程總我們會逐步的學習,今天我們就來說說我 ...


熟悉 Angular 的同學對指令肯定不會陌生,Vue中也借鑒了指令這一特性,在 Vue 中指令都是帶有 v- 的特殊屬性,那麼指令有什麼作用呢?

我的理解就是:指令是用來控制 DOM 元素的行為,例如最簡單的顯示,隱藏。

Vue 中有很多指令,在今後的學習過程總我們會逐步的學習,今天我們就來說說我們非常常用的兩個條件指令 v-ifv-show

v-if

看到 v-if 你肯定會想到 Javascrip 中的 if else 條件判斷語句,你會想是不是還會有 v-else 指令,沒錯 Vue 中不僅給我們提供了 v-else 指令而且還給我們提供了 v-else-if指令。

既然這樣我們就很好理解 v-if 指令了,其實就是根據表達式的值是真(true)假(false)來重建或者銷毀一個我們綁定的 DOM 元素。

怎麼樣,通過我這麼一說你對 if 指令有了更清楚的認識了吧?

什麼東西啊,你這叫解釋的還行?(有些人)

好吧,我覺得我解釋的還行,如果你覺得不行,我們就直接一點擼代碼寫個案例,讓你一看就懂。

<div id="root">
    <div v-if="isShow">你看不見我,你看不見我,你看不見我</div>
</div>
<script>
var vm = new Vue({
  el: "#root",
  data: {
    isShow: false
  }
});
</script>

執行上面的代碼,你會發現頁面上除了什麼都沒有,還是什麼都沒有,總之你什麼都看不見,就是不讓你看見,怎麼辦?

我告訴你這個非常好辦呀,把它打出來就行了,我們在瀏覽器的控制台打 vm.isShow=true 你就能看出效果了,不信?那我們就來試試。

看到了上面這個神奇的效果,我們再來思考一個問題,我們上面是在切換單個 DOM 元素,我們能不能來切換多個元素或者說嵌套元素呢?

<div id="root">
    <div v-if="isShow">
      <p>你看不見我,你看不見我,你看不見我</p>
      <p>呀,好像被你發現了!</p>
    </div>
</div>
<script>
var vm = new Vue({
  el: "#root",
  data: {
    isShow: false
  }
});
</script>

正如我們的預期一樣,我們嵌套多層元素也是沒有問題的,效果還是那個效果。不過在 Vue 中推薦我們使用 <template> 標簽包裹元素。併在上面使用 v-if最終渲染結果將不包括 <template> 元素。

<div id="root">
    <template v-if="isShow">
      <p>你看不見我,你看不見我,你看不見我</p>
      <p>呀,好像被你發現了!</p>
    </template>
</div>
<script>
var vm = new Vue({
  el: "#root",
  data: {
    isShow: true
  }
});
</script>

可以看到我們代碼中使用的 <template> 標簽在渲染的時候沒有顯示

v-else

上面我們已經提到了 v-else指令,它必須緊跟在帶 v-if 或者 v-else-if 的元素的後面,否則它將不會被識別。,我們用一個例子來看下它的用。

<div id="root">
    <h5>Modeng 是怎麼樣的一個人?</h5>
    <div v-if="isHandsome">非常帥</div>
    <div v-else>還是帥</div>
</div>
<script>
var vm = new Vue({
  el: "#root",
  data: {
    isHandsome : true
  }
});
</script>

我們會看到這樣一個效果

如果我們修改下條件表達式的值

你會發現結果怎麼還是帥,難道 Modeng 除了帥就沒有別的結果了嗎?其實,仔細的同學會發現,兩個帥的不一樣。

在這裡只是和大家開個玩笑,其實我沒有大家想象的那麼帥,只是想通過這個例子讓大家更容易理解和記住 v-else,你會發現我們的 v-if v-else指令和我們理解的 Javascript 中的 if else 一樣都是非此即彼的結果。

我們在瀏覽網站的時候,經常會遇到這麼一個情況,你在沒有登陸的時候你看到的以一種內容,你在登陸的時候看到的又是另一種內容。如果我們用 if else指令就很好實現,大家可以自己嘗試一下,我給一個簡單的例子,更好玩的大家去發現。

<div id="root">
    <template v-if="isLogined">
      <div>恭喜,恭喜,你竟然看到了我帥氣的容貌!</div>
    </template>
    <template v-else>
      <div>登陸才可以查看更多內容</div>
    </template>
</div>
<script>
var vm = new Vue({
  el: "#root",
  data: {
    isLogined : false
  }
});
</script>
v-else-if

顧名思義,我們不做過多的解釋,因為前面我們已經解釋過,大家都明白的,v-else-if 還可以連續使用。

v-else-if 也必須緊跟在帶 v-if 或者 v-else-if 的元素之後。

<div id="root">
    <div v-if="type === 'A'">我是誰?</div>
    <div v-else-if="type === 'B'">我在哪?</div>
    <div v-else-if="type === 'C'">我怎麼了?</div>
    <div v-else>誰能救救我!</div>
</div>
<script>
var vm = new Vue({
  el: "#root",
  data: {
    type: 'A'
  }
});
</script>

看個動圖啥都明白了。

v-show

另外一個根據條件展示 DOM 元素的指令,用法與 v-if大致相同。

不同點是:v-if控制的DOM元素的添加與刪除,會存在 DOM 的渲染與銷毀的過程。而 v-show 只是簡單的控制元素的 CSS 的 display 屬性。

v-show 的值為 true 時,綁定 DOM 的 display: block,當值為 false 時,綁定 DOM 的 display: none

<div id="root">
    <div v-show="isShow">我只是用來控制 display 的屬性值</div>
</div>
<script>
var vm = new Vue({
  el: "#root",
  data: {
    isShow: true
  }
});
</script>

我們可以清楚的看到 DOM 元素始終是存在的,v-show 只是利用元素的 display 屬性控制著元素的顯示隱藏。

註意,v-show 不支持 <template> 元素,也不支持 v-else

v-if 與 v-show

看完了文章,你會發現我們可以利用v-ifv-show 兩個指令來控制我們 DOM 元素的行為。但是兩者又存在一定的區別,那麼你該如何去選擇使用那個指令呢?

來一起看官方的回答:

  • v-if 是“真正”的條件渲染,因為它會確保在切換過程中條件塊內的事件監聽器和子組件適當地被銷毀和重建。
  • v-if 也是惰性的:如果在初始渲染時條件為假,則什麼也不做——直到條件第一次變為真時,才會開始渲染條件塊。
  • 相比之下 v-show 就簡單得多——不管初始條件是什麼,元素總是會被渲染,並且只是簡單地基於 CSS 進行切換。

一般來說 v-if 有更高的切換開銷,而 v-show 有更高的初始渲染開銷。因此,如果需要非常頻繁地切換,則使用 v-show 較好;如果在運行時條件很少改變,則使用 v-if 較好。

總結
  1. 我們可以利用不同的方法去控制我們的 DOM 行為。
  2. v-ifv-show 都可以控制元素的顯示隱藏但是有本質區別的,v-if 是控制元素的添加與刪除,而 v-show 只是控制元素的 display 屬性。
  3. 認識到兩者的區別我們就可以肯定自己的場景去選擇對應的方法,如果你的元素頻繁切換建議使用 v-show,反之你可以使用 v-if

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 本文主要介紹Flutter佈局中的Baseline、FractionallySizedBox、IntrinsicHeight、IntrinsicWidth四種控制項,詳細介紹了其佈局行為以及使用場景,並對源碼進行了分析。 ...
  • 想要實現輪播效果,首先安裝時間定時器 接下來就是在我們的項目中使用定時器 接下來我們將豎著的輪播圖變成橫著的 接下來我們調整間距 我們知道輪播圖下方,還有5個圓點,那我們怎麼做呢? 拿到每一個圓點 看對應的樣式 關於當前樣式和小圓點顏色的改變 見成品圖 我們要達到的效果是,哪一個輪播圖在前面,對應的 ...
  • <!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8"> <title>Title</title></head><body><select id="test" name=""> <option value="1">text1</opti ...
  • 我是菜鳥,老鳥勿看,繼承多態等太多概念難以理解,還是從實踐中慢慢學吧!爭取能大致看懂網上的開源的代碼。 對象的組成:方法和屬性 屬性關鍵詞:靜止的,狀態 方法關鍵詞:動態的,過程,處理,帶括弧 js中的面向對象不是其他語言那樣的面向對象。 結果是數組有個number屬性和test方法,但是數組內容為 ...
  • 線上產品代碼一般是編譯過的,前端的編譯處理過程包括不限於 轉譯器/Transpilers (Babel, Traceur) 編譯器/Compilers (Closure Compiler, TypeScript, CoffeeScript, Dart) 壓縮/Minifiers (UglifyJS) ...
  • CSS作為前端開發必備基礎知識,但隨著顯示器技術發展和多種設備共存情況下,前端技術也越來越複雜,如何更好的使用css,有哪些css框架可以供選擇,他們又有什麼優缺點?本文對這一些問題進行了說明,文末有各種css框架對比的鏈接,可以供前端開發小伙伴參考 本文資源 "https://www.slides ...
  • 首先我們來認識view 改變一些特性,再來看看項目的變化 我們新增flex佈局的一些屬性,再來看看項目的變化 接下來我們來看看如果獲取屏幕的解析度 關於圖片的用法,reactNative這裡也是很神奇呢 先看效果圖(博客園裡有個人經常發這種色情圖片,然後我今天找這種線上鏈接就去他的快閃記憶體裡面隨便拿了一 ...
  • WebSocket 學習筆記 "來自我的博客" 因為項目原因需要用到雙工通信,所以比較詳細的學習了一下瀏覽器端支持的 WebSocket. 並記錄一些遇到的問題。 簡介 WebSocket 一般是指瀏覽器提供的 API 介面,允許 Web 頁面通過 WebSocket 協議與遠程主機進行雙向通信。 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...