在React with Hooks和redux中计算javascript中的文本行
我一直在寻找实现一个解决方案,使用React钩子和Redux计算React(用Typescript编写)中元素的行 我从成员那里找到并喜欢的一个jquery实现,它有9票,唯一的原因是 “适用于所有浏览器,但很少有功能超出标准。” 在我目前从事的项目中,我们也实现了jquery(不要问为什么我们将两者混为一谈,这不是我们的决定)。。。因此,最初我尝试在jquery中使用它。而且很有效!!下面的代码完成了这项工作在React with Hooks和redux中计算javascript中的文本行,javascript,html,jquery,reactjs,react-hooks,Javascript,Html,Jquery,Reactjs,React Hooks,我一直在寻找实现一个解决方案,使用React钩子和Redux计算React(用Typescript编写)中元素的行 我从成员那里找到并喜欢的一个jquery实现,它有9票,唯一的原因是 “适用于所有浏览器,但很少有功能超出标准。” 在我目前从事的项目中,我们也实现了jquery(不要问为什么我们将两者混为一谈,这不是我们的决定)。。。因此,最初我尝试在jquery中使用它。而且很有效!!下面的代码完成了这项工作 const calculate=(obj:JQuery)=>{ 设cloned=ob
const calculate=(obj:JQuery)=>{
设cloned=obj.clone(true,true);
cloned.html('a
b').hide().appendTo(parentClass);
设大小=克隆?.height()!/2;
克隆。删除();
设noOfLines=obj?.height()!/size;
return Math.trunc(noOfLines);
}
addEventListener(“调整大小”,()=>{
let element=$(“#calculateLines”);
if(元素){
让线=计算(元素);
控制台日志(行);
}
});
然而,我真的很想尝试“翻译”这个,而不是使用jquery
因此,我有以下片段:
const calculateNotInJQuery=(obj:HTMLElement)=>{
将clone=obj.cloneNode(true)作为HTMLElement;
让tempElement=document.createElement('p');
tempElement.innerHTML=“a
b”;
setAttribute(“类型”、“隐藏”);
让parentElement=document.getElementById('someParentClass');
克隆的.appendChild(tempElement)
parentElement?.appendChild(克隆);
设size=cloned.clientHeight/2;
克隆。删除();
设noOfLines=((obj.clientHeight/size);
return Math.trunc(noOfLines);
}
addEventListener(“调整大小”,()=>{
let element=$(“#calculateLines”);
if(元素){
让线=计算(元素);
控制台日志(行);
}
});
最后一行始终返回1。如果我删除Math.trunc,它将接受从0到1的值。
我知道我很难“翻译”这句话:
cloned.html('a<br>b').hide().appendTo(parentClass);
cloned.html('a
b').hide().appendTo(parentClass);
我认为它说的是:我们为克隆的节点创建一些html,隐藏它,然后将它附加到父元素
所以我试着做一些类似的事情,但我不知道我的逻辑哪里错了:
let cloned = obj.cloneNode(true) as HTMLElement;
let tempElement = document.createElement('p');
tempElement.innerHTML = "a<br></br>b";
tempElement.setAttribute("type", "hidden");
let parentElement = document.getElementById('someParentClass');
cloned.appendChild(tempElement)
parentElement?.appendChild(cloned);
let cloned=obj.cloneNode(true)作为HTMLElement;
让tempElement=document.createElement('p');
tempElement.innerHTML=“a
b”;
setAttribute(“类型”、“隐藏”);
让parentElement=document.getElementById('someParentClass');
克隆的.appendChild(tempElement)
parentElement?.appendChild(克隆);
我们将一如既往地感谢您的任何建议。
提前谢谢你
[编辑]
根据他的建议,我创建了解决方案,还创建了一个沙盒,因为它似乎有什么问题
沙箱是一个很好的工具
发生的事情是
在展开和收拢文本之间发生了什么,使我的行数出现了错误?您提到的答案的主要思想是:
useRef()
存储对容器的引用useffect()
中,计算容器的高度,然后除以假定的行高度(在“getLineHeight”中计算)numberOfLines
状态countLines
函数进行去盎司/节流,因为resize
事件被多次调用,重复添加、测量并从DOM中删除元素会给UI线程带来压力
const{useRef,useState,useffect}=React;
常量getLineHeight=el=>{
常数cl=el.cloneNode();
cl.style.visibility='隐藏';
cl.style.position=‘绝对’;
cl.innerHTML='a
b';
文件.正文.附件(cl);
const{height}=cl.getBoundingClientRect();
cl.删除();
返回高度/2;
};
常量useCountLines=()=>{
const targetRef=useRef();
常量[numberOfLines,setNumberOfLines]=useState(null);
useffect(()=>{
常数countLines=()=>{
如果(!targetRef.current)返回;
const{height}=targetRef.current.getBoundingClientRect();
const lineHeight=getLineHeight(targetRef.current);
setNumberOfLines(Math.trunc(高度/线宽));
};
countLines();
window.addEventListener('resize',countLines);
return()=>{
removeEventListener('resize',countLines);
};
}, []);
返回[numberOfLines,targetRef];
}
常量演示=()=>{
常量[numberOfLines,targetRef]=useCountLines();
控制台日志(行数);
返回(
Lorem ipsum dolor sit amet,在odio ultricies tortor aliquet moll公司担任高级顾问