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

【taro react】---- 获取元素的位置和宽高等信息

1. 需求分析

  1. 添加节点的布局位置的查询请求。相对于显示区域,以像素为单位。其功能类似于 DOM 的 getBoundingClientRect。返回 NodesRef 对应的 SelectorQuery。
  2. 区分小程序和H5的环境,调用 getBoundingClientRect 获取对应的信息。

2. H5 实现

  1. 判断传入元素是否是window窗口,是window窗口,直接获取窗口的宽高;
  2. 元素,同时可以获取元素的宽高等信息;
  3. 都不满足,返回默认值。
function isWindow(val){return val === window
}export const getRect = (elementRef) => {const element = elementRef// 判断传入元素是否是window窗口,是window窗口,直接获取窗口的宽高if (isWindow(element)) {const width = element.innerWidthconst height = element.innerHeightreturn {top: 0,left: 0,right: width,bottom: height,width,height,}}// 是元素,同时可以获取元素的宽高等信息if (element && element.getBoundingClientRect) {return element.getBoundingClientRect()}// 都不满足,返回默认值return {top: 0,left: 0,right: 0,bottom: 0,width: 0,height: 0,}
}

3. Taro 实现

  1. 元素存在,判断使用对应环境获取元素信息;
  2. H5环境使用元素的获取元素信息方法;
  3. 微信小程序环境调用 boundingClientRect 获取元素信息;
  4. 返回默认值。
export const getRectByTaro = async (element) => {// 元素存在,判断使用对应环境获取元素信息if (element) {if(process.env.TARO_ENV === "h5"){// H5环境使用元素的获取元素信息方法return Promise.resolve(getRect(element))} else if(process.env.TARO_ENV === "weapp"){// 微信小程序环境调用 boundingClientRect 获取元素信息return new Promise((resolve) => {createSelectorQuery().select(`.${element.props.class.split(' ').filter(item => item).join('.')}`).boundingClientRect(resolve).exec()})}}// 返回默认值return Promise.resolve({top: 0,left: 0,right: 0,bottom: 0,width: 0,height: 0,})
}

4. 使用实例

1. 引入

import React, { Component } from 'react';
import { getRectByTaro } from '@utils/use-client-rect';

2. 获取 dom 的 getBoundingClientRect 信息

