Vue 模板语句的数据来源

news2025/6/12 7:45:07

🧩 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.coloradmin.cn/o/2406995.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

HybridVLA——让单一LLM同时具备扩散和自回归动作预测能力:训练时既扩散也回归,但推理时则扩散

前言 如上一篇文章《dexcap升级版之DexWild》中的前言部分所说&#xff0c;在叠衣服的过程中&#xff0c;我会带着团队对比各种模型、方法、策略&#xff0c;毕竟针对各个场景始终寻找更优的解决方案&#xff0c;是我个人和我司「七月在线」的职责之一 且个人认为&#xff0c…

协议转换利器,profinet转ethercat网关的两大派系,各有千秋

随着工业以太网的发展&#xff0c;其高效、便捷、协议开放、易于冗余等诸多优点&#xff0c;被越来越多的工业现场所采用。西门子SIMATIC S7-1200/1500系列PLC集成有Profinet接口&#xff0c;具有实时性、开放性&#xff0c;使用TCP/IP和IT标准&#xff0c;符合基于工业以太网的…

9-Oracle 23 ai Vector Search 特性 知识准备

很多小伙伴是不是参加了 免费认证课程&#xff08;限时至2025/5/15&#xff09; Oracle AI Vector Search 1Z0-184-25考试&#xff0c;都顺利拿到certified了没。 各行各业的AI 大模型的到来&#xff0c;传统的数据库中的SQL还能不能打&#xff0c;结构化和非结构的话数据如何和…

mac:大模型系列测试

0 MAC 前几天经过学生优惠以及国补17K入手了mac studio,然后这两天亲自测试其模型行运用能力如何&#xff0c;是否支持微调、推理速度等能力。下面进入正文。 1 mac 与 unsloth 按照下面的进行安装以及测试&#xff0c;是可以跑通文章里面的代码。训练速度也是很快的。 注意…

DBLP数据库是什么?

DBLP&#xff08;Digital Bibliography & Library Project&#xff09;Computer Science Bibliography是全球著名的计算机科学出版物的开放书目数据库。DBLP所收录的期刊和会议论文质量较高&#xff0c;数据库文献更新速度很快&#xff0c;很好地反映了国际计算机科学学术研…

Xela矩阵三轴触觉传感器的工作原理解析与应用场景

Xela矩阵三轴触觉传感器通过先进技术模拟人类触觉感知&#xff0c;帮助设备实现精确的力测量与位移监测。其核心功能基于磁性三维力测量与空间位移测量&#xff0c;能够捕捉多维触觉信息。该传感器的设计不仅提升了触觉感知的精度&#xff0c;还为机器人、医疗设备和制造业的智…

DeepSeek源码深度解析 × 华为仓颉语言编程精粹——从MoE架构到全场景开发生态

前言 在人工智能技术飞速发展的今天&#xff0c;深度学习与大模型技术已成为推动行业变革的核心驱动力&#xff0c;而高效、灵活的开发工具与编程语言则为技术创新提供了重要支撑。本书以两大前沿技术领域为核心&#xff0c;系统性地呈现了两部深度技术著作的精华&#xff1a;…

stm32wle5 lpuart DMA数据不接收

配置波特率9600时&#xff0c;需要使用外部低速晶振

Unity中的transform.up

2025年6月8日&#xff0c;周日下午 在Unity中&#xff0c;transform.up是Transform组件的一个属性&#xff0c;表示游戏对象在世界空间中的“上”方向&#xff08;Y轴正方向&#xff09;&#xff0c;且会随对象旋转动态变化。以下是关键点解析&#xff1a; 基本定义 transfor…

Elastic 获得 AWS 教育 ISV 合作伙伴资质,进一步增强教育解决方案产品组合

作者&#xff1a;来自 Elastic Udayasimha Theepireddy (Uday), Brian Bergholm, Marianna Jonsdottir 通过搜索 AI 和云创新推动教育领域的数字化转型。 我们非常高兴地宣布&#xff0c;Elastic 已获得 AWS 教育 ISV 合作伙伴资质。这一重要认证表明&#xff0c;Elastic 作为 …

