营销策划与运营的书/西安seo按天收费

营销策划与运营的书,西安seo按天收费,新品发布会领导致辞,bt天堂在线bt网大白话Vue 项目中使用$refs来访问组件实例或 DOM 元素,有哪些注意事项? 在 Vue 项目里,$refs 是个超实用的工具,它能让你直接访问组件实例或者 DOM 元素。不过使用的时候,有一些地方可得注意,下面咱就详细…

大白话Vue 项目中使用$refs来访问组件实例或 DOM 元素,有哪些注意事项?

在 Vue 项目里,$refs 是个超实用的工具,它能让你直接访问组件实例或者 DOM 元素。不过使用的时候,有一些地方可得注意,下面咱就详细唠唠。

1. $refs 只有在组件渲染完成后才可用

在 Vue 里,组件从创建到渲染完成是有个过程的。只有当组件完全渲染好了,$refs 才能正常使用。要是在组件还没渲染好的时候就想用 $refs 去访问东西,那肯定会出问题。所以,通常会把使用 $refs 的代码放到 mounted 钩子函数里,因为这个钩子函数是在组件渲染完成后才执行的。

export default {// 组件挂载完成后执行的钩子函数mounted() {// 这里可以安全地使用 $refs 访问组件实例或 DOM 元素this.$refs.myComponent.someMethod(); // 调用组件实例的方法this.$refs.myElement.focus(); // 让 DOM 元素获取焦点}
};

2. 不要在模板里直接使用 $refs

虽然 $refs 能让你访问组件实例或者 DOM 元素,但千万别在模板里直接用它。因为模板里的代码会在每次数据更新的时候重新计算,如果在模板里用 $refs,可能会导致意外的结果,而且还会影响性能。

