Vue實例中的其他屬性【5】

目錄

  • 1.計算屬性:
      • 1.概述:
      • 2.語法特點:
      • 3.案例:
        • 案例1:
        • 案例2:
        • 案例3:
      • 4.總結:
      • 5.get函數什么時候執行?
      • 6.注意:
  • 2.監視屬性:
      • 1.概述:
      • 2.用法:
        • 1.監視單個屬性值:
          • 寫法1:在Vue實例對象時配置:
          • 寫法2:Vue實例對象完成后,配置監視屬性
          • 測試結果展示:
        • 2.深度監視:
          • 1.監視對象的一個屬性:
          • 2.監視整個對象:
      • 3.監視屬性的簡寫:只適用于單個屬性等簡單邏輯的監視
      • 4.總結:

1.計算屬性:

1.概述:

   簡單來說,計算屬性就是通過Vue實例中data中已存在的屬性,經過邏輯運算得到一個新屬性;

2.語法特點:

  • 1.定義Vue實例vm
  • 2.在vm中定義el和data屬性
  • 3.在data屬性中定義相關屬性(數據)
  • 4.在vm中定義computed計算屬性
  • 5.在計算屬性中定義函數,執行對data屬性中定義相關屬性的邏輯運算
  • 6.如果需要對計算屬性的值進行讀寫操作,還需要在計算屬性中定義的函數中定義get/set方法
  • 7.并且通過set方法修改計算數值的值時,必須要引起參與計算屬性的變量的改變
  • 8.因為get方法具有緩存機制,只有當數據改變后才會再次執行,如果通過set修改計算屬性的值時,不改變參與計算的值,那么get方法就不會執行,更新后的數據也就不會同步更新到頁面上了

3.案例:

案例1:
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body>
<!--2.準備一個容器-->
<div id="root"><h2>全名:{{fullName}}</h2>姓:<input type="text" v-model="firstName"/><br/>名:<input type="text" v-model="laseName"/><br/>全名:<input type="text" v-model="fullName"/>
</div>
<!--1.引入Vue js 文件-->
<script src="vue/vue.js"></script>
<script type="text/javascript">//3.創建Vue對象let vm = new Vue({data() {return {firstName: '張',laseName: "三"}},computed: {//計算屬性fullName: {get() {//有緩存 只執行一次 如果改變了  需要二次執行console.log("執行了fullName計算")return this.firstName + "-" + this.laseName;},set(value) {console.log("改變計算屬性:", value)//在修改是 要引起 參與計算屬性的變量的改變let arr = value.split("-");this.firstName = arr[0];this.laseName = arr[1];}}}).$mount("#root");
</script>
</body>
</html>

說明:在上面案例中,我們給Vue實例添加了一個計算屬性,通過實例中data對象的firstname屬性和lastname屬性計算獲取fullname,并將計算屬性fullname展示到了頁面上。由于我們在計算屬性的函數中添加了get/set方法,并在set方法中修改fullname的值后,將新的值賦值給了實例中data對象的firstname屬性和lastname屬性,所以可以實現瀏覽器頁面上改變fullname的值時,firstname屬性和lastname屬性以及最上面的fullname的值的同步變化 ,如下圖所示;

案例2:
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body>
<!--2.準備一個容器-->
<div id="root"><h2>全名:{{fullName}}</h2>姓:<input type="text" v-model="firstName"/><br/>名:<input type="text" v-model="laseName"/><br/>全名:<input type="text" v-model="fullName"/>
</div>
<!--1.引入Vue js 文件-->
<script src="vue/vue.js"></script>
<script type="text/javascript">//3.創建Vue對象let vm = new Vue({data() {return {firstName: '張',laseName: "三"}},computed: {//計算屬性fullName: {get() {//有緩存 只執行一次 如果改變了  需要二次執行console.log("執行了fullName計算")return this.firstName + "-" + this.laseName;},set(value) {console.log("改變計算屬性:", value)}}}).$mount("#root");
</script>
</body>
</html>

在案例2中,我們在set方法中只改變fullname的值后,而沒有將新的值賦值給了實例中data對象的firstname屬性和lastname屬性,那么在頁面中對應的屬性就不會同步更新,因為對于get方法來說,數據未發生改變,就不會再執行了,測試結果如下圖所示;

