一個項目學習Vue3---響應式基礎

觀察下面一段代碼,學習響應式基礎的全部內容

<template><div><div>將下面的msg屬性放到上面來:{{ msg }}</div><button @click="count++">{{ count }}</button><button @click="object.count.value++">{{ object.count.value }}</button><button @click="open">點擊變豬</button><button @click="addAge">長大一歲</button><a :href="hrefValue" id="herfValue">Dom更新的時間:{{ hrefValue }}</a><button @click="changeUrl">更改上面url</button><button @click="addAgeReactive">長大一歲{{ age.count }}</button></div>
</template><script lang="ts" setup>
import { nextTick } from 'vue'
import { ref } from 'vue'
import { reactive } from 'vue'
//綁定上方的學無止境
const msg = ref('學無止境')
//綁定上方的count
const count = ref(0)
//如果這么寫count是不能被解包的
const object = { count: ref(1) }
//如果標簽中存在object.count++則不會被解包
//必須使用object.count.value++才能//下面代買會輸出學無止境
console.log(msg.value)
//綁定上方的變豬
function open() {msg.value = '豬'
}
//綁定一個對象
const user = ref({userName: '張三',age: 10
})
//增加一歲
function addAge() {user.value.age++
}
const hrefValue = ref('www.baidu.com')
async function changeUrl() {hrefValue.value = 'www.json.cn'let element = document.getElementById('herfValue')if (element) {console.log(element.getAttribute('href'))}await nextTick//他在執行了上面的nextTick方法之后才會改變值if (element) {console.log(element.getAttribute('href'))}
}
const age = reactive({ count: 0 })
//又增加一歲
function addAgeReactive() {//reactive創建的不需要寫valueage.count++
}
let raw = {}
const proxy = reactive(raw)
//true
console.log(reactive(raw) === proxy)
//false
console.log(proxy === raw)
//即便返回
const proxy2 = reactive({})
proxy2.nested = raw
//返回false
console.log(proxy2.nested === raw)
proxy2.nested = proxy
//返回true
console.log(proxy2.nested === proxy)//reactive局限性
let state = reactive({ count: 0 })// 上面的 ({ count: 0 }) 引用將不再被追蹤
// (響應性連接已丟失!) 重復賦值
state = reactive({ count2: 1 })
// 當解構時,count 已經與 state.count 斷開連接
let { count2 } = state
// 不會影響原始的 state
count2++// 該函數接收到的是一個普通的數字
// 并且無法追蹤 state.count 的變化
// 我們必須傳入整個對象以保持響應性
//找不到count 這個屬性,所以代理對象之間不能相互賦值
callSomeFunction(state.count2)function callSomeFunction(count) {//返回0console.log(count)
}//Ref自動解包
const name = ref('張三')
const bigName = reactive({ name })
//輸出的實際是ref("張三")
console.log(bigName.name)
//ref("張三") = "李四"
bigName.name = '李四'
//返回李四
console.log(name.value)
//返回李四
console.log(bigName.name)//如果將一個新的 ref 賦值給一個關聯了已有 ref 的屬性,那么它會替換掉舊的 ref:
const otherName = ref("王五")
bigName.name = otherName
//返回王五
console.log(bigName.name)
//返回李四
console.log(name.value) //與 reactive 對象不同的是,當 ref 作為響應式數組或原生集合類型 (如 Map) 中的元素被訪問時,它不會被解包:
const books = reactive([ref('Vue 3 Guide')])
// 這里需要 .value
console.log(books[0].value)const map = reactive(new Map([['count', ref(0)]]))
// 這里需要 .value
console.log(map.get('count').value)</script><style scoped>
</style>

他執行之后產生的頁面是這樣的

知識點1:ref()

當我們在script引入

<script lang="ts">import { ref } from 'vue'
</script>

我們就可以使用ref來代理一些變量,還記得我們在vue2中的寫法嗎?通過選項式API,我們在return中的變量都可以被vue雙向綁定,而在vue3中我們可以使用更加便捷的方式來操作變量,

<script lang="ts">
import { ref } from 'vue'
setup(){const msg = ref('學無止境')return {msg}
}
</script>

在上面return中的內容就相當于vue2中任何return、methods等一切可以雙向綁定的內容,是的,他也可以代理方法

<script lang="ts">
import { ref } from 'vue'
setup(){const msg = ref('學無止境')function open() {msg.value = '豬'}return {openmsg}
}
</script>