<template><!-- 不要这样做 --><!-- <div>{{ $refs.myElement.textContent }}</div> --><div ref="myElement">这是一个 DOM 元素</div>
</template><script>
export default {mounted() {// 在 mounted 钩子函数里使用 $refsconst text = this.$refs.myElement.textContent;console.log(text); // 输出: 这是一个 DOM 元素}
};
</script>

3. $refs 不是响应式的

$refs 不像 Vue 的响应式数据那样,数据一变页面就跟着更新。$refs 只是一个普通的对象,它的属性值在组件渲染完成后就固定了。所以,如果你想在数据变化的时候更新 $refs 相关的操作,就得手动去处理。

<template><div><button @click="updateElement">更新元素</button><div ref="myElement">{{ message }}</div></div>
</template><script>
export default {data() {return {message: '初始消息'};},methods: {updateElement() {this.message = '更新后的消息';// 手动更新 $refs 相关的操作this.$refs.myElement.textContent = this.message;}}
};
</script>

4. 动态绑定 ref 时要注意

要是你需要动态绑定 ref,也就是根据不同的条件给不同的元素或者组件绑定 ref,那得小心了。因为动态绑定 ref 可能会导致 $refs 的值发生变化,所以在使用的时候要确保 $refs 里确实有你想要的元素或者组件。

<template><div><!-- 动态绑定 ref --><component :is="currentComponent" :ref="currentRef"></component><button @click="switchComponent">切换组件</button></div>
</template><script>
import ComponentA from './ComponentA.vue';
import ComponentB from './ComponentB.vue';export default {data() {return {currentComponent: ComponentA,currentRef: 'componentRef',componentRef: null};},methods: {switchComponent() {this.currentComponent = this.currentComponent === ComponentA ? ComponentB : ComponentA;// 切换组件后,确保 $refs 里有正确的组件实例if (this.$refs.componentRef) {this.$refs.componentRef.someMethod();}}}
};
</script>

5. 在子组件销毁时清理 $refs

当子组件被销毁的时候,$refs 里对应的引用不会自动清除。所以,要是你在子组件销毁后还去访问 $refs 里的这个引用,就会报错。为了避免这种情况,你可以在子组件销毁的时候手动清理 $refs 里的引用。

<template><div><child-component ref="childRef"></child-component><button @click="destroyChild">销毁子组件</button></div>
</template><script>
import ChildComponent from './ChildComponent.vue';export default {components: {ChildComponent},methods: {destroyChild() {// 销毁子组件this.$refs.childRef.$destroy();// 手动清理 $refs 里的引用this.$refs.childRef = null;}}
};
</script>

总之,$refs 是个很强大的工具,但使用的时候得注意上面这些点,这样才能避免出现各种奇怪的问题,让你的 Vue 项目更加稳定。

除了$refs,Vue还有哪些可以访问组件实例或DOM元素的方式?

在 Vue 里,除了使用 $refs 访问组件实例或 DOM 元素外,还有以下几种方式:

1. 通过事件机制传递信息

在 Vue 中,你可以利用自定义事件和事件总线在组件间传递数据,从而间接访问组件实例。

自定义事件

子组件能够通过 $emit 触发自定义事件,把数据传递给父组件,父组件在接收到事件后就可以访问子组件实例的属性或方法。

<template><!-- 父组件 --><div><child-component @custom-event="handleCustomEvent"></child-component></div>
</template><script>
import ChildComponent from './ChildComponent.vue';export default {components: {ChildComponent},methods: {handleCustomEvent(childInstance) {// 访问子组件实例console.log(childInstance.someMethod());}}
};
</script>
<template><!-- 子组件 --><div><button @click="sendInstance">发送实例</button></div>
</template><script>
export default {methods: {sendInstance() {// 触发自定义事件,传递当前组件实例this.$emit('custom-event', this);},someMethod() {return '这是子组件的方法';}}
};
</script>
事件总线

事件总线是一个全局的事件中心,组件能够在上面触发和监听事件,以此实现组件间的通信。

// eventBus.js
import Vue from 'vue';
export const eventBus = new Vue();
<template><!-- 发送组件 --><div><button @click="sendMessage">发送消息</button></div>
</template><script>
import { eventBus } from './eventBus.js';export default {methods: {sendMessage() {// 触发事件总线的事件eventBus.$emit('message-sent', this);}}
};
</script>
<template><!-- 接收组件 --><div></div>
</template><script>
import { eventBus } from './eventBus.js';export default {mounted() {// 监听事件总线的事件eventBus.$on('message-sent', (senderInstance) => {console.log(senderInstance.someMethod());});}
};
</script>

2. 使用 provideinject

provideinject 主要用于实现跨级组件间的通信,父组件能够通过 provide 提供数据,子组件可以使用 inject 注入这些数据。

<template><!-- 父组件 --><div><child-component></child-component></div>
</template><script>
import ChildComponent from './ChildComponent.vue';export default {components: {ChildComponent},provide() {return {parentInstance: this};}
};
</script>
<template><!-- 子组件 --><div></div>
</template><script>
export default {inject: ['parentInstance'],mounted() {// 访问父组件实例console.log(this.parentInstance.someMethod());}
};
</script>

3. 使用 Vue.observable(Vue 2)或 reactive(Vue 3)

在 Vue 2 里可以使用 Vue.observable 创建一个响应式对象,在 Vue 3 中则使用 reactive。通过这个响应式对象存储组件实例,从而实现对组件实例的访问。

Vue 2
// store.js
import Vue from 'vue';export const store = Vue.observable({componentInstance: null
});
<template><!-- 组件 A --><div><button @click="setInstance">设置实例</button></div>
</template><script>
import { store } from './store.js';export default {methods: {setInstance() {// 将当前组件实例存储到响应式对象中store.componentInstance = this;}}
};
</script>
<template><!-- 组件 B --><div></div>
</template><script>
import { store } from './store.js';export default {mounted() {// 访问存储的组件实例if (store.componentInstance) {console.log(store.componentInstance.someMethod());}}
};
</script>
Vue 3
// store.js
import { reactive } from 'vue';export const store = reactive({componentInstance: null
});
<template><!-- 组件 A --><div><button @click="setInstance">设置实例</button></div>
</template><script setup>
import { store } from './store.js';const setInstance = () => {// 将当前组件实例存储到响应式对象中store.componentInstance = getCurrentInstance();
};
</script>
<template><!-- 组件 B --><div></div>
</template><script setup>
import { store } from './store.js';if (store.componentInstance) {console.log(store.componentInstance.someMethod());
}
</script>

这些方法都有各自的适用场景,你可以根据具体需求来选择合适的方式。

在Vue中,如何避免$refs访问带来的性能问题?

在 Vue 里使用 $refs 访问组件实例或 DOM 元素时,若使用不当可能会引发性能问题。以下是一些避免 $refs 访问带来性能问题的方法:

1. 避免在渲染循环中频繁访问 $refs

$refs 本身并非响应式的,但在渲染循环里频繁访问 $refs 会导致不必要的计算和 DOM 操作,从而降低性能。应该把 $refs 的访问逻辑移到事件处理函数或者生命周期钩子函数中。

<template><div><div ref="myElement">示例元素</div><button @click="handleClick">点击</button></div>
</template><script>
export default {methods: {handleClick() {// 在事件处理函数中访问 $refsconst element = this.$refs.myElement;if (element) {// 对元素进行操作element.style.color = 'red';}}}
};
</script>

2. 仅在必要时使用 $refs

$refs 主要用于直接访问组件实例或 DOM 元素,不过很多时候可以借助 Vue 的响应式系统来实现相同的功能,从而避免使用 $refs

示例:动态改变样式

不使用 $refs 的情况:

<template><div><div :style="{ color: textColor }">示例元素</div><button @click="changeColor">改变颜色</button></div>
</template><script>
export default {data() {return {textColor: 'black'};},methods: {changeColor() {this.textColor = 'red';}}
};
</script>

3. 及时清理不再使用的 $refs

当组件被销毁时,$refs 里对应的引用不会自动清除。若不清理,可能会造成内存泄漏。所以在组件销毁时要手动清理 $refs

<template><div><child-component ref="childRef"></child-component><button @click="destroyChild">销毁子组件</button></div>
</template><script>
import ChildComponent from './ChildComponent.vue';export default {components: {ChildComponent},methods: {destroyChild() {// 销毁子组件this.$refs.childRef.$destroy();// 手动清理 $refs 里的引用this.$refs.childRef = null;}}
};
</script>

4. 避免在 watch 中频繁访问 $refs

watch 用于监听数据变化,若在 watch 里频繁访问 $refs,会导致不必要的性能开销。可以在 watch 中设置 immediate: false,避免初始化时就执行访问操作。

<template><div><div ref="myElement">示例元素</div><input v-model="inputValue" /></div>
</template><script>
export default {data() {return {inputValue: ''};},watch: {inputValue: {handler(newValue) {if (this.$refs.myElement) {// 对元素进行操作this.$refs.myElement.textContent = newValue;}},immediate: false // 避免初始化时执行}}
};
</script>

5. 利用缓存机制

要是需要多次访问 $refs,可以把访问结果缓存起来,避免重复访问。

<template><div><div ref="myElement">示例元素</div><button @click="doSomething">执行操作</button><button @click="doAnotherThing">执行另一个操作</button></div>
</template><script>
export default {data() {return {cachedElement: null};},methods: {getElement() {if (!this.cachedElement) {this.cachedElement = this.$refs.myElement;}return this.cachedElement;},doSomething() {const element = this.getElement();if (element) {// 对元素进行操作element.style.fontSize = '20px';}},doAnotherThing() {const element = this.getElement();if (element) {// 对元素进行另一个操作element.style.backgroundColor = 'yellow';}}}
};
</script>

通过以上这些方法,可以有效避免 $refs 访问带来的性能问题,提升 Vue 应用的性能和稳定性。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/899349.shtml

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

相关文章

【区块链安全 | 第二篇】区块链概念详解

文章目录 概述1. 区块链类型2 区块链五层架构3 账本模型4. 节点&#xff08;Node&#xff09;5. 区块&#xff08;Block&#xff09;6. 区块链&#xff08;Blockchain&#xff09;7. 区块链工作流程 核心技术1. 共识机制2. 智能合约 主要组件1. 交易&#xff08;Transaction&am…

Redisson - 分布式锁和同步器

文章目录 锁&#xff08;Lock&#xff09;公平锁&#xff08;Fair Lock&#xff09;联锁&#xff08;MultiLock&#xff09;红锁&#xff08;RedLock&#xff09; 【已废弃】读写锁&#xff08;ReadWriteLock&#xff09;信号量&#xff08;Semaphore&#xff09;可过期许可信号…

HarmonyOS:GridObjectSortComponent(两个Grid之间网格元素交换)

一、概述 网格对象的编辑排序是用于网格对象的编辑、拖动排序、新增和删除。 说明 该组件从API Version 11开始支持。后续版本如有新增内容&#xff0c;则采用上角标单独标记该内容的起始版本。 二、导入模块 import { GridObjectSortComponent, GridObjectSortComponentItem…

智能监控视频聚合平台,GB28181/RTSP/SIP/RTMP直播会议融合方案

全场景智能监控聚合平台&#xff1a;打破边界&#xff0c;赋能高效协同 在数字化转型加速的今天&#xff0c;海量视频监控设备、多样化的编码协议与复杂的业务场景&#xff0c;让企业面临跨系统整合难、资源调度效率低、协作响应慢等痛点。我们的智能监控聚合平台以技术创新为…

IP数据报报文格式

一 概述 IP数据报由两部分组成&#xff1a;首部数据部分。首部的前一部分是固定长度&#xff0c;一共20字节大小&#xff0c;是所有IP数据报文必须具有的&#xff1b;固定部分后面是一些可选字段&#xff0c;其长度是可变的。 二 首部固定部分各字段意义 &#xff08;1&…

【电子通识】案例:为什么电子产品制造过程中使用马克笔在FFC/FPC连接器打点进行标记

在电子产品制造过程中&#xff0c;使用马克笔在FFC/FPC连接完成后进行打点标记&#xff08;或类似目视化检查方法&#xff09;&#xff0c;是一种常见的“过程防错&#xff08;Poka-Yoke&#xff09;”手段&#xff0c;其核心目的是通过简单、直观的方式确保关键工序的执行质量…

Linux中断处理流程

Linux中断处理流程 在Linux内核中&#xff0c;中断控制器管理硬件中断号到Linux中断号的映射&#xff0c;并通过中断描述符&#xff08;struct irq_desc&#xff09;进行管理。存储这种映射关系的方式取决于中断编号的连续性&#xff0c;具体实现如下&#xff1a; 1. 数组存储&…

Java 大视界 -- 基于 Java 的大数据隐私计算在医疗影像数据共享中的实践探索(158)

&#x1f496;亲爱的朋友们&#xff0c;热烈欢迎来到 青云交的博客&#xff01;能与诸位在此相逢&#xff0c;我倍感荣幸。在这飞速更迭的时代&#xff0c;我们都渴望一方心灵净土&#xff0c;而 我的博客 正是这样温暖的所在。这里为你呈上趣味与实用兼具的知识&#xff0c;也…

logstash收集数据

防止ES的的I/O的压力过大&#xff0c;使用redis/kafka进行缓冲。 对redis的要求 Redis input plugin | Logstash Reference [8.17] | Elastic 一般企业要求的架构 我实现的架构 filebeat把数据传给logstash 配置好filebeat把收集到的数据输入到redis 然后执行命令&#xff0…

MAXKB部署,使用和注意事项

MaxKB Max Knowledge Base&#xff0c;是一款基于大语言模型和 RAG 的开源知识库问答系统&#xff0c;广泛应用于智能客服、企业内部知识库、学术研究与教育等场景。作为一款专注于知识库问答场景的软件产品&#xff0c;MaxKB 能够为企业的智能化进程注入新的动力&#xff0c;…

docker - compose up - d`命令解释,重复运行会覆盖原有容器吗

docker - compose up - d`命令解释,重复运行会覆盖原有容器吗 docker - compose up - d 是一个用于管理 Docker 容器的命令,具体含义如下: 命令含义: up:用于创建、启动并运行容器,会根据 docker - compose.yml 文件中定义的服务配置来操作。-d:表示以“分离模式”(det…

03-SpringBoot3入门-配置文件(自定义配置及读取)

1、自定义配置 # 自定义配置 zbj:user:username: rootpassword: 123456# 自定义集合gfs:- a- b- c2、读取 1&#xff09;User类 package com.sgu.pojo;import lombok.Data; import org.springframework.boot.context.properties.ConfigurationProperties; import org.spring…

进程状态:Linux的幕后指挥管理,穿越操作系统进程的静与动

文章目录 引言&#xff1a;进程的生命与状态&#xff1a;动与静的交响曲一、操作系统中的进程状态概述1.1 经典的进程状态模型1.2 进程状态转换图 二、Linux操作系统中的进程状态2.1 Linux进程状态的分类2.2 各状态的详细解释 2.3 Linux进程状态表2.4 使用ps查看进程状态三、进…

MOSN(Modular Open Smart Network)-05-MOSN 平滑升级原理解析

前言 大家好&#xff0c;我是老马。 sofastack 其实出来很久了&#xff0c;第一次应该是在 2022 年左右开始关注&#xff0c;但是一直没有深入研究。 最近想学习一下 SOFA 对于生态的设计和思考。 sofaboot 系列 SOFAStack-00-sofa 技术栈概览 MOSN&#xff08;Modular O…

构建高可用性西门子Camstar服务守护者:异常监控与自愈实践

在智能制造领域,西门子Camstar作为领先的MES系统承载着关键生产业务。但在实际运维中,我们发现其服务常因数据库负载激增(如SQL阻塞链超时)或应用服务器资源耗尽(CPU峰值达90%以上)导致服务不可用。传统人工干预方式平均故障恢复时间长达47分钟,这对连续生产场景构成了严…

arm之s3c2440的I2C的用法

基础概念 IC&#xff08;Inter-Integrated Circuit&#xff09;又称I2C&#xff0c;是是IICBus简称&#xff0c;所以中文应该叫集成电路总线。 IIC的总线的使用场景&#xff0c;所有挂载在IIC总线上的设备都有两根信号线&#xff0c;一根是数据线SDA&#xff0c;另一 根是时钟…

STM32F103_LL库+寄存器学习笔记10 - DMA传输过半+DMA传输完成中断实现DMA串口接收“双缓冲“

导言 《[[STM32F103_LL库寄存器学习笔记09 - DMA串口接收与DMA串口发送&#xff0c;串口接收空闲中断]]》上一章节完成DMA发送与接收。此时&#xff0c;有一个致命的问题可能会导致数据包丢失。原因是USART1接收只开启了接收空闲中断(IDLE)&#xff0c;DMA在连续模式下&#xf…

李宏毅机器学习笔记06 | 鱼和熊掌可以兼得的机器学习 - 内容接宝可梦

本章提要 深度学习可以在较少参数量的情况下得到比较低的loss&#xff1a; h a l l a r g min ⁡ h ∈ H L ( h , D a l l ) h^{all}arg \min_{h \in H}L(h,D_{all}) hallargminh∈H​L(h,Dall​) 引入 如何权衡模型的复杂程度 Tradeoff of Model Complexity 理论上&#…

海康gdb流程

gdb相关 在initrun.sh文件里加入&#xff0c;注意需要在hikauto起来之前 # 设置core dump大小 ulimit -c unlimited if [ $? -eq 0 ];then echo "core dump size set success" else echo -e "\33[31m core dump size set fail\33[0m" fi echo …