Vue 爬坑

都是基于最新的Vue3版本?"vue": "^3.4.29"

1 vue組建樣式設置

<script setup lang="ts">
import HelloWorld from './components/HelloWorld.vue'
</script><template><div><a href="https://vitejs.dev" target="_blank"><img src="/vite.svg" class="logo" alt="Vite logo" /></a><a href="https://vuejs.org/" target="_blank"><img src="./assets/vue.svg" class="logo vue" alt="Vue logo" /></a></div><HelloWorld msg="Vite + Vue"  class="test-baz"/>
</template><style scoped>
.logo {height: 6em;padding: 1.5em;will-change: filter;transition: filter 300ms;
}
.logo:hover {filter: drop-shadow(0 0 2em #646cffaa);
}
.logo.vue:hover {filter: drop-shadow(0 0 2em #42b883aa);
}
.test-baz {color: red;
}
</style>

父組建里面的test-baz并不會被字組建HelloWorld用到,字組建只會用它自己里面的test-baz樣式。

2? vue中getter函數理解

在JavaScript中箭頭函數?() => x.value + y.value?是一個匿名函數,并不是getter函數。

? 在Vue中,watch?函數用于觀測一個表達式或函數(通常稱為“getter”)的變化。當這個表達式的值發生變化時,watch?中定義的回調函數會被觸發。因此,盡管上面提到的箭頭函數?() => x.value + y.value?本身并不是一個嚴格意義上的JavaScript getter函數(如在對象屬性定義中的那種),在Vue框架的上下文中,它可以被視作一個“getter”功能的實現,因為它用來獲取并計算狀態(即?x.value?和?y.value?的和)。

? 這里的匿名箭頭函數?( ) => x.value + y.value?被Vue用作一個getter來監控依賴項(x.value?和?y.value)的變化。當這些依賴項的值發生變化導致計算結果(即兩者的和)改變時,Vue就會調用第二個參數中的回調函數,打印出新的求和結果。因此,在Vue的語境下,將其稱為一個“getter函數”是為了強調其觀測數據變化并響應的功能,而非嚴格遵循JavaScript語言中getter的定義。

3??watch和?watchEffect?

?修改狀態數據就是副作用

const testNumber = ref(0)// 可以直接偵聽一個 ref
watch(testNumber, async (newValue, oldValue) => {testNumber.value = testNumber.value + 1
},)

上面代碼會造成循環依賴報錯

Uncaught (in promise) Maximum recursive updates exceeded. This means you have a reactive effect that is mutating its own dependencies and thus recursively triggering itself. Possible sources include component template, render function, updated hook or watcher source function.

可以修改成只會執行一次,

const testNumber = ref(0)// 可以直接偵聽一個 ref
watch(testNumber,async (newValue, oldValue) => {testNumber.value = testNumber.value + 1},{ once: true }
)

或者使用watchEffect

const testNumber = ref(0)watchEffect(async () => {testNumber.value+=1
})

watchEffect修改自己內部ref不會造成循環依賴。

JPT:

在Vue中,watch?用于觀察數據變化并在變化時執行一些操作。關于“避免在發生副作用時追蹤依賴”的說法,這實際上與Vue的響應式系統如何處理數據變化和依賴收集有關,尤其是在Vue 3引入的Composition API中,通過refreactive創建的狀態自動具有響應式特性。

當你在watch的回調函數內部修改正在被觀察的數據時,如果沒有正確處理,可能會導致無限循環或者不期望的行為。這是因為修改數據會再次觸發依賴更新,進而重新觸發watch,形成一個循環。為了避免這種情況,Vue在設計上要求開發者注意副作用的管理。

const testNumber = ref(0)// 可以直接偵聽一個 ref
watch(testNumber,async (newValue, oldValue) => {testNumber.value = testNumber.value + 1}
)

執行這段代碼會導致以下問題:

  • 副作用:直接修改響應式數據是一種副作用,因為它改變了應用的狀態。
  • 依賴追蹤與無限循環:修改testNumber.value會觸發表達式的重新計算,如果這個修改又滿足watch的觸發條件,那么watch回調將再次執行,從而可能形成無限循環。

為了避免這種情形,Vue提供了幾種策略:

  1. 使用異步watch: 如果你的副作用需要修改觸發它的數據,考慮使用異步watch(通過將回調設為返回Promise的函數,或使用immediateflush: 'post'選項)。這樣Vue會在當前tick的微任務隊列結束后再執行副作用,避免了即時的循環觸發。
  2. 在副作用中謹慎修改數據: 確保修改數據的操作不會立即觸發正在運行的watcher的重新計算。有時候可以通過條件判斷來避免不必要的修改。
  3. 使用watchEffect: 如果你的副作用邏輯依賴于多個狀態,并且修改這些狀態是預期行為的一部分,考慮使用watchEffectwatchEffect更加靈活,會自動管理依賴,并確保副作用在依賴變更時執行,但同樣需要注意避免循環調用的問題。

總之,“避免在發生副作用時追蹤依賴”意味著在執行可能改變響應式數據的操作時,要小心不要無意中觸發了自己正在依賴的數據變化,從而進入無限循環或不可控的狀態變更。正確的做法是合理安排數據修改的位置和時機,以及利用Vue提供的機制來控制副作用的執行。

4??DOM內模板和<template>區別

在Vue中,<template>?標簽有特定的用途,根據上下文的不同,它扮演著不同的角色。以下是兩種主要的使用場景:

1. Vue單文件組件內的?<template>

在Vue的單文件組件(SFC,Single File Component)中,<template>?標簽用于包裹組件的HTML模板部分。這部分定義了組件的結構和布局,Vue會解析這個模板并將其編譯為虛擬DOM。例如:

vue

<template><div class="example"><h1>{{ message }}</h1><button @click="reverseMessage">Reverse Message</button></div>
</template><script>
export default {data() {return {message: 'Hello Vue!'};},methods: {reverseMessage() {this.message = this.message.split('').reverse().join('');}}
};
</script>

在這個例子中,<template>?包含了組件的HTML結構,其中可以綁定數據和事件處理器。

2. DOM內模板插值

在Vue 2中,有一種較為少見的用法是在DOM中直接使用模板字符串插值,這種方式不推薦在現代Vue應用中使用,但在某些老版本的應用或特定場景下可能存在。這通常指的是直接在HTML元素內使用雙大括號?{{ }}?來插入數據。例如:

html

<div id="app">{{ message }}
</div><script>
new Vue({el: '#app',data: {message: 'Hello World!'}
});
</script>

這里雖然沒有直接使用<template>標簽,但雙大括號?{{ }}?實現了數據綁定,相當于簡單模板的使用。然而,對于復雜的結構和邏輯,應該使用Vue組件和<template>標簽。

總結

  • Vue SFC中的?<template>?定義了組件的HTML結構,是Vue組件的核心部分,支持指令、插槽等高級功能。
  • DOM內模板插值?使用雙大括號?{{ }}?直接在HTML中插入數據,適用于非常簡單的數據展示,但不適用于復雜組件結構和邏輯。

在現代Vue開發實踐中,推薦使用Vue組件和單文件組件內的<template>來構建應用界面,以充分利用Vue的響應式系統和組件化優勢。

5?v-model?自定義修飾符

子組件

const [myDemo, myDemoModifiers] = defineModel('myDemo',{// get我們這里不需要set(value:string) {if (myDemoModifiers.uppercase) {return value?.toUpperCase();}},
});<input type="text" v-model="myDemo" />

父組件

const name = ref(0)<HelloWorld msg=""  v-model:my-demo.uppercase="name"
/>

6 什么是構建步驟

構建步驟就是將源碼轉化為可執行的代碼的過程。例如使用vite、webpack進行轉換!

7? 組件Class 與 Style 綁定

//父組件
<script setup lang="ts">
import HelloWorld from './components/HelloWorld.vue'</script><template><HelloWorld class="test-baz"     :style="{ backgroundColor:'pink'}"/></template><style scoped></style>//子組件<script setup lang="ts"></script><template><p class="input-color">Hi!</p>
</template><style scoped >.test-baz {color: green ;
}.input-color {color: red;
}</style>

渲染結果

外部樣式放在默認樣式后面class="input-color test-baz"

按道理應該是test-baz的優先級比input-color高(錯誤認為)

當一個元素指定多個 class 時,class 的優先級與指定順序無關,而是和 class 的定義順序有關。后聲明的優先級高。

.test-baz {color: green ;
}.input-color {color: red;
}

input-color定義在下面所以優先級高。

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

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

相關文章

RPA 第一課

RPA 是 Robotic Process Automation 的簡稱&#xff0c;意思是「機器人流程自動化」。 顧名思義&#xff0c;它是一種以機器人&#xff08;軟件&#xff09;來替代人&#xff0c;實現重復工作自動化的工具。 首先要說一句&#xff0c;RPA 不是 ChatGPT 出來之后的產物&#x…

Ubuntu24.04安裝Skynet環境

安裝依賴 sudo apt-get -y install gcc sudo apt-get -y install g sudo apt-get -y install make sudo apt-get install -y autoconf automake libtool sudo apt-get install -y git 或者可以用&#xff1a; sudo apt-get -y install gcc g make autoconf automake libtool…

升級springboot3

坑爹的發版流水線&#xff0c;管天管地&#xff0c;springboot2過了維護期&#xff0c;就催著我們升級。 導致必須上jdk17 記錄一下升級需要處理的事情 先升級springboot和cloud&#xff0c;這里定下基調&#xff0c;其他的才好跟著升級 https://spring.io/projects/spring-b…

如何在Java中使用正則表達式

如何在Java中使用正則表達式 大家好&#xff0c;我是免費搭建查券返利機器人省錢賺傭金就用微賺淘客系統3.0的小編&#xff0c;也是冬天不穿秋褲&#xff0c;天冷也要風度的程序猿&#xff01; 正則表達式&#xff08;Regular Expression&#xff0c;簡稱Regex或RegExp&#…

elementui中@click短時間內多次觸發,@click重復點擊,做不允許重復點擊處理

click快速點擊&#xff0c;發生多次觸發 2.代碼示例&#xff1a; //html<el-button :loading"submitLoading" type"primary" click"submitForm">確 定</el-button>data() {return {submitLoading:false,}}//方法/** 提交按鈕 */sub…

分布式鎖——基于Redis分布式鎖

單機鎖 服務器只有一個&#xff0c;JVM只有一個。 用synchronized加鎖&#xff0c;對lock對象加鎖&#xff0c;只有線程1結束&#xff0c;線程2,3才會開始。 再用uid避免一個線程多次進來。 分布式鎖 真正上線時&#xff1a; 【注&#xff1a;這些服務器連接的是一個Redis集…

STM32入門筆記(03): ADC(SPL庫函數版)(2)

A/D轉換的常用技術有逐次逼近式、雙積分式、并行式和跟蹤比較式等。目前用的較多的是前3種。 A/D轉換器的主要技術指標 轉換時間 分辨率 例如&#xff0c;8位A/D轉換器的數字輸出量的變化范圍為0&#xff5e;255&#xff0c;當輸入電壓的滿刻度為5V時&#xff0c;數字量每變化…

如何學好自動化測試

1. 什么是自動化測試 自動化測試是使用腳本和工具來執行測試任務&#xff0c;以替代手工測試過程。它可以提高效率、減少人工錯誤&#xff0c;并增加測試覆蓋率。在軟件開發過程中&#xff0c;自動化測試已經成為了不可或缺的一部分。 自動化測試主要有以下好處&#xff1a; …

Amos結構方程模型---探索性分析

初級 第5講 探索性分析_嗶哩嗶哩_bilibili amos中基本操作&#xff1a; 橢圓潛變量&#xff0c;不可預測 數據導入 改變形狀 判定系數 方差估計和假設檢驗&#xff1a; 探索性分析&#xff1a; ses&#xff08;潛變量&#xff09;社會經濟指數 從考慮最大的MI開始&#xff0c;卡…

【Python畫圖-馴化seaborn】一文搞懂seaborn中的箱線圖實踐技巧

【Python畫圖-馴化seaborn】一文搞懂seaborn中的箱線圖實踐技巧 本次修煉方法請往下查看 &#x1f308; 歡迎蒞臨我的個人主頁 &#x1f448;這里是我工作、學習、實踐 IT領域、真誠分享 踩坑集合&#xff0c;智慧小天地&#xff01; &#x1f387; 免費獲取相關內容文檔關注&a…

2736 卡片重排

題目描述 Description 可可共有兩種卡片&#xff0c;一種卡片是數字0-9編號&#xff0c;一種卡片是字母A-Z編號&#xff0c;現在兩種卡片混在一起&#xff0c;可可想將它們歸類擺放&#xff0c;但是要求同類卡片中&#xff0c;它們相對位置不可以改變&#xff0c;原先在前的仍…

python把項目編譯成so文件

提示&#xff1a;文章寫完后&#xff0c;目錄可以自動生成&#xff0c;如何生成可參考右邊的幫助文檔 文章目錄 前言一、使用步驟1.引入庫 總結 前言 提示 例如&#xff1a; 提示&#xff1a;以下是本篇文章正文內容&#xff0c;下面案例可供參考 一、使用步驟 1.引入庫 代…

C語言兩個較大數字相加

C語言兩個較大數字相加 思路分析 由于C語言中的基本數據類型&#xff08;如int、long等&#xff09;有固定的大小&#xff0c;無法直接處理非常大的數字&#xff08;如數百位的數字&#xff09;。因此&#xff0c;我們需要采用字符串或數組來表示大數字&#xff0c;并逐位進行…

1.4 ROS2集成開發環境搭建

1.4.1 安裝VSCode VSCode全稱Visual Studio Code&#xff0c;是微軟推出的一款輕量級代碼編輯器&#xff0c;免費、開源而且功能強大。它支持幾乎所有主流的程序語言的語法高亮、智能代碼補全、自定義熱鍵、括號匹配、代碼片段、代碼對比Diff、GIT 等特性&#xff0c;支持插件…

導入第三方包Could not find a package configuration file provided by “demo msgs“ with

報錯代碼 Could not find a package configuration file provided by "demo msgs" with any of the following names: demo msgsConfig.cmake demo msgs-config.cmake Add the installation prefix of "demo msgs" tO CMAKE PREFIX PATH or set "dem…

7.3數據庫第一次作業

安裝MySQL 1.打開安裝包 2.選擇自定義安裝&#xff08;custom&#xff09;并點擊下一步 3.自定義安裝路徑 4.點擊執行 5.執行成功 6.默認選項點擊下一步 7.選擇新的授權方式并點擊下一步 8.配置密碼 9.默認配置并點擊下一步 10.點擊執行&#xff08;Execute&#xff09; 11.執…

python中的文件

1.什么是文件&#xff1f; 硬盤上存儲的數據都是以文件的形式來組織的~ 文件是數據在硬盤上的存儲形式&#xff0c;不同的數據在硬盤上的存儲形式是不同的&#xff0c; 2.文件路徑 文件夾/目錄。 文件夾&#xff0c;再包含文件夾的情況&#xff0c;這就是一個嵌套的關系&…

2024-2025年本田維修電路圖線路圖接線圖資料更新

此次更新了2024-2025年本田車系電路圖資料&#xff0c;覆蓋市面上99%車型&#xff0c;包括維修手冊、電路圖、新車特征、車身鈑金維修數據、全車拆裝、扭力、發動機大修、發動機正時、保養、電路圖、針腳定義、模塊傳感器、保險絲盒圖解對照表位置等等&#xff01; 汽修幫手汽…

Java中使用arima預測未來數據

看著已經存在的曲線圖數據&#xff0c;想預估下后面曲線圖的數據。 import java.util.Vector;public class AR {double[] stdoriginalData{};int p;ARMAMath armamathnew ARMAMath();/*** AR模型* param stdoriginalData* param p //p為MA模型階數*/public AR(double [] stdori…

你的硬盤知道的太多:你以為你的秘密真的被刪除了嗎?

某一天你收到了朋友發給你的一個秘密文件&#xff0c;在看完之后&#xff0c;為了不被別人發現&#xff0c;你決定將文件毀尸滅跡&#xff01; 你選中文件名稱 / 右鍵 / 刪除&#xff0c;好了&#xff0c;文件已經消失了。但你是懂電腦的&#xff0c;知道文件此時還在回收站里面…