Vue 模板語句的數據來源

🧩 Vue 模板語句的數據來源:全方位解析

Vue 模板(<template> 部分)中的表達式、指令綁定(如 v-bind, v-on)和插值({{ }}都在一個特定的作用域內求值。這個作用域由當前 組件實例 提供的上下文決定。

以下是模板可以訪問的主要數據來源(按優先級和作用域排序):

🎯 1. 組件實例自身的狀態與邏輯 (最高優先級)
  • 來源:組件通過 data, computed, methods, props, setup() 返回值 (<script setup> 的頂層綁定) 等定義。
  • 訪問方式:直接在模板中使用定義的名稱。
  • 示例
    <script setup>
    // Composition API (<script setup>)
    import { ref, computed } from 'vue';const count = ref(0); // 響應式數據 (來源 1a)
    const doubleCount = computed(() => count.value * 2); // 計算屬性 (來源 1b)function increment() { // 方法 (來源 1c)count.value++;
    }
    </script><template><button @click="increment">Count is: {{ count }}</button> <!-- 訪問 ref --><p>Double: {{ doubleCount }}</p> <!-- 訪問 computed -->
    </template>
    
    <script>
    // Options API
    export default {data() { // 數據 (來源 1a)return { message: 'Hello!' };},computed: { // 計算屬性 (來源 1b)reversedMessage() {return this.message.split('').reverse().join('');}},methods: { // 方法 (來源 1c)shout() {this.message = this.message.toUpperCase() + '!';}},props: ['initialCount'] // Props (來源 1d)
    }
    </script><template><p>{{ message }}</p><p>Reversed: {{ reversedMessage }}</p><button @click="shout">SHOUT</button><p>Initial Count: {{ initialCount }}</p> <!-- 訪問 prop -->
    </template>
    
  • 關鍵點
    • data / ref/reactive:定義組件內部狀態。
    • computed:定義基于其他狀態派生的值。
    • methods:定義可調用的函數(通常用于事件處理或邏輯)。
    • props:接收來自父組件的數據(只讀)。
    • setup() 返回值 / <script setup> 頂層綁定:在 Composition API 中提供上述所有功能。
📦 2. 父組件傳遞的 Props
  • 來源:父組件通過屬性 (v-bind:) 傳遞給當前組件。
  • 訪問方式:在子組件中通過 props 選項聲明后,在模板中直接使用名稱訪問。
  • 示例 (Parent.vue):
    <template><ChildComponent :user="currentUser" :initial-value="10" />
    </template>
    
  • 示例 (ChildComponent.vue):
    <script setup>
    // Composition API (<script setup>)
    const props = defineProps({user: Object,initialValue: Number
    });
    </script><template><p>User: {{ user.name }}</p> <!-- 訪問 prop --><p>Starting point: {{ initialValue }}</p>
    </template>
    
    <script>
    // Options API
    export default {props: ['user', 'initialValue'] // 聲明 props
    }
    </script><template><p>User: {{ user.name }}</p><p>Starting point: {{ initialValue }}</p>
    </template>
    
  • 關鍵點
    • 只讀性:子組件不應該直接修改 props (Vue 會警告)。如果需要“修改”,應通過觸發事件讓父組件修改原始數據。
    • Prop 聲明:必須顯式聲明 (definePropsprops 選項) 才能訪問。
🪝 3. 組件注入的依賴 (Provide/Inject)
  • 來源:祖先組件通過 provide 提供的數據/方法。
  • 訪問方式:在需要使用的后代組件中通過 inject 獲取。
  • 示例 (祖先組件):
    <script setup>
    import { provide, ref } from 'vue';const theme = ref('dark');
    provide('appTheme', theme); // 提供 'appTheme' 鍵名及其值
    </script>
    
  • 示例 (后代組件):
    <script setup>
    import { inject } from 'vue';const injectedTheme = inject('appTheme'); // 注入 'appTheme'
    </script><template><div :class="`theme-${injectedTheme}`">...</div>
    </template>
    
  • 關鍵點
    • 跨層級通信:解決深層嵌套組件 props 逐層傳遞的繁瑣問題。
    • 非響應式默認:注入的值默認不是響應式的。如果提供的是 refreactive 對象,則注入后保持響應式連接
    • 慎用:會使組件間關系變得隱式,增加理解難度。優先考慮 props/emits 或狀態管理 (Pinia)。
📌 4. Vue 內置的全局對象與屬性 (謹慎使用)
  • 來源:Vue 在組件實例上暴露的一些特殊屬性(通常以 $ 開頭)。
  • 訪問方式:直接在模板中使用(例如 $attrs, $slots, $emit, $route, $store)。
  • 常見內置屬性
    • $attrs:包含父組件傳遞但未在 props 中聲明的所有屬性(常用于透傳)。
    • $slots:訪問組件接收的插槽內容。
    • $emit:觸發自定義事件(@my-event="handler" 對應 $emit('my-event'))。
    • $el (Options API):訪問組件根 DOM 元素(在 mounted 后可用,Composition API 通常用 ref 替代)。
    • $router / $route (Vue Router):訪問路由實例和當前路由信息(需安裝路由)。
    • $store (Vuex/Pinia):訪問狀態管理庫的 Store(需安裝狀態庫)。
  • 示例:
    <template><!-- 透傳所有未聲明屬性和事件到內部元素 --><input v-bind="$attrs" v-on="$listeners"> <!-- Vue 2 特有 $listeners --><button @click="$emit('save')">Save</button><p>Current Path: {{ $route.path }}</p>
    </template>
    
  • 關鍵點
    • 特定庫依賴$router, $route, $store 等需要對應的插件 (vue-router, pinia/vuex) 安裝并注冊到應用。
    • 避免濫用:在模板中過度使用 $emit$route$store 可能使邏輯分散,復雜邏輯應盡量移到 <script> 部分。
🌍 5. 全局作用域 (有限訪問 / 通常避免)
  • 來源:瀏覽器全局對象 (window, document, console) 或全局定義的變量/函數。
  • 訪問方式
    • 受限:Vue 模板的執行上下文是沙盒化的不能直接訪問全局作用域(如 window, 全局 const myGlobal = ...)。
    • 間接訪問
      • 顯式掛載到組件實例 (不推薦污染組件實例):
        <script setup>
        import { onMounted } from 'vue';
        window.myGlobalFunction = () => { ... }; // 定義在 window 上
        </script>
        <template><button @click="window.myGlobalFunction()">Call Global</button> <!-- 直接訪問 window 屬性 -->
        </template>
        
      • 在組件邏輯中引用,然后暴露給模板 (推薦方式):
        <script setup>
        import { ref } from 'vue';
        // 在 <script> 中引用全局變量
        const globalValue = ref(window.someGlobalConfig);
        </script>
        <template><p>Config: {{ globalValue }}</p>
        </template>
        
  • 關鍵點
    • 強烈不推薦:直接在模板中訪問 window 或全局變量。這會:
      • 破壞組件的封裝性可移植性
      • 使代碼難以測試(依賴全局環境)。
      • 可能導致意外的命名沖突
    • 最佳實踐:將需要的全局信息在組件的 <script> 部分引入(如從配置模塊導入),然后作為組件自身的狀態或計算屬性暴露給模板。

🔍 數據訪問優先級與作用域鏈總結

當模板中使用一個名稱 (如 message) 時,Vue 會按以下順序查找其來源:

  1. 組件自身狀態/邏輯 (data/ref/reactive, computed, methods, props 聲明項, setup() 返回值/<script setup> 頂層綁定) ? 最高優先級
  2. 父組件傳遞的 props (需聲明)
  3. 注入的依賴 (inject) (需注入)
  4. Vue 內置實例屬性 ($attrs, $slots, $emit, $route 等)
  5. 全局作用域 (window, document) (需顯式訪問或間接引用,強烈不推薦直接使用)

? 重要規則:

  • 就近優先:如果局部定義了 count,就不會去訪問注入的或全局的同名變量。
  • Props 只讀:模板中不能直接修改 props (Vue 會警告)。
  • 作用域隔離:模板不能直接訪問其所在 <script> 標簽中定義的局部變量 (除非通過 setup() 返回或 <script setup> 頂層暴露)。例如:
    <script setup>
    const localVar = 'I am hidden'; // 局部變量,模板無法訪問!
    const publicVar = ref('I am visible'); // 頂層綁定,模板可以訪問
    </script>
    

🚫 為什么模板不能直接訪問全局變量?

Vue 有意將模板的執行環境與全局作用域隔離,主要為了:

  1. 避免命名沖突:防止全局變量意外覆蓋組件內部狀態或方法。
  2. 提高可預測性:模板中看到的名字一定來源于組件自身、props、注入或 Vue 內置屬性,代碼行為更清晰。
  3. 增強封裝性與可復用性:組件不依賴外部全局環境,更容易在不同項目或上下文中復用。
  4. 提升安全性:減少潛在的安全風險(如無意中暴露全局敏感數據)。

? 最佳實踐:清晰定義數據來源

  1. 優先使用組件自身狀態 (ref, reactive, data) 和 props:這是最清晰、最可維護的數據來源。
  2. 需要跨層級共享狀態時
    • 考慮 Provide/Inject (適用于有明確祖先/后代關系的特定數據)。
    • 更通用的場景使用 狀態管理庫 (Pinia)
  3. 需要訪問全局配置:在 <script> 中導入配置模塊或初始化時讀取全局對象,然后將其轉化為組件的響應式狀態 (ref, reactive) 或計算屬性 (computed) 暴露給模板。
  4. 避免在模板中直接使用 $route, $store 進行復雜邏輯:將相關邏輯移到 <script> 中的方法、計算屬性或 Composables 函數中,保持模板簡潔。
  5. 明確區分來源:使用清晰的命名約定(如 propspropXxx,注入用 injectedXxx)可以顯著提高代碼可讀性。

理解并正確管理模板的數據來源,是編寫 可維護、可預測、高性能 Vue 應用的基礎!

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

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

相關文章

全新AI驅動Workspace Security 套件發布!Fortinet 電子郵件安全產品矩陣升級

專注推動網絡與安全融合的全球性綜合網絡安全解決方案供應商 Fortinet&#xff08;NASDAQ&#xff1a;FTNT&#xff09;&#xff0c;近日宣布發布新一代企業級郵件安全解決方案FortiMail Workspace Security 安全套件&#xff0c;全面增強旗下數據和生產力安全產品組合&#xf…

二十、【用戶管理與權限 - 篇二】前端交互:實現用戶管理界面

【用戶管理與權限 - 篇二】前端交互:實現用戶管理界面 前言準備工作第一部分:更新并確認前端 API 服務第二部分:添加用戶管理頁面的路由和側邊欄入口第三部分:實現用戶列表頁面第四部分:實現用戶編輯對話框組件第五部分:全面測試總結前言 在上一篇《【用戶管理與權限 - …

LeetCode --- 452周賽

題目列表 3566. 等積子集的劃分方案 3567. 子矩陣的最小絕對差 3568. 清理教室的最少移動 3569. 分割數組后不同質數的最大數目 一、等積子集的劃分方案 由于本題的數據范圍不大&#xff0c;我們可以暴力枚舉所有可能的劃分方式&#xff0c;代碼如下 // C class Solution { …

使用Python提取照片元數據:方法與實戰指南

## 引言&#xff1a;元數據的重要性 照片元數據&#xff08;Metadata&#xff09;是嵌入在圖像文件中的隱藏信息&#xff0c;記錄了拍攝設備、時間、地理位置、光圈快門參數等關鍵數據。這些信息廣泛應用于**數字取證**、**照片管理**、**地理標記分析**和**版權驗證**等場景。…

使用docker在3臺服務器上搭建基于redis 6.x的一主兩從三臺均是哨兵模式

一、環境及版本說明 如果服務器已經安裝了docker,則忽略此步驟,如果沒有安裝,則可以按照一下方式安裝: 1. 在線安裝(有互聯網環境): 請看我這篇文章 傳送陣>> 點我查看 2. 離線安裝(內網環境):請看我這篇文章 傳送陣>> 點我查看 說明&#xff1a;假設每臺服務器已…

阿里云ACP云計算備考筆記 (5)——彈性伸縮

目錄 第一章 概述 第二章 彈性伸縮簡介 1、彈性伸縮 2、垂直伸縮 3、優勢 4、應用場景 ① 無規律的業務量波動 ② 有規律的業務量波動 ③ 無明顯業務量波動 ④ 混合型業務 ⑤ 消息通知 ⑥ 生命周期掛鉤 ⑦ 自定義方式 ⑧ 滾的升級 5、使用限制 第三章 主要定義 …

CANopen轉Modbus TCP轉換器助生產線智能化升級

在自動化工業控制領域&#xff0c;CANopen和Modbus TCP是兩種廣泛采用的通信協議。它們各自具有獨特的特點和優勢&#xff0c;但在某些應用場景中&#xff0c;需要設備能夠同時支持這兩種通信標準。這就需要一個能夠實現開疆智能CANopen轉Modbus TCP轉換的網關KJ-TCPC-CANP設備…

C++圖書管理

圖書館的書籍分類系統使用二進制標簽管理&#xff0c;0 代表兒童讀物&#xff0c;1 代表青少年書籍。管理員發現當前的書架排列中不允許出現青少年書籍之后連接兒童讀物的情況&#xff08;即 10 子串&#xff09;。管理員每次可以交換任意兩本書的位置。請計算讓書架符合規定所…

汽車免拆診斷案例 | 2010款捷豹XFL車制動警告燈、DSC警告燈異常點亮

故障現象  一輛2010款捷豹XFL車&#xff0c;搭載3.0 L發動機&#xff0c;累計行駛里程約為35萬km。車主反映&#xff0c;該車組合儀表上的制動警告燈、動態穩定控制系統&#xff08;DSC&#xff09;警告燈異常點亮&#xff08;圖1&#xff09;&#xff0c;且提示“DSC NOT AV…

el-upload組件,上傳文件失敗,:on-error方法失效

el-upload組件方法失效 問題原因解決 問題 使用el-upload組件上傳文件&#xff0c;有這么一個問題上傳文件處理報錯Excel、Word。org.apache.poi.openxml4j.exceptions.OLE2NotOfficeXmlFileException。 按上述&#xff0c;后端編寫完代碼&#xff0c;輸出正常&#xff0c;但…

可視化圖解算法50:最小的K個數

牛客網 面試筆試 TOP101 | LeetCode 面試題 17.14. 最小K個數 1. 題目 描述 給定一個長度為 n 的可能有重復值的數組&#xff0c;找出其中不去重的最小的 k 個數。例如數組元素是4,5,1,6,2,7,3,8這8個數字&#xff0c;則最小的4個數字是1,2,3,4(任意順序皆可)。 數…

Ragflow配置注意項

在 .env文件中啟用v.0.19.0版本&#xff0c;帶emabedding models RAGFLOW_IMAGEinfiniflow/ragflow:v0.19.0 RAGFlow image tagImage size (GB)Has embedding models?Stable?v0.19.0≈9??Stable releasev0.19.0-slim≈2?Stable releasenightly≈9??Unstable nightly b…

Word VBA快速制作填空題

實例需求&#xff1a;Word文檔用于英語單詞學習&#xff0c;重點記憶單詞標記下劃線&#xff0c;其內容如下圖所示。 現在文檔轉換為填空題&#xff08;無論單詞字符多少&#xff0c;填空部分統一使用10個空格&#xff09;和參考答案兩部分&#xff0c;如下圖所示。 示例代碼如…

不變性(Immutability)模式

1. 不變性&#xff08;Immutability&#xff09;模式 1.1. 不變性模式的概念 定義&#xff1a;對象一旦被創建&#xff0c;其內部狀態就不再發生變化&#xff0c;也即“只讀無寫”&#xff0c;不會出現并發寫的問題&#xff0c;自然線程安全。 適用場景&#xff1a;只讀共享…

探秘鴻蒙 HarmonyOS NEXT:鴻蒙定時器,簡單倒計時的場景應用

在鴻蒙 ArkTS 開發中&#xff0c;定時器是實現動態效果和定時任務的重要工具。基于鴻蒙 API 12 及以上版本&#xff0c;ArkTS 提供了功能豐富的定時器 API&#xff0c;本文將帶你全面了解定時器的使用方法。 一、定時器常用 API 介紹 ArkTS 中的定時器主要分為一次性定時器&a…

安卓基礎(語義樹)

進化1 package com.example.demotest.unread;import android.accessibilityservice.AccessibilityService; import android.content.res.Resources; import android.graphics.Rect; import android.util.DisplayMetrics; import android.util.Log; import android.view.access…

Linux基礎開發工具——vim工具

文章目錄 vim工具什么是vimvim的多模式和使用vim的基礎模式vim的三種基礎模式三種模式的初步了解 常用模式的詳細講解插入模式命令模式模式轉化光標的移動文本的編輯 底行模式替換模式視圖模式總結 使用vim的小技巧vim的配置(了解) vim工具 本文章仍然是繼續講解Linux系統下的…

C++_核心編程_多態案例二-制作飲品

#include <iostream> #include <string> using namespace std;/*制作飲品的大致流程為&#xff1a;煮水 - 沖泡 - 倒入杯中 - 加入輔料 利用多態技術實現本案例&#xff0c;提供抽象制作飲品基類&#xff0c;提供子類制作咖啡和茶葉*//*基類*/ class AbstractDr…

AcWing--數據結構1

用數組來模擬鏈表。這種實現鏈表的方式也叫靜態鏈表。 1.單鏈表 寫鄰接表&#xff1a;存儲圖和樹 我們定義&#xff1a;e[N]用來表示某個點的值是多少&#xff1b;ne[N]用來表示某個點的next指針是多少 e和ne是用下標關聯起來的 如&#xff1a;head->3->5->7->…

云啟出海,智聯未來|阿里云網絡「企業出海」系列客戶沙龍上海站圓滿落地

借阿里云中企出海大會的東風&#xff0c;以**「云啟出海&#xff0c;智聯未來&#xff5c;打造安全可靠的出海云網絡引擎」為主題的阿里云企業出海客戶沙龍云網絡&安全專場于5.28日下午在上海順利舉辦&#xff0c;現場吸引了來自攜程、小紅書、米哈游、嗶哩嗶哩、波克城市、…