Vue3中如何響應式解構 props

目錄

  • 1,前言
  • 2,解決
    • 2.1,利用插件,實現編譯時轉換
    • 2.2,toRef 和 toRefs

1,前言

Vue3 中為了保持響應性,始終需要以 props.x 的方式訪問這些 prop。這意味著不能夠解構 defineProps 的返回值,因為得到的變量將不是響應式的、也不會更新。

以下面的父子組件為例:

父組件

<template><Children :count="count" />
</template><script setup>
import { ref, reactive } from "vue";
import Children from "./components/Children.vue";
const count = ref(0);
</script>

子組件

<template><div>{{ count }}</div>
</template><script setup>
const props = defineProps({count: Number,
});let { count } = props;
count++;
console.log(props.count); // 0,并不會發生變化 
</script>

2,解決

2.1,利用插件,實現編譯時轉換

原本 Vue3 是支持的 reactivity-transform,后來廢棄了。但是可以通過 Vue Macros 插件 來實現,用法如下:

1,安裝插件,并在 vite 中配置。

npm i -D @vue-macros/reactivity-transform
// vite.config.js
import ReactivityTransform from '@vue-macros/reactivity-transform/vite'export default defineConfig({plugins: [ReactivityTransform()],
})

2,會在組件中自動生效。

<template><div>{{ msg }}</div><div>{{ count }}</div>
</template><script setup>
import { watchEffect } from "vue";
const { msg, count } = defineProps({msg: String,count: Number,
});watchEffect(() => {// 會在 props 變化時打印console.log(msg, count);
});
</script>

3,原理

先通過 vite-plugin-inspect 插件 來查看插件的中間狀態。

npm i -D vite-plugin-inspect

完整配置

// vite.config.js
import { defineConfig } from "vite";
import vue from "@vitejs/plugin-vue";
import ReactivityTransform from "@vue-macros/reactivity-transform/vite";
import Inspect from "vite-plugin-inspect";export default defineConfig({plugins: [vue(), ReactivityTransform(), Inspect()],
});

本地啟動后,訪問 http://localhost:5173/__inspect/ 可檢查項目的模塊和棧信息。

在這里插入圖片描述

可以看到是做了轉換,通過 __props 來訪問自然是響應式的。

watchEffect(() => {console.log(msg, count);
});
watchEffect(() => {console.log(__props.msg, __props.count);
});

問題來了,這個 __props 是什么?

我們再看下 @vitejs/plugin-vue 這個插件的做了什么:會發現編譯單文件組件后,setup 變為函數,其中一個參數就是 __props ,也就是傳入的 props。

在這里插入圖片描述

所以,我們在 vue 單文件中,也可以直接使用 __props 并不會報錯。

2.2,toRef 和 toRefs

toRef,基于響應式對象上的一個屬性,創建一個對應的 ref,這個 ref 與其源屬性保持同步:改變源屬性的值將更新 ref 的值。

toRefs,將一個響應式對象轉換為一個普通對象,這個普通對象的每個屬性都是指向源對象相應屬性的 ref。每個單獨的 ref 都是使用 toRef() 創建的。

所以,可以這樣做:

<template><div>{{ _msg }}</div><div>{{ msg }}</div><div>{{ count }}</div>
</template><script setup>
import { toRef, toRefs } from "vue";
const props = defineProps({msg: String,count: Number,
});// _msg 也是響應式的,會隨著 props.msg 改變。
const _msg = toRef(props, "msg");// msg, count也是響應式的,會隨著 props 改變。
const { msg, count } = toRefs(props);
</script>

以上。

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

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

相關文章

Navicat 技術指引 | 適用于 GaussDB 的數據遷移工具

Navicat Premium&#xff08;16.2.8 Windows版或以上&#xff09; 已支持對 GaussDB 主備版的管理和開發功能。它不僅具備輕松、便捷的可視化數據查看和編輯功能&#xff0c;還提供強大的高階功能&#xff08;如模型、結構同步、協同合作、數據遷移等&#xff09;&#xff0c;這…

