积累-Vue.js 开发实用指南:ElementUI 与核心技巧

一、ElementUI 组件高效使用

1. Table 组件展开行优化实现

场景需求:仅在展开行时动态加载数据,避免不必要的接口调用

实现方案

// expand行展开的时候调用expandOpen: async (row, expandedRows) => {// 实时更新展开列const index = expandedRows.indexOf(row);this.expandedRows = expandedRows;if (index !== -1) {// 检查是否已经获取过数据,避免重复请求if (!row.hawbs) {// let res = await findHawbByMawbId({ mid: row.mawbId }, { Authorization: 'Bearer ' + this.$store.state.UserInfo.accessToken });// row.hawbs = res;}}},columns: [{type: "expand",fixed: "left",render: (h, params) => {// if (this.expandedRows.includes(params.row)) {params.row.hawbs.mawbId = params.row.mawbId;return <Table data={params.row.hawbs} />;// }}},
@expand-change = "cfgs.expandOpen"

关键点

  • 使用 expand-change 事件监听展开状态变化

  • 通过 expandedRows 数组跟踪当前展开的行

  • 检查数据是否已加载避免重复请求

2. 表单编辑/新增模式下的重置陷阱

问题现象

  • 先新增后编辑:正常

  • 先编辑后新增:resetFields() 失效

根本原因

  • resetFields() 是将表单重置为初始值而非清空

  • 编辑时赋值操作改变了表单初始值

  • 在没有点新增或着编辑时,我的el-dialog弹出框里的内容是空白的,只有header和footer,

    并没有body,只有el-dialog弹出时才会加载内容。

解决方案