案例3:
 <!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body>
<!--2.準備一個容器-->
<div id="root"><h2>全名:{{fullName}}</h2>姓:<input type="text" v-model="firstName"/><br/>名:<input type="text" v-model="laseName"/><br/>全名:<input type="text" v-model="fullName"/>
</div>
<!--1.引入Vue js 文件-->
<script src="vue/vue.js"></script>
<script type="text/javascript">//3.創建Vue對象let vm = new Vue({data() {return {firstName: '張',laseName: "三"}},computed: {//簡寫  只讀fullName() {//有緩存 只執行一次 如果改變了  需要二次執行console.log("執行了fullName計算")return this.firstName + "-" + this.laseName;}}}).$mount("#root");
</script>
</body>
</html>

說明:如果對于計算屬性的結果只有讀取操作,那么就可以簡寫計算屬性中的函數了,只需在計算屬性的函數中定義執行邏輯即可,由于緩存機制,只要該值不發生改變,就可以正常展示到頁面上;因為沒有set方法,如果此時在頁面上修改計算屬性的值,就會報錯。

4.總結:

  • 要用的屬性不存在,需要通過已有的屬性計算的來
  • 底層借助了 Object.defineproperty() 方法 提供了set get

5.get函數什么時候執行?

  1. 在初次讀取時執行一次
  2. 當依賴屬性改變時在次執行

6.注意:

  1. 計算屬性最終會出現在vm上 可以直接調用
  2. 如果計算屬性要被修改 ,就必須寫set函數,還要引起依賴屬性的改變
  3. 如果不考慮 修改 可以簡寫:

2.監視屬性:

1.概述:

<font style="color:rgba(0, 0, 0, 0.85);">在 Vue 中,監視屬性(</font>`<font style="color:rgba(0, 0, 0, 0.85);">watch</font>`<font style="color:rgba(0, 0, 0, 0.85);">)用于監聽一個特定的數據屬性,并在該屬性發生變化時執行相應的回調函數。</font>

2.用法:

1.監視單個屬性值:
寫法1:在Vue實例對象時配置:
 <!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body>
<!--2.準備一個容器-->
<div id="root">
<!--通過插值表達式結合計算屬性展示天氣信息    --><h2>今天的天氣:{{info}}</h2>
<!--綁定單擊鼠標事件切換天氣    --><button @click="changeWeather">點擊切換天氣</button>
</div>
<!--1.引入Vue js 文件-->
<script src="vue/vue.js"></script>
<script type="text/javascript">//3.創建Vue對象let vm = new Vue({data() {return {isHot: true}},//通過計算屬性的函數展示天氣信息computed: {info() {return this.isHot ? '炎熱' : '涼爽';}},//通過單擊鼠標事件的回調函數改變天氣信息methods: {changeWeather() {this.isHot = !this.isHot;}},//監視isHot屬性,當屬性的值發生改變時,將改變前和改變后的值輸出到控制臺watch: {//監視屬性isHot: {//在初始化時監視immediate:true,handler(newValue, oldValue) {console.log('新的數據:', newValue);console.log('舊的數據:', oldValue);}}}})vm.$mount("#root");
</script>
</body>
</html>

?

寫法2:Vue實例對象完成后,配置監視屬性
 <!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body>
<!--2.準備一個容器-->
<div id="root">
<!--通過插值表達式結合計算屬性展示天氣信息    --><h2>今天的天氣:{{info}}</h2>
<!--綁定單擊鼠標事件切換天氣    --><button @click="changeWeather">點擊切換天氣</button>
</div>
<!--1.引入Vue js 文件-->
<script src="vue/vue.js"></script>
<script type="text/javascript">//3.創建Vue對象let vm = new Vue({data() {return {isHot: true}},//通過計算屬性的函數展示天氣信息computed: {info() {return this.isHot ? '炎熱' : '涼爽';}},//通過單擊鼠標事件的回調函數改變天氣信息methods: {changeWeather() {this.isHot = !this.isHot;}}})//第二種寫法  創建實例后 配置vm.$watch('isHot', {//在初始化時監視immediate: true,handler(newValue, oldValue) {console.log('新的數據:', newValue);console.log('舊的數據:', oldValue);}})vm.$mount("#root");
</script>
</body>
</html>