這樣他就可以代理方法了,我們看到一個msg.value,什么意思呢?ref本質是一個對象,.value可以對對象進行解包,這樣就可以獲取msg的內容。當然如果你綁定到html代碼里面,這個東西是會自動解包的

<div>將下面的msg屬性放到上面來:{{ msg }}</div>

它也可以綁定對象等

<template><button @click="addAge">長大一歲</button>
</template>
<script lang="ts">
setup(){//綁定一個對象const user = ref({userName: '張三',age: 10})//增加一歲function addAge() {user.value.age++}return {user,addAge}
}
</script>

如果你想分別獲取ref變化之前和之后的值,nextTick可以幫助到你

<template><a :href="hrefValue" id="herfValue">Dom更新的時間:{{ hrefValue }}</a><button @click="changeUrl">更改上面url</button>
</template>
<script lang="ts">
import { nextTick } from 'vue'
import { ref } from 'vue'
setup(){const hrefValue = ref('www.baidu.com')async function changeUrl() {hrefValue.value = 'www.json.cn'let element = document.getElementById('herfValue')if (element) {console.log(element.getAttribute('href'))}await nextTick//他在執行了上面的nextTick方法之后才會改變值if (element) {console.log(element.getAttribute('href'))}}return {changeUrl,hrefValue }
}
</script>

上面的代碼在? ?await nextTick之前,他的值事還沒有變化的,所以你hrefValue.value之后,是不能快速的獲取到他的值的

寫了這么多,我們發現每次都需要最后都要return,每次都需要寫setup函數不方便,那么我們可以簡化一些代碼,例如上面那段代碼,我們可以簡化成

<template><a :href="hrefValue" id="herfValue">Dom更新的時間:{{ hrefValue }}</a><button @click="changeUrl">更改上面url</button>
</template>
<script lang="ts" setup>const hrefValue = ref('www.baidu.com')async function changeUrl() {hrefValue.value = 'www.json.cn'let element = document.getElementById('herfValue')if (element) {console.log(element.getAttribute('href'))}await nextTick//他在執行了上面的nextTick方法之后才會改變值if (element) {console.log(element.getAttribute('href'))}}}
</script>

這樣就可以不寫setup和return函數了,他會自己檢測需要return的東西,函數或者變量都會被返回。

知識點2:?reactive()

reactive的使用和ref基本類似

const age = reactive({ count: 0 })
//又增加一歲
function addAgeReactive() {//reactive創建的不需要寫valueage.count++
}

如上面所示,他不需要進行寫.value就可以對變量進行++操作

在比較相等性,也就是引用上,可能與我們想象的不同

let raw = {}
const proxy = reactive(raw)
//會引用同一個對象,返回true
console.log(reactive(raw) === proxy)
//封裝的對象和原始對象不一樣,返回false
console.log(proxy === raw)
const proxy2 = reactive({})
proxy2.nested = raw
//封裝對象的屬性被賦值普通對象,返回false
console.log(proxy2.nested === raw)
proxy2.nested = proxy
//封裝對象的屬性被賦值封裝對象,返回true
console.log(proxy2.nested === proxy)

區別于vue2,return中的對象只會雙向綁定,但是vue3中這么開放肯定會存在覆蓋的現象

//reactive局限性
let state = reactive({ count: 0 })// 上面的 ({ count: 0 }) 引用將不再被追蹤
// (響應性連接已丟失!) 重復賦值
state = reactive({ count2: 1 })
// 當解構時,count 已經與 state.count 斷開連接
let { count2 } = state
// 不會影響原始的 state
count2++// 該函數接收到的是一個普通的數字
// 并且無法追蹤 state.count 的變化
// 我們必須傳入整個對象以保持響應性
//找不到count 這個屬性,所以代理對象之間不能相互賦值
callSomeFunction(state.count2)function callSomeFunction(count) {//返回0console.log(count)
}

如上state又被重復賦值了,那么他最后指向的是后者?當解構時,count 已經與 state.count 斷開連接,即便++,也只是普通變量的++,不能改變count2的值

知識點3:ref自動解包

//Ref自動解包
const name = ref('張三')
const bigName = reactive({ name })
//輸出的實際是ref("張三")
console.log(bigName.name)
//ref("張三") = "李四"
bigName.name = '李四'
//返回李四
console.log(name.value)
//返回李四
console.log(bigName.name)//如果將一個新的 ref 賦值給一個關聯了已有 ref 的屬性,那么它會替換掉舊的 ref:
const otherName = ref("王五")
bigName.name = otherName
//返回王五
console.log(bigName.name)
//返回李四
console.log(name.value) //與 reactive 對象不同的是,當 ref 作為響應式數組或原生集合類型 (如 Map) 中的元素被訪問時,它不會被解包:
const books = reactive([ref('Vue 3 Guide')])
// 這里需要 .value
console.log(books[0].value)const map = reactive(new Map([['count', ref(0)]]))
// 這里需要 .value
console.log(map.get('count').value)

就是有時候需要寫.value,有時候不需要,在ref對象被當作一個對象傳入時候是自動解包的,他在其他對象里面則無法自動解包

???關注公眾號:資小庫,問題快速答疑解惑

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

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

相關文章

關于Autowired

Autowired 是 Spring Framework 中的一個注解&#xff0c;用于自動注入依賴對象。通過這個注解&#xff0c;Spring 可以自動將匹配的 bean 注入到所需的類中&#xff0c;從而實現控制反轉&#xff08;IoC&#xff09;和依賴注入&#xff08;DI&#xff09;。 基本用法 Autowi…

javascript: void(0);用法和常見問題

在JavaScript中&#xff0c;void(0)是一個表達式&#xff0c;它用來獲取一個特殊的值undefined&#xff0c;并且執行一個沒有返回值的操作。這個表達式經常用于創建一個沒有實際返回值的函數調用&#xff0c;或者在需要一個表達式的地方使用&#xff0c;但不希望有任何返回值。…

【Carsim】Carsim2019與Matlab2015b聯合仿真測試

&#x1f60f;★,:.☆(&#xffe3;▽&#xffe3;)/$:.★ &#x1f60f; 這篇文章主要介紹Carsim2019與Matlab2015b聯合仿真測試。 學其所用&#xff0c;用其所學。——梁啟超 歡迎來到我的博客&#xff0c;一起學習&#xff0c;共同進步。 喜歡的朋友可以關注一下&#xff0c…

HTML基礎知識學習指南

HTML基礎知識學習指南 1. 介紹 HTML&#xff08;超文本標記語言&#xff09;是構建網頁的基礎。它是一種標記語言&#xff0c;用于定義網頁的內容和結構。HTML由一系列元素組成&#xff0c;這些元素使用標簽來表示。 2. HTML文檔結構 HTML文檔的基本結構包括以下部分&#…

AI作畫工具深度剖析:Midjourney vs. Stable Diffusion (SD)

在人工智能技術的推動下&#xff0c;藝術創作的邊界被不斷拓寬&#xff0c;AI作畫工具成為數字藝術家與創意人士的新寵。其中&#xff0c;Midjourney與Stable Diffusion&#xff08;SD&#xff09;作為當前領域的佼佼者&#xff0c;以其獨特的算法機制、豐富的功能特性及高質量…

python-糖果俱樂部(賽氪OJ)

[題目描述] 為了慶祝“華為杯”的舉辦&#xff0c;校園中開展了許多有趣的熱身小活動。小理聽到這個消息非常激動&#xff0c;他趕忙去參加了糖果俱樂部的活動。 該活動的規則是這樣的&#xff1a;攤位上有 n 堆糖果&#xff0c;第 i 堆糖果有 ai? 個&#xff0c;參與的同學可…

面向工業化的多類電子元件自動計數系統測試報告

目錄 1、項目描述 2、登錄注冊測試 2、主界面測試 2.1、在線計數測試 2.2、離線計數測試 2.3、瀏覽數據測試 1、項目描述 該系統利用機器視覺平臺采集電子元件圖像&#xff0c;設計并實現了適應不同形態分布的電子元件計數模型&#xff0c;能夠快速且準確地進行計數和分類&…

0139__TCP協議

全網最詳細TCP參數講解&#xff0c;再也不用擔心沒有面試機會了_tcp的參數-CSDN博客 TCP協議詳解-騰訊云開發者社區-騰訊云 TCP-各種參數 - 簡書

【408考點之數據結構】樹形查找

樹形查找 樹形查找是利用樹這種數據結構進行查找操作的方法。樹形查找的主要優勢在于它能夠通過層次結構有效地組織數據&#xff0c;使得查找、插入和刪除操作都能夠高效進行。以下是對樹形查找的詳細總結。 1. 二叉查找樹&#xff08;Binary Search Tree, BST&#xff09; …

第4章:操作系統

第4章&#xff1a;操作系統 操作系統概述 進程管理 在有限的資源下&#xff0c;要保證系統不發生死鎖&#xff0c;則可以按這種邏輯來分析。首先給每個進程分配所需資源數減1個資源&#xff0c;然后系統還有1個資源&#xff0c;則不可能發生死鎖。 線程 存儲管理 虛擬存儲器的…

C++ //練習 14.22 定義賦值運算符的一個新版本,使得我們能把一個表示ISBN的string賦給一個Sales_data對象。

C Primer&#xff08;第5版&#xff09; 練習 14.22 練習 14.22 定義賦值運算符的一個新版本&#xff0c;使得我們能把一個表示ISBN的string賦給一個Sales_data對象。 環境&#xff1a;Linux Ubuntu&#xff08;云服務器&#xff09; 工具&#xff1a;vim 代碼塊 struct Sa…

全面講解GRASP原則

學習目標&#xff1a; 掌握GRASP 學習內容&#xff1a; GRASP&#xff08;General Responsibility Assignment Software Patterns&#xff0c;通用責任分配軟件模式&#xff09;原則是一組設計原則和模式&#xff0c;旨在幫助軟件設計人員合理地分配類和對象的責任。GRASP原則…

昇思25天學習打卡營第九天|使用靜態圖加速

背景 提供免費算力支持&#xff0c;有交流群有值班教師答疑的華為昇思訓練營進入第九天了。 今天是第九天&#xff0c;前八天的學習內容可以看鏈接 昇思25天學習打卡營第一天|快速入門 昇思25天學習打卡營第二天|張量 Tensor 昇思25天學習打卡營第三天|數據集Dataset 昇思25天…

高效的向量搜索算法——分層可導航小世界圖(HNSW)

最近在接觸大模型相關內容&#xff0c;發現一種高效的向量搜索算法HNSW&#xff0c;這里做一下記錄。 在之前自己也接觸過一段時間的復雜網絡&#xff08;網絡科學&#xff09;&#xff0c;沒想到&#xff0c;將網絡科學的思想引入到向量搜索算法中&#xff0c;可以產生令人眼前…

如何實現公網環境遠程連接本地局域網寶塔FTP服務遠程管理文件

文章目錄 前言1. Linux安裝Cpolar2. 創建FTP公網地址3. 寶塔FTP服務設置4. FTP服務遠程連接小結 5. 固定FTP公網地址6. 固定FTP地址連接 &#x1f4a1;推薦 前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。…

Python28-5 k-means算法

k-means 算法介紹 k-means 算法是一種經典的聚類算法&#xff0c;其目的是將數據集分成 ( k ) 個不同的簇&#xff0c;每個簇內的數據點盡可能接近。算法的基本思想是通過反復迭代優化簇中心的位置&#xff0c;使得每個簇內的點與簇中心的距離之和最小。k-means 算法的具體步驟…

S7-1500軸工藝對象105報文安裝(硬件目錄的支持包 HSP)

S7-1500PLC里硬件組態沒法組態到105報文是因為對應的HSP文件沒有安裝&#xff0c;首先需要安裝對應的HSP文件。 1、HSP文件安裝 V19版本的HSP安裝鏈接如下 https://download.csdn.net/download/m0_46143730/89503735 2、安裝HSP文件 3、需要將博途軟件關閉才能完成安裝 4、拖…

貓頭虎博主全棧前沿AI技術領域矩陣社群

貓頭虎博主全棧前沿AI技術領域矩陣社群 &#x1f44b;大家好&#xff0c;我是貓頭虎&#xff01;今天我要向大家介紹一個非常重要的社群矩陣——專為全棧前沿AI技術領域的朋友們打造的各種技術交流和資源互助的社群。這些社群不僅能幫助大家快速提升技術水平&#xff0c;還能拓…

Java中的行為驅動開發(BDD)實踐

Java中的行為驅動開發&#xff08;BDD&#xff09;實踐 大家好&#xff0c;我是免費搭建查券返利機器人省錢賺傭金就用微賺淘客系統3.0的小編&#xff0c;也是冬天不穿秋褲&#xff0c;天冷也要風度的程序猿&#xff01;今天我們將深入探討Java中的行為驅動開發&#xff08;BD…

【MySQL備份】Percona XtraBackup全量備份實戰篇

目錄 1. 前言 2.準備工作 2.1.環境信息 2.2.創建備份目錄 2.3.配置/etc/my.cnf文件 2.4.授予root用戶BACKUP_ADMIN權限 3.全量備份 4.準備備份 5.數據恢復 6.總結 "實戰演練&#xff1a;利用Percona XtraBackup執行MySQL全量備份操作詳解" 1. 前言 本文…