Cesium 展示——地球以及渲染數據導出(下載)為圖片或 pdf

文章目錄 需求分析新加需求分析第一種方式第二種方式需求 將 Cesium 球體以及渲染數據導出為 jpg/png/pdf 分析 獲取場景 scene 信息,轉為image 的 octet-stream 流 進行下載為圖片 /*** @todo canvas 導出圖片* @param {string} dataurl - 地址* @return {Blob}*/ functio…

Failed to resolve import “@/..“ from “src/...“ @找不到路徑

安裝path npm install --save-dev types/node再修改 vite.config.ts 中的配置即可 import { defineConfig } from "vite" import react from "vitejs/plugin-react"import path from "path" // 需安裝此模塊// https://vitejs.dev/config/ expo…

設備健康管理平臺助力鋰電企業實現可持續發展

隨著鋰電池產業的快速發展&#xff0c;設備的穩定運行和精準維護對于鋰電企業來說至關重要。傳統的設備維護方式在效率和全面性方面存在局限&#xff0c;無法滿足鋰電行業對設備管理的需求。然而&#xff0c;通過設備健康管理平臺的引入&#xff0c;鋰電企業現在可以充分發揮其…

XSLVGL2.0 User Manual 頁面管理器(v2.0)

XSLVGL2.0 開發手冊 XSLVGL2.0 User Manual 頁面管理器 1、概述2、特性3、APIs3.1、xs_page_init3.2、xs_page_wait_inited3.3、xs_page_exit3.4、xs_page_acquire3.5、xs_page_release3.6、xs_page_set_bootlogo3.7、xs_page_setup_clear_finish3.8、xs_page_setup_is_finish…

【LeetCode:1410. HTML 實體解析器 | 模擬+哈希表+字符串+庫函數】

&#x1f680; 算法題 &#x1f680; &#x1f332; 算法刷題專欄 | 面試必備算法 | 面試高頻算法 &#x1f340; &#x1f332; 越難的東西,越要努力堅持&#xff0c;因為它具有很高的價值&#xff0c;算法就是這樣? &#x1f332; 作者簡介&#xff1a;碩風和煒&#xff0c;…

【C語言】中,輸入一個數組,實現將輸入的n個數字按照從大到小的順序輸出。【通俗簡單易懂】

本篇文章中&#xff0c;我們將講述在C語言中&#xff0c;輸入一個數組&#xff0c;如何用for循環實現將輸入的n個數字按照從大到小輸出。 一.定義數組并初始化 首先&#xff0c;我們定義一個整形的數組并將其初始化。輸入n&#xff0c;來決定數組中整數的個數。 然后用for循…

通過HTML網頁對mysql數據庫進行增刪改查(CRUD實例)

首先我們得了解一下大致的架構 ,如下: 我們采用自底向上的方式進行開發, 一、先寫mysql數據庫 二、再寫java后端(Spring MVC架構)(這個是什么東西不懂不要緊,跟著步驟做就行了) 三、最后寫前端頁面(HTML) 一、 Mysql數據庫部分 我們要通過網頁對數據庫進行開發&#xff0c;…

解決:Gitee + PicGo配置圖床失敗

解決&#xff1a;Gitee PicGo配置圖床失敗 PicGo安裝插件的時候選擇&#xff1a;gitee-uploader&#xff0c;不要選擇gitee&#xff01; 在Gitee新建的圖床倉庫中設置一個images文件夾&#xff0c;用來保存上傳的圖片&#xff0c;但是要注意在PicGo中的path中要寫上路徑/img…

數據庫基礎入門 — SQL運算符

我是南城余&#xff01;阿里云開發者平臺專家博士證書獲得者&#xff01; 歡迎關注我的博客&#xff01;一同成長&#xff01; 一名從事運維開發的worker&#xff0c;記錄分享學習。 專注于AI&#xff0c;運維開發&#xff0c;windows Linux 系統領域的分享&#xff01; 本…

linux的基礎命令