說明:配置監視屬性必須要在Vum實例綁定div容器之前

測試結果展示:

因為我們在監視屬性中配置了屬性初始化時就開始監視,所以頁面剛加載出來時,控制臺就輸出了相關信息,由于此時數據未改變,所以舊的值為unfined,表示未定義;

此時當我們單擊按鈕時,就會再次觸發事件,引起監視的屬性的改變,進而會執行監視屬性中的邏輯

2.深度監視:
1.監視對象的一個屬性:
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body>
<!--2.準備一個容器-->
<div id="root">
<!--通過插值表達式獲取data中numbers的屬性值    --><h3> a:的值是{{numbers.a}} </h3><h3> b:的值是{{numbers.b}} </h3>
<!--綁定單擊鼠標事件,執行numbers的屬性++操作(Vue 會自動將表達式執行的結果作為回調函數來處理,屬于回調函數的簡寫)     --><button @click="numbers.a++">點擊a++</button><button @click="numbers.b++">點擊b++</button>
</div>
<!--1.引入Vue js 文件-->
<script src="vue/vue.js"></script>
<script type="text/javascript">//3.創建Vue對象let vm = new Vue({data() {return {numbers: {a: 1,b: 2}}},watch: {//單獨的監視對象的一個屬性'numbers.b': {handler(newValue, oldValue) {console.log(newValue,oldValue)}}}})vm.$mount("#root");
</script>
</body>
</html>

在上面案例中,我們對data屬性中的numbers對象的b屬性進行監視,當點擊對應按鈕時觸發事件,改變了b屬性的值,此時就會在監視屬性中執行相關邏輯,控制臺打印新舊數據;

2.監視整個對象:
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body>
<!--2.準備一個容器-->
<div id="root">
<!--通過插值表達式獲取data中numbers的屬性值    --><h3> a:的值是{{numbers.a}} </h3><h3> b:的值是{{numbers.b}} </h3>
<!--綁定單擊鼠標事件,執行numbers的屬性++操作(Vue 會自動將表達式執行的結果作為回調函數來處理,屬于回調函數的簡寫)     --><button @click="numbers.a++">點擊a++</button><button @click="numbers.b++">點擊b++</button>
</div>
<!--1.引入Vue js 文件-->
<script src="vue/vue.js"></script>
<script type="text/javascript">//3.創建Vue對象let vm = new Vue({data() {return {numbers: {a: 1,b: 2}}},watch: {numbers: {//啟用深度監視deep: true,handler(newValue,oldValue) {console.log(newValue,oldValue)}}}})vm.$mount("#root");
</script>
</body>
</html>

在上面案例中,我們對data屬性中的numbers對象的b屬性進行監視,當點擊對應按鈕時觸發事件,改變了b屬性的值,此時就會在監視屬性中執行相關邏輯,控制臺打印新舊數據。但實際上對于numbers對象而言,雖然b屬性的值發生了改變,但numbers對象本身并沒發生變化,因此新舊數值實際上是相同的;

3.監視屬性的簡寫:只適用于單個屬性等簡單邏輯的監視

對于監視單個屬性的簡單邏輯,可以對監視屬性的寫法進行簡化,示例代碼如下:

  <!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body>
<!--2.準備一個容器-->
<div id="root"><h2>今天的天氣:{{info}}</h2><button @click="changeWeather">點擊切換天氣</button>
</div>
<!--1.引入Vue js 文件-->
<script src="vue/vue.js"></script>
<script type="text/javascript">//3.創建Vue對象let vm = new Vue({data() {return {isHot: true}},computed: {info() {return this.isHot ? '炎熱' : '涼爽';}},methods: {changeWeather() {this.isHot = !this.isHot;}},watch: {//監視屬性'isHot'(newValue, oldValue) {console.log('新的數據:', newValue);console.log('舊的數據:', oldValue);}}})vm.$mount("#root");
</script>
</body>
</html>

注意:此種簡寫方式只適用于監視單個屬性的簡單邏輯,對于深度監視這種復雜邏輯則不適用。因為簡寫代碼中監視屬性中不再是一個對象,而是一個函數,在此函數中無法進行深度監視的配置;