edit(row) {this.visible = true;this.$nextTick(() => {// 确保DOM更新完成后再赋值this.form = { ...row };});
}

3. Select 远程搜索分页优化

实现要点

  1. 自定义指令处理滚动触底事件

  2. 结合分页参数与搜索关键词

  3. 防抖处理搜索请求

二、Vue 核心操作技巧

1. $nextTick 的正确使用

典型场景

  • 在数据变化后操作 DOM

  • DOM 更新后的元素操作

  • 确保多个更新顺序执行

  • 解决异步渲染导致的问题

代码示例

this.someData = newValue;
this.$nextTick(() => {// 此时DOM已更新this.$refs.myElement.scrollIntoView();
});

Vue 3 改进

  • 基于 Proxy 的响应式系统

  • 直接修改即可触发更新

2.this.$set(this.someObject, 'newProperty', 'newValue');

Vue2 新增响应式属性。

在 Vue 2 中,响应式数据的更新非常重要,因为它确保了当数据改变时,视图能够自动更新。Vue 使用一套高效的机制来追踪依赖并在数据变化时更新视图。然而,在某些情况下,直接修改对象的属性可能不会触发视图更新。这时,$set 方法就显得尤为重要。

a. $set 方法简介

$set 是 Vue 实例的一个方法,用于向响应式对象添加一个新的属性,并确保新属性同样是响应式的,能够触发视图更新。

语法

Vue.set(target, propertyName, value)

target:要添加属性的对象。

propertyName:要添加的新属性的名称。

value:新属性的值。

b. 为什么需要 $set

在 Vue 中,只有通过 data 函数声明的属性才是响应式的。如果你在实例创建之后直接添加新的属性,那么这个属性不是响应式的,不会触发视图更新。

示例

export default {data() {return {object: {}};},mounted() {this.object.newProperty = 'newValue'; // 直接添加属性,不会触发视图更新this.$set(this.object, 'newProperty', 'newValue'); // 使用 $set 添加属性,会触发视图更新}}

在这个例子中,直接给 object 添加 newProperty 属性不会触发视图更新,而使用 $set 方法添加则可以。

c. $set 的使用场景
  • 动态添加属性

当你需要在运行时动态添加新的属性到对象中时,使用 $set 可以确保新属性是响应式的。

示例

methods: {addProperty() {this.$set(this.someObject, 'dynamicProperty', 'value');}}
  • 修改数组索引

虽然 Vue 能够自动追踪数组的变化,但是直接通过索引修改数组项可能不会触发更新。使用 $set 可以确保更新是响应式的。

示例

methods: {updateItem(index, newValue) {this.$set(this.items, index, newValue);}}

3.$set 与 Vue.set 的区别

$set:Vue 实例方法,只能在组件实例中使用。

Vue.set:全局方法,可以在任何地方使用,包括组件外部。

示例

// 在组件内部使用 $setthis.$set(this.someObject, 'newProperty', 'value');// 在组件外部使用 Vue.setVue.set(someObject, 'newProperty', 'value');

4. Refs 使用指南与陷阱

最佳实践

// 声明引用
<component ref="childComp"></component>// 安全访问
mounted() {this.$nextTick(() => {this.$refs.childComp.doSomething();});
}

常见问题

  • refs在DOM渲染完成后才能使用

    • Vue在渲染DOM时是异步的,因此refs只有在DOM渲染完成后才能访问。如果尝试在DOM渲染之前访问refs,将会得到undefined。解决方法是使用生命周期钩子mounted或者在nextTick中访问refs。

      mounted() {this.$nextTick(() => {console.log(this.$refs.myInput); // 现在可以安全地访问refs});}
  • v-for和refs结合使用时的注意事项

    • 当在v-for循环中使用refs时,如果为每个元素指定相同的ref名称,Vue会自动将它们作为一个数组处理。这意味着this.$refs.myElement将是一个数组,而不是单个元素。

      <template><div v-for="item in items" :key="item.id" :ref="'myElement' + item.id"></div></template>

      在这种情况下,你需要使用数组索引来访问特定的元素:

      methods: {getElementByIndex(index) {console.log(this.$refs['myElement' + this.items[index].id][0]);}}
  • 避免过度依赖 refs 进行组件通信

    • 虽然refs非常强大,但过度使用它们可能会导致组件难以维护。在大多数情况下,你应该优先考虑使用事件和props来与子组件通信。

5. 数组初始化陷阱

存在引用问题

所有数组元素都是同一个数组的引用。这意味着当你修改其中一个子数组时,所有子数组都会受到影响。

错误示范

// 所有元素引用同一个数组!
const arr = new Array(3).fill([]);
arr[0].push(1); // 所有子数组都会受影响
console.log(arr); // 输出: [[1], [1], [1]]
const arr = [];
for (let i = 0; i < 3; i++) {arr.push([]);
}

三、Scoped CSS 深度作用

第三方组件样式覆盖方案

问题分析

  • 域限制-Scoped 生成的 data-v-xxx 属性不传递到子组件
    • scoped 生成的 data-v-xxxx 属性仅存在于当前组件的 DOM 元素上,而第三方组件内部的元素不会继承该属性。例如:

      <!-- 当前组件模板 --><el-button class="my-btn">按钮</el-button><!-- 渲染后的第三方组件 DOM --><button class="el-button el-button--primary" data-v-第三方hash><span class="el-button__text">按钮</span></button>

      此时 .my-btn[data-v-current] 无法匹配到第三方组件的元素。

  • 选择器不匹配-常规选择器无法匹配子组件内部元素
    • 直接编写的选择器(如 .el-button__text)会被编译为 .el-button__text[data-v-current],但第三方组件内部元素可能没有此属性,导致样式失效。

解决方案对比

语法示例适用场景
>>>.parent >>> .child原生CSS
/deep/.parent /deep/ .child已废弃
::v-deep.parent::v-deep .child推荐用法

实现示例

/* 最终编译为 [data-v-xxx] .el-button__text */
.my-btn::v-deep .el-button__text {color: red;
}

注意事项

  • 避免全局样式污染

  • 尽量缩小样式作用范围

  • 优先使用组件提供的样式定制接口

通过掌握这些关键技巧,可以显著提升 Vue.js 开发效率,避免常见陷阱,构建更健壮的前端应用。

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

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

相关文章

【BUG】记STM32F030多通道ADC DMA读取乱序问题

STM32F0多通道ADC的校准顺序与DMA乱序问题的本质 声明&#xff1a;本段转载&#xff1a;https://www.cnblogs.com/chihirosan/p/5458673.html 问题描述 通过 uint16_t ConvData[8]保存DMA搬运的ADC转换数值&#xff0c;但是这个数组数值的顺序总是和ADC不是顺序对应的。比如用7…

Java - Mysql数据类型对应

Mysql数据类型java数据类型备注整型INT/INTEGERint / java.lang.Integer–BIGINTlong/java.lang.Long–––浮点型FLOATfloat/java.lang.FloatDOUBLEdouble/java.lang.Double–DECIMAL/NUMERICjava.math.BigDecimal字符串型CHARjava.lang.String固定长度字符串VARCHARjava.lang…

今天刷SQL

多说几句&#xff0c;JAVA真不行了&#xff1f; 刚刚看到那个tiobe最新的指数&#xff0c;JAVA只剩下8.84%&#xff1f;感觉上次看的时候还有百分之十呢。 185-department-top-three-salaries https://leetcode.com/problems/department-top-three-salaries/description/ 公…

【SQL学习笔记1】增删改查+多表连接全解析(内附SQL免费在线练习工具)

可以使用Sqliteviz这个网站免费编写sql语句&#xff0c;它能够让用户直接在浏览器内练习SQL的语法&#xff0c;不需要安装任何软件。 链接如下&#xff1a; sqliteviz 注意&#xff1a; 在转写SQL语法时&#xff0c;关键字之间有一个特定的顺序&#xff0c;这个顺序会影响到…

【计算机网络】SDN

SDN这种新型网络体系结构的核心思想&#xff1a;把网络的控制层面与数据层面分离&#xff0c;而让控制层面利用软件来控制数据层面中的许多设备。 OpenFlow协议可以被看成是SDN体系结构中控制层面与数据层面之间的通信接口。 在SDN中取代传统路由器中转发表的是“流表”&…

量化面试绿皮书:9. 通往Offer的门

文中内容仅限技术学习与代码实践参考&#xff0c;市场存在不确定性&#xff0c;技术分析需谨慎验证&#xff0c;不构成任何投资建议。 9. 通往Offer的门 你面对着两扇门。 一个通往你的工作机会&#xff0c;另一个是退出。 两扇门前都有一名警卫。一个守卫总是说谎&#xff0c…

【杂谈】-递归进化:人工智能的自我改进与监管挑战

递归进化&#xff1a;人工智能的自我改进与监管挑战 文章目录 递归进化&#xff1a;人工智能的自我改进与监管挑战1、自我改进型人工智能的崛起2、人工智能如何挑战人类监管&#xff1f;3、确保人工智能受控的策略4、人类在人工智能发展中的角色5、平衡自主性与控制力6、总结与…

Ascend NPU上适配Step1X-Edit模型

1 概述 1.1 简述 Step1X-Edit&#xff1a;一个在各种真实用户指令下表现出现的统一图像编辑模型。 Step1X-Edit&#xff0c;其性能可与 GPT-4o 和 Gemini2 Flash 等闭源模型相媲美。更具体地说&#xff0c;我们采用了多模态LLM 来处理参考图像和用户的编辑指令。我们提取了潜…

WEB3全栈开发——面试专业技能点P8DevOps / 区块链部署

一、Hardhat / Foundry 进行合约部署 概念介绍 Hardhat 和 Foundry 都是以太坊智能合约开发的工具套件&#xff0c;支持合约的编译、测试和部署。 它们允许开发者在本地或测试网络快速开发智能合约&#xff0c;并部署到链上&#xff08;测试网或主网&#xff09;。 部署过程…

【题解-洛谷】B4292 [蓝桥杯青少年组省赛 2022] 路线

题目&#xff1a;B4292 [蓝桥杯青少年组省赛 2022] 路线 题目描述 有一个旅游景区&#xff0c;景区中有 N N N 个景点&#xff0c;景点以数字 1 1 1 到 N N N 编号&#xff0c;其中编号为 N N N 的景点为游客服务中心所在地。景区中有 M M M 条连接路线&#xff0c;每条…

MySQL体系架构解析(四):MySQL数据存储的揭秘

MySQL中的数据目录 确定MySQL的数据目录 到底MySQL把数据都存到哪个路径下呢&#xff1f;其实数据木对应着一个系统变量datadir&#xff0c;我们在使用客户端与服务器建立连接之后查看这个系统变量的值就可以了。 -- 以下两种方式都可以 show variables like datadir; selec…

Solidity从入门到精通-Remix的基本使用和Solidity的基本数据类型

Solidity从入门到精通-Remix的基本使用和Solidity的基本数据类型 讲了那么多理论&#xff0c;相信大家对区块链/web3也有了一定认知&#xff1b;这时候可能就问有人会问了如何把理论变成实际的代码实现。 这就来了接下来会给大家分享Solidity入门教程 这时候就会有同学问了Sol…

ArcGIS Pro+ArcGIS给你的地图加上北回归线!

今天来看ArcGIS Pro和ArcGIS中如何给制作的中国地图或者其他大范围地图加上北回归线。 我们将在ArcGIS Pro和ArcGIS中一同介绍。 1 ArcGIS Pro中设置北回归线 1、在ArcGIS Pro中初步设置好经纬格网等&#xff0c;设置经线、纬线都以10间隔显示。 2、需要插入背会归线&#xf…

在.NET Core控制器中获取AJAX传递的Body参数

.Net Core是支持前后端不分离式的开发的&#xff0c;如果在原始系统中采用不分离式开发&#xff0c;后面需要在原系统中增加功能&#xff0c;并且新的服务采用其他语言开发&#xff0c;且系统原来功能保持原样&#xff0c;这样前端系统可以单独调用新开发的接口。 但是&#x…

ubuntu24安装opencv过程

1.访问opencv官网&#xff0c;下载源代码。 opencv 2.选择相应版本的源码下载 我这里用的是4.8.1版本的源码进行安装&#xff0c;opencv-4.8.1.tar.gz 安装命令 tar xvf opencv-4.8.1.tar.gz #在当前文件夹创建build文件&#xff0c;并进入 mkdir build && cd build …

Kubernetes ClusterIP 端口深度解析:虚拟服务与流量转发机制

事情的起因是创建了一个 NodePort 类型 Service&#xff0c;其端口映射关系为 8000:30948/TCP。既然30948是在每个node开的端口&#xff0c;那8000是开在哪的呢&#xff1f;出于好奇回顾了一下K8s的Cluster IP和Service 端口映射关系解析 在 Kubernetes 的 NodePort Service 中…

C++左值与右值及引用的总结

前言 在C中&#xff0c;理解左值&#xff08;lvalue&#xff09;和右值&#xff08;rvalue&#xff09;是掌握现代C核心特性的关键。左值通常指代具名的、持久存在的对象&#xff0c;可以取地址&#xff1b;而右值则是临时的、即将销毁的值&#xff0c;如字面量或表达式结果。…

学习记录:DAY31

Java课设&#xff1a;数字水印处理与解析器开发 前言 想养成写日记的习惯真不容易。最近比较懒散&#xff0c;复习不想复&#xff0c;项目又做完了&#xff0c;处于一种能干些什么&#xff0c;但是不太想干&#xff0c;但是不干些什么又浑身难受的处境。其实完全就不是匀不出…

Linux系统部署KES

1、安装准备 1.版本说明V008R006C009B0014 V008&#xff1a;是version产品的大版本。 R006&#xff1a;是release产品特性版本。 C009&#xff1a;是通用版 B0014&#xff1a;是build开发过程中的构建版本2.硬件要求 #安全版和企业版 内存&#xff1a;1GB 以上 硬盘&#xf…

系统模块与功能设计框架

系统模块与功能设计框架&#xff0c;严格遵循专业架构设计原则&#xff0c;基于行业标准&#xff08;如微服务架构、DDD领域驱动设计&#xff09;构建。设计采用分层解耦模式&#xff0c;确保可扩展性和可维护性&#xff0c;适用于电商、企业服务、数字平台等中大型系统。 系统…