class page extends Component {constructor(props) {this.navbarRef = React.createRef()}componentDidShow(){// 如果元素内有动态信息,需要将获取信息的方法放到请求数据完成,设置数据后边this.getElementInfo()}getElementInfo(){let _this = this;let timer = setTimeout(async () => {clearTimeout(timer)console.log('_this.navbarRef',_this.navbarRef.current)let info = await getRectByTaro(_this.navbarRef.current)console.log('navbarRef', info)},0)}render() {return (<View className='rui-navbar-current-content' ref={this.navbarRef}></View>)}
}

5. 微信小程序返回样例

输入图片说明

6. H5 返回样例

输入图片说明

7. 完整代码

import { createSelectorQuery } from '@tarojs/taro';
function isWindow(val){return val === window
}export const getRect = (elementRef) => {const element = elementRef// 判断传入元素是否是window窗口,是window窗口,直接获取窗口的宽高if (isWindow(element)) {const width = element.innerWidthconst height = element.innerHeightreturn {top: 0,left: 0,right: width,bottom: height,width,height,}}// 是元素,同时可以获取元素的宽高等信息if (element && element.getBoundingClientRect) {return element.getBoundingClientRect()}// 都不满足,返回默认值return {top: 0,left: 0,right: 0,bottom: 0,width: 0,height: 0,}
}export const getRectByTaro = async (element) => {// 元素存在,判断使用对应环境获取元素信息if (element) {if(process.env.TARO_ENV === "h5"){// H5环境使用元素的获取元素信息方法return Promise.resolve(getRect(element))} else if(process.env.TARO_ENV === "weapp"){// 微信小程序环境调用 boundingClientRect 获取元素信息return new Promise((resolve) => {createSelectorQuery().select(`.${element.props.class.split(' ').filter(item => item).join('.')}`).boundingClientRect(resolve).exec()})}}// 返回默认值return Promise.resolve({top: 0,left: 0,right: 0,bottom: 0,width: 0,height: 0,})
}

相关文章:

【taro react】---- 获取元素的位置和宽高等信息

1. 需求分析 添加节点的布局位置的查询请求。相对于显示区域&#xff0c;以像素为单位。其功能类似于 DOM 的 getBoundingClientRect。返回 NodesRef 对应的 SelectorQuery。区分小程序和H5的环境&#xff0c;调用 getBoundingClientRect 获取对应的信息。 2. H5 实现 判断传…...

Java【Spring】项目创建、存储和获取 Bean 的基本方式

文章目录 前言一、创建 Spring 项目1, 创建 Maven 项目2, 添加 Spring 依赖3, 创建启动类 二、存储 Bean 的基本方式1, 创建 Bean2, 存储 Bean 三、获取 Bean 的基本方式1, 获取上下文对象2, 获取 Bean3, 使用 Bean 总结 前言 各位读者好, 我是小陈, 这是我的个人主页, 希望我的…...

docker minio安装

1.介绍 Minio是一款开源的对象存储服务&#xff0c;它可以在任何硬件或云平台上提供高性能、高可用性和高安全性的存储解决方案。Minio最新版是2021年11月发布的RELEASE.2021-11-24T23-19-33Z&#xff0c;它带来了以下几个方面的改进和新特性&#xff1a; - 支持S3 Select AP…...

设计模式-命令模式在Java中的使用示例-桌面程序自定义功能键

场景 欲开发一个桌面版应用程序&#xff0c;该应用程序为用户提供了一系列自定义功能键&#xff0c;用户可以通过这些功能键来实现一些快捷操作。 用户可以将功能键和相应功能绑定在一起&#xff0c;还可以根据需要来修改功能键的设置&#xff0c;而且系统在未来可能还会增加…...

分冶算法 剑指 07 重建二叉树 排序算法:剑指45 把数组排成最小的数 10-I 斐波那契数列

来记录几个注意事项 1.vector容器里利用find&#xff08;&#xff09;函数 不同于map&#xff08;map有find方法&#xff09;&#xff0c;vector本身是没有find这一方法&#xff0c;其find是依靠algorithm来实现的。 所以要包含头文件 #include <iostream> #include <…...

Postgresql取消正在执行的任务或强制终止正在执行的任务

Postgresql取消正在执行的任务或强制终止正在执行的任务 要停止 PostgreSQL 数据库中当前正在执行的所有任务&#xff0c;可以使用以下方法&#xff1a; 使用 pg_cancel_backend 函数&#xff1a;连接到 PostgreSQL 数据库&#xff0c;并执行以下命令以停止所有正在执行的任务…...

【Linux】Centos7 的 Systemctl 与 创建系统服务 (shell脚本)

Systemctl systemctl 命令 # 启动 systemctl start NAME.service # 停止 systemctl stop NAME.service # 重启 systemctl restart NAME.service # 查看状态 systemctl status NAME.service # 查看所有激活系统服务 systemctl list-units -t service # 查看所有系统服务 syste…...

Redis集群Cluster搭建

Redis集群Cluster搭建 集群框架1、下载redis2.创建Cluster文件3.修改redis配置文件4.启动redis5.链接各个redis6.分配槽位7.添加从机节点&#xff08;备份Redis&#xff09;8.以集群方式登录9.使用开源Redis可视化客户端链接 集群框架 三个集群节点&#xff0c;每个节点有个副本…...

swing组件应用

1. 组件概述 &#xff08;1&#xff09; 说明 组件组成Java 的图形界面的各个元素&#xff0c;按照不同的功能&#xff0c;可分为 顶层容器、中间容器、基本组件。顶层容器为java.awt.Window的子类&#xff0c;有JFrame、JDialog等。中间容器和基础组件都为javax.swing.JCompo…...

Spring学习记录----十五、面向切面编程AOP+十六、Spring对事务的支持

十五、面向切面编程AOP IoC使软件组件松耦合。AOP让你能够捕捉系统中经常使用的功能&#xff0c;把它转化成组件。 AOP&#xff08;Aspect Oriented Programming&#xff09;&#xff1a;面向切面编程&#xff0c;面向方面编程。&#xff08;AOP是一种编程技术&#xff09; …...

Color Correction (颜色校正)

介绍 在Unity中&#xff0c;Color Correction (颜色校正) 是一种用于调整场景或游戏画面颜色的技术。其中&#xff0c;Curves&#xff08;曲线&#xff09;和Saturation&#xff08;饱和度&#xff09;是常用的Color Correction工具。通过Curves&#xff0c;可以对RGB通道进行…...

Unity-缓存池

一、.基础缓存池实现 继承的Singleton脚本为 public class Singleton<T> where T : new() {private static T _instance;public static T GetIstance(){if (_instance null)_instance new T();return _instance;} } 1.PoolManager using System.Collections; using S…...

ubuntu samba 配置常见问题

samba配置&#xff1a; sudo vi /etc/samba/smb.conf [xxx 共享文件名] comment share folder browseable yes writable yes guest ok yes path /workdir/code/favarite create mask 0777 directory mask 0777 sudo /etc/init.d/smbd restart 重启smb服务 以上操作…...

vue3.3-TinyMCE:TinyMCE富文本编辑器基础使用

一、TinyMCE官网 GitHub - tinymce/tinymce TinyMCE中文文档中文手册 二、官网介绍 TinyMCE是一款易用、且功能强大的所见即所得的富文本编辑器。同类程序有&#xff1a;UEditor、Kindeditor、Simditor、CKEditor、wangEditor、Suneditor、froala等等。 TinyMCE的优势&…...

基于以太坊+IPFS的去中心化数据交易方法及平台

自己的论文&#xff0c;哎费事 目录 基于以太坊IPFS的去中心化数据交易方法及平台 基于以太坊IPFS的去中心化数据交易方法及平台 摘要&#xff1a; 数据交易过程中存在数据权属不明和数据安全问题。本文开发了一种基于以太坊IPFS的去中心化数据交易方法及平台。方法包括&am…...

NestJS 的 拦截器 学习

拦截器会用到RxJs&#xff0c;所以在学习拦截器之前可以先了解一下它。 拦截器是使用Injectable()装饰器装饰的类并且实现了接口NestInterceptor。 拦截器受到 AOP(面向切面编程)技术的启发&#xff0c;具有如下的功能&#xff1a; 在方法执行之前/之后绑定额外的逻辑转换函…...

Spring AOP 中的代理对象是怎么创建出来的?

文章目录 1. AOP 用法2. 原理分析2.1 doCreateBean2.2 postProcessAfterInitialization2.3 getAdvicesAndAdvisorsForBean2.3.1 findCandidateAdvisors2.3.2 findAdvisorsThatCanApply2.3.3 extendAdvisors 2.4 createProxy 今天和小伙伴们聊一聊 Spring AOP 中的代理对象是怎么…...

解决@Scope(“prototype“)不生效的问题

目录 Scope(“prototype“)不生效Scope(“prototype“)正确用法——解决Bean多例问题 1.问题&#xff0c;Spring管理的某个Bean需要使用多例2.问题升级3. Spring给出的解决问题的办法&#xff08;解决Bean链中某个Bean需要多例的问题&#xff09; Scope(“prototype“)不生效 …...

Mybatis 知识点

Mybatis 知识点 1.1 Mybatis 简介 1.1.1 什么是 Mybatis Mybatis 是一款优秀的持久层框架支持定制化 SQL、存储过程及高级映射Mybatis 几乎避免了所有的 JDBC 代码和手动设置参数以及获取结果集MyBatis 可以使用简单的 XML 或注解来配置和映射原生类型、接口和 Java 的 POJO…...

PHP中关于is,between,in等运算符的用法是什么?

我们学习了解了这么多关于PHP的知识&#xff0c;不知道你们对PHP中关于is&#xff0c;between&#xff0c;in等运算符的用法是什么&#xff1f;是否已经完全掌握了呢&#xff0c;如果没有&#xff0c;那就跟随本篇文章一起继续学习吧 相关推荐&#xff1a;关于PHP中的增删改如…...

为什么需要建设工程项目管理?工程项目管理有哪些亮点功能?

在建筑行业&#xff0c;项目管理的重要性不言而喻。随着工程规模的扩大、技术复杂度的提升&#xff0c;传统的管理模式已经难以满足现代工程的需求。过去&#xff0c;许多企业依赖手工记录、口头沟通和分散的信息管理&#xff0c;导致效率低下、成本失控、风险频发。例如&#…...

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…...

css的定位(position)详解:相对定位 绝对定位 固定定位

在 CSS 中&#xff0c;元素的定位通过 position 属性控制&#xff0c;共有 5 种定位模式&#xff1a;static&#xff08;静态定位&#xff09;、relative&#xff08;相对定位&#xff09;、absolute&#xff08;绝对定位&#xff09;、fixed&#xff08;固定定位&#xff09;和…...

2025盘古石杯决赛【手机取证】

前言 第三届盘古石杯国际电子数据取证大赛决赛 最后一题没有解出来&#xff0c;实在找不到&#xff0c;希望有大佬教一下我。 还有就会议时间&#xff0c;我感觉不是图片时间&#xff0c;因为在电脑看到是其他时间用老会议系统开的会。 手机取证 1、分析鸿蒙手机检材&#x…...

Mysql中select查询语句的执行过程

目录 1、介绍 1.1、组件介绍 1.2、Sql执行顺序 2、执行流程 2.1. 连接与认证 2.2. 查询缓存 2.3. 语法解析&#xff08;Parser&#xff09; 2.4、执行sql 1. 预处理&#xff08;Preprocessor&#xff09; 2. 查询优化器&#xff08;Optimizer&#xff09; 3. 执行器…...

AirSim/Cosys-AirSim 游戏开发(四)外部固定位置监控相机

这个博客介绍了如何通过 settings.json 文件添加一个无人机外的 固定位置监控相机&#xff0c;因为在使用过程中发现 Airsim 对外部监控相机的描述模糊&#xff0c;而 Cosys-Airsim 在官方文档中没有提供外部监控相机设置&#xff0c;最后在源码示例中找到了&#xff0c;所以感…...

MySQL 主从同步异常处理

阅读原文&#xff1a;https://www.xiaozaoshu.top/articles/mysql-m-s-update-pk MySQL 做双主&#xff0c;遇到的这个错误&#xff1a; Could not execute Update_rows event on table ... Error_code: 1032是 MySQL 主从复制时的经典错误之一&#xff0c;通常表示&#xff…...

在golang中如何将已安装的依赖降级处理,比如:将 go-ansible/v2@v2.2.0 更换为 go-ansible/@v1.1.7

在 Go 项目中降级 go-ansible 从 v2.2.0 到 v1.1.7 具体步骤&#xff1a; 第一步&#xff1a; 修改 go.mod 文件 // 原 v2 版本声明 require github.com/apenella/go-ansible/v2 v2.2.0 替换为&#xff1a; // 改为 v…...

《信号与系统》第 6 章 信号与系统的时域和频域特性

目录 6.0 引言 6.1 傅里叶变换的模和相位表示 6.2 线性时不变系统频率响应的模和相位表示 6.2.1 线性与非线性相位 6.2.2 群时延 6.2.3 对数模和相位图 6.3 理想频率选择性滤波器的时域特性 6.4 非理想滤波器的时域和频域特性讨论 6.5 一阶与二阶连续时间系统 6.5.1 …...

flow_controllers

关键点&#xff1a; 流控制器类型&#xff1a; 同步&#xff08;Sync&#xff09;&#xff1a;发布操作会阻塞&#xff0c;直到数据被确认发送。异步&#xff08;Async&#xff09;&#xff1a;发布操作非阻塞&#xff0c;数据发送由后台线程处理。纯同步&#xff08;PureSync…...