4.總結:

  1. 1.當被監視的屬性改變時,回調函數會自動執行。
  2. 2.監視的屬性是必須存在
  3. 3.監視有兩種寫法
  •   在創建Vue實例時 配置 watch
    
  •   在創建Vue實例之后 配置監視
    

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

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

相關文章

C++入門自學Day11-- String, Vector, List 復習

往期內容回顧 List類型的自實現 List類型&#xff08;初識&#xff09; Vector類的自實現 Vector類&#xff08;注意事項&#xff09; 初識Vector String類的自實現 String類的使用&#xff08;續&#xff09; String類&#xff08;續&#xff09; String類&#xff08;初識&…

JavaScript性能優化實戰(三):DOM操作性能優化

想象一下&#xff0c;你正在精心布置一個豪華蛋糕&#xff08;你的網頁&#xff09;&#xff0c;每次添加一顆草莓&#xff08;DOM元素&#xff09;都要把整個蛋糕從冰箱拿出來、放回去&#xff08;重排重繪&#xff09;&#xff0c;來來回回幾十次&#xff0c;不僅效率低下&am…

【力扣】面試經典150題總結02-雙指針、滑動窗口

1.驗證回文串&#xff08;簡單&#xff09;用toLowerCase()轉為小寫字母&#xff0c;然后前后指針向中間進行比對。2.判斷子序列&#xff08;簡單&#xff09;兩個指針一個指向長字符串&#xff0c;另一個指向短字符串。匹配就都1&#xff0c;不匹配就將長字符串指針1。長字符串…

MQ遷移方案

以下是完整的MQ遷移方案設計&#xff0c;涵蓋同構/異構遷移、零丟失保障、灰度切換等關鍵環節&#xff0c;適用于Kafka、RabbitMQ、RocketMQ等主流消息隊列&#xff1a;?一、遷移方案選型矩陣??場景??適用方案??技術實現??優缺點??同集群版本升級?滾動重啟 協議兼…

RAG 分塊中表格填補簡明示例:Markdown、HTML、Excel、Doc

表格填補是RAG分塊中常見的需求&#xff0c;但不同格式的表格處理方式有所不同。本文將對 Markdown、HTML、Excel 的合并單元格進行說明&#xff0c;并給出 Python 示例&#xff0c;演示如何解析和填補。1. Markdown 表格Markdown 只能用空值表示合并單元格。&#xff08;只有列…

IDEA創建一個VUE項目

由于新手學習VUE&#xff0c;所以使用手動初始化項目 步驟&#xff1a; 創建項目文件夾&#xff1a;在 IDEA 中點擊 File > New > Project&#xff0c;選擇 Empty Project&#xff0c;指定項目路徑。初始化 npm&#xff1a;在終端中&#xff1a;npm init -y安裝vue&#…

Chrome插件開發實戰:todoList 插件

以下是一個適合小團隊自用的 Chrome TodoList 插件開發示例&#xff0c;包含基礎功能&#xff08;增刪改查、本地存儲、統計&#xff09;和簡潔的交互設計。代碼結構清晰&#xff0c;適合新手學習或快速上手。 一、項目準備 創建插件項目目錄 todo-list-extension&#xff0c;…

【Redis數據庫開啟SSL加密】【小白指南】【生產環境可用】附帶Docker服務器配置和python連接Redis數據庫代碼(加密通訊版)

【Redis數據庫開啟SSL加密】【填坑指南】附帶服務器配置和python連接測試代碼 本教程轉為小白提供設置Redis安全訪問&#xff0c;自簽名證書進行安全訪問你的Redis數據庫&#xff0c;輕松實現安全訪問和保護數據庫不被非法入侵。 本文原創&#xff0c;轉載請注明出處&#xff0…

筆記本電腦鍵盤失靈【已解決】

配置環境硬件詳情筆記本電腦聯想拯救者y7000 2019 PG0&#xff08;已更新為win11&#xff09;外接鍵盤colorful ckb-p100問題今天筆記本開機后&#xff0c;進入登錄頁面輸入密碼&#xff0c;突然發現筆記本自帶鍵盤&#xff08;我通常不用外接鍵盤&#xff09;的鍵失靈了&#…

postgresql運維問題解決:PG集群備節點狀態異常告警處理

