vue-22(理解組合式 API:setup、ref、reactive)

Vue.js 中的組合式 API 代表了我們構建和組織組件方式的重大轉變。它為傳統的選項式 API 提供了一種更靈活、更強大的替代方案,尤其適用于復雜的應用程序。本章將深入探討組合式 API 的核心概念:setup函數、refreactive,為你構建更可維護、更可重用的 Vue 組件打下堅實的基礎。我們將探索這些元素如何協同工作,以實現更功能化、更可組合的組件邏輯。

理解?setup?函數

setup?函數是 Vue 組件中使用 Composition API 的入口點。它用于定義響應式數據、計算屬性、方法和生命周期鉤子。與 Options API 不同,在 Options API 中這些元素定義在組件定義的單獨部分中,而?setup?函數允許你以更邏輯和連貫的方式組織它們。

setup?的作用

setup?函數充當組件模板與其底層邏輯之間的橋梁。它在組件創建?之前?執行,并提供對組件的?props?和?context?的訪問。setup?函數必須返回一個包含你希望提供給模板的數據、方法和計算屬性的對象。

示例:基本的?setup?函數

import { ref } from 'vue';export default {props: {initialCount: {type: Number,default: 0}},setup(props, context) {// 使用“ref”創建一個反應變量const count = ref(props.initialCount);// 定義一個方法來增加計數const increment = () => {count.value++;};// 將反應變量和方法暴露給模板return {count,increment};},template: `<div><p>Count: {{ count }}</p><button @click="increment">Increment</button></div>`
};

在這個例子中:

  • 我們從 Vue 導入?ref?函數。
  • setup?函數接收?props?和?context?作為參數。
  • 我們使用?ref?創建一個響應式變量?count,并使用?initialCount?prop 的值進行初始化。
  • 我們定義一個方法?increment,用于增加?count?的值。注意,我們通過?.value?訪問?ref?的值。
  • 我們返回一個包含?count?和?increment?的對象,使其在模板中可用。
  • 模板顯示?count?的當前值,并提供一個按鈕來增加它。

setup?參數:props?和?context

setup?函數接收兩個參數:

  • props: 一個包含組件屬性的對象。需要注意的是,props?對象是響應式的。如果父組件更新了屬性,setup?中的?props?對象將自動更新。
  • context: 一個提供訪問組件上下文的對象。它暴露了三個屬性:
    • attrs: 一個包含組件非屬性屬性的對象(相當于 Options API 中的?$attrs)。
    • slots: 一個包含組件插槽的對象(相當于 Options API 中的?$slots)。
    • emit: 一個允許你從組件中發出自定義事件的函數(在選項 API 中相當于?$emit)。

示例:使用?context.emit

import { ref } from 'vue';export default {setup(props, context) {const count = ref(0);const increment = () => {count.value++;// Emit a custom event when the count is incrementedcontext.emit('increment', count.value);};return {count,increment};},template: `<div><p>Count: {{ count }}</p><button @click="increment">Increment</button></div>`
};

在這個例子中,我們使用?context.emit?來在每次調用?increment?方法時發出一個名為?increment?的自定義事件。事件負載是?count?的新值。

ref: 創建響應式引用

ref?函數是 Composition API 的核心部分。它允許你創建對基本值(數字、字符串、布爾值)和復雜數據類型(對象、數組)的響應式引用。當?ref?的值發生變化時,Vue 會自動更新 DOM 以反映新值。

如何?ref?工作

ref?函數接受一個參數:引用的初始值。它返回一個具有?.value?屬性的對象,該屬性保存當前值。訪問或修改?ref?的值需要使用?.value?屬性。

示例:使用?ref?與原始值

import { ref } from 'vue';export default {setup() {const message = ref('Hello, Vue!');const updateMessage = () => {message.value = 'Goodbye, Vue!';};return {message,updateMessage};},template: `<div><p>{{ message }}</p><button @click="updateMessage">Update Message</button></div>`
};

在這個例子中:

  • 我們創建一個名為?ref?的?message,初始值為"Hello, Vue!"。
  • 我們定義一個名為?updateMessage?的方法,該方法將?message?的值更改為"Goodbye, Vue!"。
  • 模板顯示?message?的當前值。當按鈕被點擊時,updateMessage?被調用,模板會自動更新以顯示新消息。

示例:使用?ref?與復雜數據類型

import { ref } from 'vue';export default {setup() {const user = ref({name: 'John Doe',age: 30});const updateUser = () => {user.value.name = 'Jane Doe';user.value.age = 25;};return {user,updateUser};},template: `<div><p>Name: {{ user.name }}</p><p>Age: {{ user.age }}</p><button @click="updateUser">Update User</button></div>`
};

在這個例子中:

  • 我們創建一個名為?ref?的?user?引用,其初始值是一個包含?name?和?age?屬性的對象。
  • 我們定義一個名為?updateUser?的方法,用于更新?user?對象中的?name?和?age?屬性。
  • 模板顯示?user?對象的?name?和?age?屬性。當按鈕被點擊時,調用?updateUser,模板會自動更新以顯示新的用戶信息。

何時使用?ref

使用?ref?當你需要創建一個單一值的響應式引用,無論是基本類型還是復雜的數據類型。當你需要跟蹤組件中單個值的變化時,它特別有用。

reactive: 創建響應式對象

reactive?函數是 Composition API 的另一個重要部分。它允許你創建響應式對象。與?ref?不同,ref?創建一個值的響應式?引用?,reactive?創建一個響應式的?對象?。響應式對象屬性的變化會被 Vue 自動跟蹤,并且 DOM 會相應更新。

reactive?的工作原理

reactive?函數接受一個普通的 JavaScript 對象作為參數,并返回該對象的響應式代理。然后你可以直接訪問和修改響應式對象的屬性,而無需像使用?ref?那樣使用?.value?屬性。

示例:使用?reactive

import { reactive } from 'vue';export default {setup() {const state = reactive({name: 'John Doe',age: 30});const updateState = () => {state.name = 'Jane Doe';state.age = 25;};return {state,updateState};},template: `<div><p>Name: {{ state.name }}</p><p>Age: {{ state.age }}</p><button @click="updateState">Update State</button></div>`
};

在這個例子中:

  • 我們使用?reactive?函數創建一個響應式對象?state
  • 我們定義一個方法?updateState,用于更新?state?對象的?name?和?age?屬性。
  • 模板顯示?state?對象的?name?和?age?屬性。當按鈕被點擊時,調用?updateState,模板會自動更新以顯示新的狀態信息。

深度響應式

reactive?函數提供深度響應式功能。這意味著在響應式對象中的嵌套屬性的變化也會被 Vue 跟蹤。

示例:深度響應式

import { reactive } from 'vue';export default {setup() {const state = reactive({user: {name: 'John Doe',address: {city: 'New York'}}});const updateCity = () => {state.user.address.city = 'Los Angeles';};return {state,updateCity};},template: `<div><p>Name: {{ state.user.name }}</p><p>City: {{ state.user.address.city }}</p><button @click="updateCity">Update City</button></div>`
};

在這個例子中,即使?city?是?state?對象中的嵌套屬性,對它的修改仍然會被 Vue 追蹤,并且模板會相應地更新。

reactive?的局限性

  • 僅適用于對象:?reactive?函數僅適用于普通的 JavaScript 對象。它不能用于數字、字符串或布爾值等原始值。對于這些值,你應該使用?ref

  • 重新賦值導致的響應性丟失:?如果你重新賦值一個響應式對象,你會丟失響應性。例如:

    import { reactive } from 'vue';export default {setup() {const state = reactive({ count: 0 });const resetState = () => {// Reactivity is lost here!state = { count: 0 };};return { state, resetState };},template: '<button @click="resetState">Reset</button>'
    };
    

    在這種情況下,state?在重新賦值后不再具有響應性。為了避免這種情況,始終修改響應式對象的屬性,而不是重新賦值對象本身。

何時使用?reactive

當你需要創建具有多個屬性的反應式對象時,使用?reactive。當你有一個復雜的數據結構需要追蹤變化時,它特別有用。

ref?與?reactive:選擇合適的工具

ref?和?reactive?都用于在 Composition API 中創建反應式數據,但它們有不同的使用場景。以下是它們的主要區別總結:

特性refreactive
數據類型可與原始類型和對象一起使用僅適用于對象
訪問值使用?.value?來訪問/修改直接訪問/修改屬性
響應性創建一個響應式_引用_創建一個響應式_對象_
用例單個值、基本類型具有多個屬性的對象

一般來說,使用?ref?表示單個值和基本類型,使用?reactive?表示具有多個屬性的對象。

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

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

相關文章

【Golang玩轉MCP】-實現一個加減乘除MCP服務

文章目錄 概要1 首先創建一個MCP服務器2 添加MCP工具如何測試我們的MCP服務功能是否正常呢小結 概要 今天我們使用golang簡單實現一個加減乘除MCP服務 1 首先創建一個MCP服務器 s : server.NewMCPServer("Hello World Server","1.0.0",server.WithToolCa…

計算機網絡期末 網絡基礎概述

目錄 網絡的定義歷史發展(了解) 網絡的分類&#xff0c;功能和應用(熟悉) 網絡的組成與結構(理解) 網絡的 OSI 七層參考模型(熟悉) 網絡的 TCP/IP 四次模型(理解) 網絡有關性能指標(掌握) 網絡的定義歷史發展(了解) 計算機網絡是什么 四個階段 總結 網絡 互連網 因特網的…

SwiftUI學習筆記day4: Lecture 4 | Stanford CS193p 2023

Lecture 4 | Stanford CS193p 2023 課程鏈接&#xff1a;https://www.youtube.com/watch?v4CkEVfdqjLw 代碼倉庫&#xff1a;iOS 課程大綱&#xff1a; 簡要課程大綱&#xff1a;SwiftUI 高級主題 Swift 訪問控制&#xff08;Access Control&#xff09; 5 個級別&#xff1…

Docker 高級管理——容器通信技術與數據持久化

目錄 一、Docker 容器的網絡模式 1. Bridge 模式 2. Host 模式 3. Container 模式 4. None 模式 5. Overlay 模式 6. Macvlan 模式 7. 自定義網絡模式 二、端口映射 1. 端口映射 2. 隨機映射端口 3. 指定映射端口 &#xff08;1&#xff09;固定端口 &#xff08;…

git操作案例 -設置遠程分支,并提交到新遠程新分支

文章目錄 前言一、分析當前的問題二、修改遠程倉庫地址&#xff08;一&#xff09;修改遠程倉庫地址場景 現有保留遠程分支場景替換現有遠程分支 二、 找回已經提交的文件場景&#xff1a;提交后&#xff0c;代碼在本地倉庫但未推送 三、同步遠程分支四、提交到新遠程的新分支 …

mysql一張表,其中一個字段設置了唯一索引,又設置了普通索引,查詢的時候很慢,沒有走普通索引,是const

問題分析 在 MySQL 中&#xff0c;當一個字段同時存在唯一索引和普通索引時&#xff0c;查詢優化器通常會優先選擇最嚴格的索引&#xff08;即能最快縮小結果集的索引&#xff09;。在你的場景中&#xff0c;優化器選擇了唯一索引并將查詢視為const類型&#xff0c;這通常是高…

ARCGIS國土超級工具集1.6更新說明

ARCGIS國土超級工具集V1.6版本&#xff0c;功能已增加至60 個。本次更新在V1.5版本的基礎上&#xff0c;除修復了使用時發現的若干小問題外&#xff0c;還更新及新增了若干工具。其中勘測定界工具欄更新了界址點西北角重排工具&#xff0c;新增了提示圖斑起始點、指定圖斑起始點…

零基礎學習RabbitMQ(2)--Linux安裝RabbitMQ

注意&#xff1a;這里使用的是ubuntu系統 1. 安裝Erlang RabbitMQ需要Erlang語言的支持&#xff0c;在安裝rabbitMQ之前需要安裝Erlang #更新軟件包 sudo apt-get update #安裝erlang sudo apt-get install erlang 安裝后輸入 rel可查看Erlang版本&#xff1a; 輸入halt().…

Centos進單用戶模式

一、開機按E 二、修改里面的linux行 把ro 修改成rw init/sysroot/bin/sh 修改前&#xff1a; 修改后&#xff1a; 三、ctrl x退出&#xff0c;進入單用戶模式

RabbitMQ 的工作流程

RabbitMQ 是一個消息中間件&#xff0c;實現了生產者消費者模型&#xff0c;可以用來接收、存儲、轉發消息。 專有名詞介紹 要了解 RabbitMQ 的工作流程&#xff0c;我們需要先了解下面幾個關鍵詞&#xff1a; 1、Producer 生產者&#xff0c;即向 RabbitMQ 發送消息。 2…

HTTP——不同版本區別

目錄 HTTP1.0和HTTP1.1的區別 HTTP1.1相比HTTP1.0性能上的改進&#xff1a; 但是HTTP1.1還是有性能瓶頸&#xff1a; HTTP/2做了什么優化&#xff1f; HTTP/3的優點 HTTP與HTTPS的區別 HTTPS的工作原理 1.ClientHello 2.ServerHello 3.客戶端回應 4.服務器的最后回應…

關于M0+芯片的IAP應用導致延時不準確解釋

前言&#xff1a;在給項目中使用的M0芯片做IAP功能時一切一切都是那么的自然水到渠成&#xff0c;但是筆者在實現完IAP功能后&#xff0c;卻發現APP端掛載的單總線功能崩潰了&#xff0c;最開始沒有懷疑是bootload導致的。因為筆者在使用同一篇代碼的時候單總線掛載的設備不同&…

安卓登錄學習筆記

1. 背景與目標 (Background and Goal) 背景: 我們要創建一個用戶登錄界面。用戶輸入用戶名和密碼&#xff0c;點擊“登錄”按鈕。應用會顯示一個加載中的“圈圈”&#xff08;ProgressBar&#xff09;&#xff0c;然后模擬一個耗時2秒的網絡請求。根據請求結果&#xff0c;界面…

Git(三):分支管理

文章目錄 Git(三)&#xff1a;分支管理理解分支創建分支切換分支合并分支刪除分支合并沖突分支管理策略分支策略Bug分支刪除臨時分支 Git(三)&#xff1a;分支管理 理解分支 本章介紹Git的殺手級功能之一&#xff1a;分支 分支就 是科幻電影里面的平行宇宙&#xff0c;當你正…

電子電氣架構 --- 電氣架構基礎(汽車電子)

我是穿拖鞋的漢子,魔都中堅持長期主義的汽車電子工程師。 老規矩,分享一段喜歡的文字,避免自己成為高知識低文化的工程師: 做到欲望極簡,了解自己的真實欲望,不受外在潮流的影響,不盲從,不跟風。把自己的精力全部用在自己。一是去掉多余,凡事找規律,基礎是誠信;二是…

RestClient 功能介紹、完整使用示例演示, 和RestTemplate、WebClient 對比

RestClient功能介紹 RestClient是Spring Framework 6.1版本引入的同步HTTP客戶端&#xff0c;旨在替代老舊的RestTemplate&#xff0c;提供更現代、流暢的API設計。其核心特點包括&#xff1a; 流暢API&#xff08;Fluent API&#xff09;&#xff1a; 支持鏈式調用&#xff0…

VM經常遇見的運行慢幾種情況、以及設置方法

大家好,我是東哥說-MES 啟動虛擬機是提示如下內容 “無法打開內核設備“\.\VMCIDev\VMX”: 操作成功完成。是否在安裝 VMware Workstation 后重新引導? 模塊“DevicePowerOn”啟動失敗。 未能啟動虛擬機。” 2.用記事本打開安裝目錄下TIA Portal STEP7 Prof Safety WinCC …

【C++語法】類和對象(4)——日期類和const成員函數

6.類和對象&#xff08;4&#xff09; 文章目錄 6.類和對象&#xff08;4&#xff09;回顧簡單日期類的實現代碼補充&#xff1a;前置與后置的重載區別補充&#xff1a;關于流插入運算符&#xff08;<<&#xff09;的解釋拓展&#xff1a;仿照流插入操作符(<<)的作…

當凌晨的鍵盤聲,遇見黎明的星光?

地鐵玻璃映出你困倦的臉&#xff0c;耳機里的音樂循環到第 17 遍&#xff0c;早高峰的人群像沙丁魚罐頭般擠壓著你。這是你每天雷打不動的三小時通勤路&#xff0c;從城市邊緣到寫字樓林立的 CBD&#xff0c;窗外的風景換了四季&#xff0c;而你始終困在搖晃的車廂里&#xff0…

Web Worker技術詳解與應用場景

我們來詳細探討一下 Web Worker。它是現代 Web 開發中解決 JavaScript 單線程限制、提升應用性能和響應能力的關鍵技術。 核心問題&#xff1a;JavaScript 的單線程模型 瀏覽器 UI 線程&#xff08;主線程&#xff09;&#xff1a;JavaScript 在瀏覽器中默認運行在單個線程&a…