当前位置: 首页 > news >正文

「San」监听DOM变化的方法

在 San框架 中监听组件内部字体大小并调整宽度,可以结合 自定义事件数据绑定 来实现动态调整。San 框架没有直接的监听 DOM 尺寸变化的内置方法,但可以通过以下步骤实现:


方法一:使用 ResizeObserver 监听字体变化

在组件的 attached 生命周期中,使用 ResizeObserver 来监听组件内部的 DOM 元素变化,并更新 San 组件的数据。

示例代码
import { Component } from 'san';export default class MyComponent extends Component {initData() {return {width: 'auto'};}attached() {const targetElement = this.ref('content');const resizeObserver = new ResizeObserver((entries) => {for (const entry of entries) {const contentRect = entry.contentRect;const fontSize = parseFloat(window.getComputedStyle(entry.target).fontSize);this.data.set('width', `${fontSize * 2}px`); // 动态调整宽度}});if (targetElement) {resizeObserver.observe(targetElement);}// 确保观察器在组件销毁时释放资源this.resizeObserver = resizeObserver;}detached() {if (this.resizeObserver) {this.resizeObserver.disconnect();}}static template = `<div class="my-component" style="width: {{width}}"><div ref="content" class="content">{{text}}</div></div>`;
}
关键点:
  • this.ref('content') 引用内部 DOM 元素。
  • 使用 ResizeObserver 动态监听字体大小变化。
  • 宽度通过 San 的数据绑定动态更新。

方法二:手动触发字体变化的监听逻辑

如果字体大小是通过组件的 dataprops 动态设置,可以监听数据变化,并在 watch 或事件中更新宽度。

示例代码
import { Component } from 'san';export default class MyComponent extends Component {initData() {return {fontSize: 16,width: 'auto'};}inited() {this.watch('fontSize', (fontSize) => {const width = fontSize * 2; // 依据字体大小计算宽度this.data.set('width', `${width}px`);});}static template = `<div class="my-component" style="width: {{width}}"><div class="content" style="font-size: {{fontSize}}px">{{text}}</div></div>`;
}
关键点:
  • 使用 watch 方法监听字体大小的变化。
  • 通过 data 绑定宽度和字体大小。

方法三:结合 MutationObserver

attached 生命周期中,通过 MutationObserver 监听内部 DOM 元素的样式变化。

示例代码
import { Component } from 'san';export default class MyComponent extends Component {attached() {const targetElement = this.ref('content');const observer = new MutationObserver(() => {const fontSize = parseFloat(window.getComputedStyle(targetElement).fontSize);this.data.set('width', `${fontSize * 2}px`);});if (targetElement) {observer.observe(targetElement, {attributes: true,attributeFilter: ['style', 'class']});}this.observer = observer;}detached() {if (this.observer) {this.observer.disconnect();}}static template = `<div class="my-component" style="width: {{width}}"><div ref="content" class="content">{{text}}</div></div>`;
}
关键点:
  • 使用 MutationObserver 监听 styleclass 的变化。
  • detached 生命周期中断开观察器。

方法四:CSS 自适应方案(无需 JS)

如果字体大小和宽度的关系可以直接用 CSS 描述,可以通过 emcalc() 实现自动调整。

示例代码
.my-component {display: inline-block;width: calc(1.5em + 10px); /* 根据字体大小自动调整宽度 */
}.content {font-size: 16px;
}
San 模板
export default class MyComponent extends Component {static template = `<div class="my-component"><div class="content">{{text}}</div></div>`;
}

选择合适方案

  • 字体大小频繁变化ResizeObserver 更加高效。
  • 依赖 San 数据绑定:通过 watch 或直接监听数据更简单。
  • 简单静态布局:使用 CSS 自适应可以避免额外开销。

相关文章:

「San」监听DOM变化的方法

在 San框架 中监听组件内部字体大小并调整宽度&#xff0c;可以结合 自定义事件 或 数据绑定 来实现动态调整。San 框架没有直接的监听 DOM 尺寸变化的内置方法&#xff0c;但可以通过以下步骤实现&#xff1a; 方法一&#xff1a;使用 ResizeObserver 监听字体变化 在组件的 …...

如何选择服务器

如何选择服务器 选择服务器时应考虑以下几个关键因素&#xff1a; 性能需求。根据网站的预期流量和负载情况&#xff0c;选择合适的处理器、内存和存储容量。考虑网站是否需要处理大量动态内容或高分辨率媒体文件。 可扩展性。选择一个可以轻松扩展的服务器架构&#xff0c;以便…...

嵌入式驱动面试总结

操作系统&#xff1a; 中断的处理流程&#xff0c;中断处理需要注意些什么 软中断和硬中断区别 linux驱动用过那些锁&#xff0c;信号量&#xff0c;互斥锁 自旋锁和互斥锁的区别 二值信号量和互斥信号量有什么区别 进程锁怎么实现的&#xff0c;说一下流程&#xff1b; …...

Uniapp 简单配置鸿蒙

Uniapp 简单配置鸿蒙 前言下载并配置鸿蒙IDEHbuilder X 配置基本的信息生成相关证书登录官网获取证书IDE配置证书添加调试设备可能出现的问题前言 如今鸿蒙的盛起,作为多端开发的代表也是开始兼容鸿蒙应用的开发,接下来我将介绍如何在uniapp中配置鸿蒙。 注意:hbuilder X的…...

线程池的实现与应用

一、线程池 一种线程使用模式。线程过多会带来调度开销&#xff0c;进而影响缓存局部性和整体性能。而线程池维护着多个线程&#xff0c;等待着监督管理者分配可并发执行的任务。这避免了在处理短时间任务时创建与销毁线程的代价。线程池不仅能够保证内核的充分利用&#xff0c…...

基于Java Springboot单位考勤系统

一、作品包含 源码数据库设计文档万字PPT全套环境和工具资源部署教程 二、项目技术 前端技术&#xff1a;Html、Css、Js、Vue、Element-ui 数据库&#xff1a;MySQL 后端技术&#xff1a;Java、Spring Boot、MyBatis 三、运行环境 开发工具&#xff1a;IDEA/eclipse 数据…...

近源渗透|HID ATTACK从0到1

前言 对于“近源渗透”这一术语&#xff0c;相信大家已经不再感到陌生。它涉及通过伪装、社会工程学等手段&#xff0c;实地侵入企业办公区域&#xff0c;利用内部潜在的攻击面——例如Wi-Fi网络、RFID门禁、暴露的有线网口、USB接口等——获取关键信息&#xff0c;并以隐蔽的…...

【linux】插入新硬盘如何配置:格式化、分区、自动挂载(Ubuntu)

文章目录 具体方法GPT分区表&#xff08;GUID Partition Table&#xff09;&#xff08;建议都用这种分区方法&#xff09;MBR分区表方法&#xff08;最大支持2TB分区&#xff09;&#xff08;Master Boot Record&#xff09; 附加&#xff1a;如何查看硬盘的型号另外&#xff…...

YOLOv8-ultralytics-8.2.103部分代码阅读笔记-block.py

block.py ultralytics\nn\modules\block.py 目录 block.py 1.所需的库和模块 2.class DFL(nn.Module): 3.class Proto(nn.Module): 4.class HGStem(nn.Module): 5.class HGBlock(nn.Module): 6.class SPP(nn.Module): 7.class SPPF(nn.Module): 8.class C1(nn.M…...

代码随想录算法训练营第五十三天|Day53 图论

字符串接龙 https://www.programmercarl.com/kamacoder/0110.%E5%AD%97%E7%AC%A6%E4%B8%B2%E6%8E%A5%E9%BE%99.html 思路 #include <stdio.h> #include <stdlib.h> #include <string.h>#define MAX 1000 // 假设最大字符串数 #define WORD_LENGTH 100 // 假…...

LeetCode:203.移除链表元素

跟着carl学算法&#xff0c;本系列博客仅做个人记录&#xff0c;建议大家都去看carl本人的博客&#xff0c;写的真的很好的&#xff01; 代码随想录 LeetCode&#xff1a;203.移除链表元素 给你一个链表的头节点 head 和一个整数 val &#xff0c;请你删除链表中所有满足 Node.…...

知识见闻 - 数学: 均方根 Root Mean Square

What is Root Mean Square (RMS)? 在统计学上&#xff0c;均方根&#xff08;RMS&#xff09;是均方的平方根&#xff0c;而均方是一组数值的平方的算术平均数。均方根也称为二次均值&#xff0c;是指数为 2 的广义均值的一种特例。均方根也被定义为基于一个周期内瞬时值的平方…...

机器硬件调优

grub参数 ipv6.disable1 ipv6.autoconf0 intel_pstatedisable nohzoff idlepoll intel_idle.max_cstate0 processor.max_cstate0 mceignore_ce nmi_watchdog0 transparent_hugepagenever pcie_aspm.policyperformance audit0 irqaffinity0 nosoftlockup grub2-mkconfig -o /bo…...

如何更改手机GPS定位

你是否曾想过更改手机GPS位置以保护隐私、玩游戏或访问受地理限制的内容&#xff1f;接下来我将向你展示如何使用 MagFone Location Changer 更改手机GPS 位置&#xff01;无论是在玩Pokmon GO游戏、发布社媒贴子&#xff0c;这种方法都快速、简单且有效。 第一步&#xff1a;下…...

HarmonyOS(57) UI性能优化

性能优化是APP开发绕不过的话题&#xff0c;那么在HarmonyOS开发过程中怎么进行性能优化呢&#xff1f;今天就来总结下相关知识点。 UI性能优化 1、避免在组件的生命周期内执行高耗时操作2、合理使用ResourceManager3、优先使用Builder方法代替自定义组件4、参考资料 1、避免在…...

Mysql的加锁情况详解

最近在复习mysql的知识点&#xff0c;像索引、优化、主从复制这些很容易就激活了脑海里尘封的知识&#xff0c;但是在mysql锁的这一块真的是忘的一干二净&#xff0c;一点映像都没有&#xff0c;感觉也有点太难理解了&#xff0c;但是还是想把这块给啃下来&#xff0c;于是想通…...

hive3.1.2编译spark3安装包

此安装包是《去破解站长》在公司真实生产环境所使用的安装包。 引言&#xff1a;Hive引擎包括&#xff1a;默认MR、tez、sparkDownload:www.qupojie.com 1、Hive on Spark 1、Hive onSpark&#xff1a;Hive既作为存储元数据又负责SQL的解析优化&#xff0c;语法是HQL语法&…...

网络安全,文明上网(1)享科技,提素养

前言 在这个信息化飞速发展的时代&#xff0c;科技的快速进步极大地丰富了我们的生活&#xff0c;并为我们提供了无限的可能性。然而&#xff0c;随着网络世界的不断扩张&#xff0c;增强我们的网络素养成为了一个迫切需要解决的问题。 与科技同行&#xff0c;培育网络素养 技术…...

ESP32 烧录问题

ESP32 烧录问题 1.无法连接 Connecting......................................A fatal error occurred: Failed to connect to ESP32: No serial data received.这个表示通过串口连接esp32失败&#xff0c;可能存在多种原因&#xff0c;比如串口选择错误。 所选串口不是连接…...

CnosDB 实时流式计算:优化时序数据处理与降采样解决方案

在处理时序数据时&#xff0c;数据写入周期通常与数据采集设备的频率相关&#xff0c;有时每秒钟就需要处理大量的数据点。长时间处理如此多的数据会导致存储问题。一个有效的解决方案是使用流式计算&#xff0c;将原始数据进行降采样。 流式计算在时序数据库中指对实时数据流…...

k8s从入门到放弃之Ingress七层负载

k8s从入门到放弃之Ingress七层负载 在Kubernetes&#xff08;简称K8s&#xff09;中&#xff0c;Ingress是一个API对象&#xff0c;它允许你定义如何从集群外部访问集群内部的服务。Ingress可以提供负载均衡、SSL终结和基于名称的虚拟主机等功能。通过Ingress&#xff0c;你可…...

Oracle查询表空间大小

1 查询数据库中所有的表空间以及表空间所占空间的大小 SELECTtablespace_name,sum( bytes ) / 1024 / 1024 FROMdba_data_files GROUP BYtablespace_name; 2 Oracle查询表空间大小及每个表所占空间的大小 SELECTtablespace_name,file_id,file_name,round( bytes / ( 1024 …...

智慧工地云平台源码,基于微服务架构+Java+Spring Cloud +UniApp +MySql

智慧工地管理云平台系统&#xff0c;智慧工地全套源码&#xff0c;java版智慧工地源码&#xff0c;支持PC端、大屏端、移动端。 智慧工地聚焦建筑行业的市场需求&#xff0c;提供“平台网络终端”的整体解决方案&#xff0c;提供劳务管理、视频管理、智能监测、绿色施工、安全管…...

8k长序列建模,蛋白质语言模型Prot42仅利用目标蛋白序列即可生成高亲和力结合剂

蛋白质结合剂&#xff08;如抗体、抑制肽&#xff09;在疾病诊断、成像分析及靶向药物递送等关键场景中发挥着不可替代的作用。传统上&#xff0c;高特异性蛋白质结合剂的开发高度依赖噬菌体展示、定向进化等实验技术&#xff0c;但这类方法普遍面临资源消耗巨大、研发周期冗长…...

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

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

RabbitMQ入门4.1.0版本(基于java、SpringBoot操作)

RabbitMQ 一、RabbitMQ概述 RabbitMQ RabbitMQ最初由LShift和CohesiveFT于2007年开发&#xff0c;后来由Pivotal Software Inc.&#xff08;现为VMware子公司&#xff09;接管。RabbitMQ 是一个开源的消息代理和队列服务器&#xff0c;用 Erlang 语言编写。广泛应用于各种分布…...

破解路内监管盲区:免布线低位视频桩重塑停车管理新标准

城市路内停车管理常因行道树遮挡、高位设备盲区等问题&#xff0c;导致车牌识别率低、逃费率高&#xff0c;传统模式在复杂路段束手无策。免布线低位视频桩凭借超低视角部署与智能算法&#xff0c;正成为破局关键。该设备安装于车位侧方0.5-0.7米高度&#xff0c;直接规避树枝遮…...

Spring Security 认证流程——补充

一、认证流程概述 Spring Security 的认证流程基于 过滤器链&#xff08;Filter Chain&#xff09;&#xff0c;核心组件包括 UsernamePasswordAuthenticationFilter、AuthenticationManager、UserDetailsService 等。整个流程可分为以下步骤&#xff1a; 用户提交登录请求拦…...

Python常用模块:time、os、shutil与flask初探

一、Flask初探 & PyCharm终端配置 目的: 快速搭建小型Web服务器以提供数据。 工具: 第三方Web框架 Flask (需 pip install flask 安装)。 安装 Flask: 建议: 使用 PyCharm 内置的 Terminal (模拟命令行) 进行安装,避免频繁切换。 PyCharm Terminal 配置建议: 打开 Py…...

Python环境安装与虚拟环境配置详解

本文档旨在为Python开发者提供一站式的环境安装与虚拟环境配置指南&#xff0c;适用于Windows、macOS和Linux系统。无论你是初学者还是有经验的开发者&#xff0c;都能在此找到适合自己的环境搭建方法和常见问题的解决方案。 快速开始 一分钟快速安装与虚拟环境配置 # macOS/…...