文章目錄 linux的基礎命令一、linux的目錄結構&#xff08;一&#xff09;Linux路徑的描述方式 二、Linux命令入門&#xff08;一&#xff09;Linux命令基礎格式 三、ls命令&#xff08;一&#xff09;HOME目錄和工作目錄&#xff08;二&#xff09;ls命令的參數1.ls命令的-a選…

基于yolov2深度學習網絡的喝水行為檢測系統matlab仿真

目錄 1.算法運行效果圖預覽 2.算法運行軟件版本 3.部分核心程序 4.算法理論概述 4.1、YOLOv2網絡原理 4.2、基于YOLOv2的喝水行為檢測 5.算法完整程序工程 1.算法運行效果圖預覽 2.算法運行軟件版本 matlab2022a 3.部分核心程序 clc; clear; close all; warning off;…

PPT思維導圖怎么做?這2個思維導圖工具墻裂推薦!

在日常學習和工作中&#xff0c;我們常常會面臨需要處理大量信息的情況&#xff0c;這時候&#xff0c;一種叫做思維導圖的工具可能會成為你的救星。 不同于傳統的線性記錄方式&#xff0c;思維導圖以其獨特的視覺表現力和結構化的信息處理方式&#xff0c;使得人們能夠更加有…

Flutter學習(四)如何取消listview的越界效果

背景 在flutter的開發過程中&#xff0c;ListView是很常見的一個組件&#xff0c;但是&#xff0c;由于ListView的某些自帶的體驗&#xff0c;導致不太好的用戶體驗。例如ListView中&#xff0c;滑動到頂部或者底部的時候&#xff0c;再次滑動&#xff0c;會有越界的效果&…

同步和異步

同步和異步是處理任務時的兩種不同方式。 同步是指一個進程在執行某個請求的時候&#xff0c;如果該請求需要一段時間才能返回信息&#xff0c;那么這個進程會一直等待下去&#xff0c;直到收到返回信息才繼續執行下去。這種方式下&#xff0c;任務是按照順序一個一個執行的&am…

2023年亞太地區數學建模大賽 問題A

采果機器人的圖像識別技術 中國是世界上最大的蘋果生產國&#xff0c;年產量約為3500萬噸。與此同時&#xff0c;中國也是世界上最大的蘋果出口國&#xff0c;全球每兩個蘋果中就有一個&#xff0c;全球超過六分之一的蘋果出口自中國。中國提出了一帶一路倡議&#xff08;BRI&…

Cache學習(2):Cache結構 命中與缺失 多級Cache結構 直接映射緩存

1 Cache名詞解釋 命中&#xff08;hit&#xff09;&#xff1a; CPU要訪問的數據在Cache中有緩存缺失&#xff08;miss&#xff09;&#xff1a; CPU要訪問的數據在Cache中沒有緩存Cache Size&#xff1a;Cache的大小&#xff0c;代表Cache可以緩存最大數據的大小Cache Line&a…

快速在WIN11中本地部署chatGLM3

具體請看智譜倉庫github&#xff1a;GitHub - THUDM/ChatGLM3: ChatGLM3 series: Open Bilingual Chat LLMs | 開源雙語對話語言模型 或者Huggingface:https://huggingface.co/THUDM/chatglm3-6b 1. 利用Anaconda建立一個虛擬環境&#xff1a; conda create -n chatglm3 pyt…

2023全球數字貿易創新大賽-人工智能元宇宙-11-12,數據二十條,數字產業化和產業數字化

目錄 長沙千博信息技術有限公司-手語翻譯 數據二十條 數字產業化和產業數字化

java--static的應用知識:單例設計模式

1.什么是設計模式(Design pattern) ①一個問題通常有n中解法&#xff0c;其中肯定有一種解法最優的&#xff0c;這個最優的解法被人總結出來了&#xff0c;稱之為設計模式。 ②設計模式有20多種&#xff0c;對應20多種軟件開發中會遇到的問題。 2.單例設計模式 確保一個類只…