小亦平臺會持續給大家科普一些運維過程中常見的問題解決案例&#xff0c;運維朋友們可以在常見問題及解決方案專欄查看更多案例 問題概述&#xff1a; 故障&#xff1a; pg數據庫備節點狀態異常現象&#xff1a; 一般為集群間心跳超時導致,現象為集群有fail-count失敗數告警&…

Maven 開發實踐

文章目錄1. 搭建私服&#xff08;windows)2.上傳依賴3.多個遠程倉庫配置4.其它1. 搭建私服&#xff08;windows) 軟件下載 https://help.sonatype.com/en/download.html修改端口 etc/nexus-default.properties啟動程序 管理員身份進入進入bin目錄下執行.\nexus.exe /run創建Ma…

設計心得——如何架構選型

一、架構的作用 可能對于很多的公司&#xff0c;其實架構本身的重要性并不大。大家一定明白這回事&#xff0c;架構在實際的開發&#xff0c;在大多數的場景下其實用處并沒有書籍和資料中講的那樣重要&#xff0c;甚至是可有可無。這樣講是不有些可笑&#xff1f;是不是覺得挺意…

vba學習系列(12)--反射率通過率計算復雜度優化25/8/17

系列文章目錄 文章目錄系列文章目錄前言一、反射率通過率1.整體通過率2.整體通過率3.客戶工藝匹配4.機臺通過率分析5.鏡片通過率罩次分析分析1.1分析1.26.鏡片通過率圈數分析分析1.1分析1.28.鏡筒通過率圈數分析分析1.1分析1.29.鏡筒通過率罩次分析分析1.2總結前言 一、反射率通…

Microsoft WebView2

運行效果 代碼如下 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Diagnostics; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Form…

GitCode 疑難問題診療:全方位指南

一、問題診斷與解決框架1.1 通用問題排查流程在面對 GitCode 問題時&#xff0c;遵循一套科學的排查流程至關重要。首先&#xff0c;詳細記錄問題出現時的具體操作步驟與相關報錯信息&#xff0c;這有助于精準定位問題根源。例如&#xff0c;若在執行git push命令時出現錯誤&am…

AMD Ryzen AI Max+ 395四機并聯:大語言模型集群推理深度測試

本文介紹使用四塊Framework主板構建AI推理集群的完整過程&#xff0c;并對其在大語言模型推理任務中的性能表現進行了系統性評估。該集群基于AMD Ryzen AI Max 395處理器&#xff0c;采用mini ITX規格設計&#xff0c;可部署在10英寸標準機架中。 Jeff Geerling大佬還開發了名…

深度學習·GFSS

GFSS General Few-Shot Segmentation 任務實現方式與zero-shot有所不同本篇論文只涉及同一個模態(圖像)&#xff0c;訓練過程中&#xff0c;novel class有幾個圖像提供&#xff0c;提供k個就稱之為k-shot。先從圖像中提取class prototype&#xff0c;然后這個原型向量作為查詢&…

Transformer架構的數學本質:從注意力機制到大模型時代的技術內核

系列專欄推薦&#xff1a;零基礎學Python&#xff1a;Python從0到100最新最全教程 深入淺出講解神經網絡原理與實現&#xff0c;從基礎的多層感知機到前沿的Transformer架構。包含完整的數學推導、代碼實現和工程優化技巧。 寫在前面&#xff1a;為什么理解Transformer如此重要…

最新微信小程序一鍵獲取真實微信頭像和昵稱方法

使用公開免費插件&#xff0c;快速實現獲取用戶頭像和昵稱&#xff0c;已附uniapp、微信開發工具開發詳細教程。前言為了保護用戶隱私&#xff0c;wx.getUserInfo、wx.getUserProfile都沒法獲取到用戶頭像和昵稱了&#xff0c;只能通過設計用戶主動選擇/輸入形式&#xff0c;操…

路由器配置之模式

文章目錄配置路由器時&#xff0c;有一個模式選擇最佳實踐各個選項的區別11b only11g only11n only11bg mixed11bgn mixed配置路由器時&#xff0c;有一個模式選擇 最佳實踐 ? 追求速度&#xff1a;選 11n only&#xff08;需所有設備支持&#xff09;。 ? 兼容性優先&…