MySQL的pymysql操作

本章是MySQL的最后一章&#xff0c;MySQL到此完结&#xff0c;下一站Hadoop&#xff01;&#xff01;&#xff01; 这章很简单&#xff0c;完整代码在最后&#xff0c;详细讲解之前python课程里面也有&#xff0c;感兴趣的可以往前找一下 一、查询操作 我们需要打开pycharm …

渗透实战PortSwigger靶场:lab13存储型DOM XSS详解

进来是需要留言的&#xff0c;先用做简单的 html 标签测试 发现面的</h1>不见了 数据包中找到了一个loadCommentsWithVulnerableEscapeHtml.js 他是把用户输入的<>进行 html 编码&#xff0c;输入的<>当成字符串处理回显到页面中&#xff0c;看来只是把用户输…

[论文阅读]TrustRAG: Enhancing Robustness and Trustworthiness in RAG

TrustRAG: Enhancing Robustness and Trustworthiness in RAG [2501.00879] TrustRAG: Enhancing Robustness and Trustworthiness in Retrieval-Augmented Generation 代码&#xff1a;HuichiZhou/TrustRAG: Code for "TrustRAG: Enhancing Robustness and Trustworthin…

水泥厂自动化升级利器:Devicenet转Modbus rtu协议转换网关

在水泥厂的生产流程中&#xff0c;工业自动化网关起着至关重要的作用&#xff0c;尤其是JH-DVN-RTU疆鸿智能Devicenet转Modbus rtu协议转换网关&#xff0c;为水泥厂实现高效生产与精准控制提供了有力支持。 水泥厂设备众多&#xff0c;其中不少设备采用Devicenet协议。Devicen…

Linux中《基础IO》详细介绍

目录 理解"文件"狭义理解广义理解文件操作的归类认知系统角度文件类别 回顾C文件接口打开文件写文件读文件稍作修改&#xff0c;实现简单cat命令 输出信息到显示器&#xff0c;你有哪些方法stdin & stdout & stderr打开文件的方式 系统⽂件I/O⼀种传递标志位…

【Veristand】Veristand环境安装教程-Linux RT / Windows

首先声明&#xff0c;此教程是针对Simulink编译模型并导入Veristand中编写的&#xff0c;同时需要注意的是老用户编译可能用的是Veristand Model Framework&#xff0c;那个是历史版本&#xff0c;且NI不会再维护&#xff0c;新版本编译支持为VeriStand Model Generation Suppo…

Ubuntu系统多网卡多相机IP设置方法

目录 1、硬件情况 2、如何设置网卡和相机IP 2.1 万兆网卡连接交换机&#xff0c;交换机再连相机 2.1.1 网卡设置 2.1.2 相机设置 2.3 万兆网卡直连相机 1、硬件情况 2个网卡n个相机 电脑系统信息&#xff0c;系统版本&#xff1a;Ubuntu22.04.5 LTS&#xff1b;内核版本…

《Docker》架构

文章目录 架构模式单机架构应用数据分离架构应用服务器集群架构读写分离/主从分离架构冷热分离架构垂直分库架构微服务架构容器编排架构什么是容器&#xff0c;docker&#xff0c;镜像&#xff0c;k8s 架构模式 单机架构 单机架构其实就是应用服务器和单机服务器都部署在同一…

ubuntu22.04有线网络无法连接,图标也没了

今天突然无法有线网络无法连接任何设备&#xff0c;并且图标都没了 错误案例 往上一顿搜索&#xff0c;试了很多博客都不行&#xff0c;比如 Ubuntu22.04右上角网络图标消失 最后解决的办法 下载网卡驱动&#xff0c;重新安装 操作步骤 查看自己网卡的型号 lspci | gre…

【堆垛策略】设计方法

堆垛策略的设计是积木堆叠系统的核心&#xff0c;直接影响堆叠的稳定性、效率和容错能力。以下是分层次的堆垛策略设计方法&#xff0c;涵盖基础规则、优化算法和容错机制&#xff1a; 1. 基础堆垛规则 (1) 物理稳定性优先 重心原则&#xff1a; 大尺寸/重量积木在下&#xf…