Javascript 在React16中的长字符串中间添加省略号
我试图在字符串的中点添加省略号,但出现以下复杂情况:Javascript 在React16中的长字符串中间添加省略号,javascript,string,render,react-16,Javascript,String,Render,React 16,我试图在字符串的中点添加省略号,但出现以下复杂情况: 我不知道绳子会有多长 我只知道父元素的最大宽度和最小宽度 字符串可能适合也可能不适合其父字符串,并且不需要省略号 我有一个例子来说明这一点。脚本仅假设一个实例,但您应该了解: (function(){ // variables var parent = document.querySelectorAll(".wrapper")[0], parentWidth = parent.clientWidth,x = 0,
- 我不知道绳子会有多长
- 我只知道父元素的最大宽度和最小宽度
- 字符串可能适合也可能不适合其父字符串,并且不需要省略号
(function(){
// variables
var parent = document.querySelectorAll(".wrapper")[0],
parentWidth = parent.clientWidth,x = 0, elem, hellip
txtStr = document.querySelector("#shorten"),
strWidth = txtStr.clientWidth,
strTxt = txtStr.innerText,
ending = document.createElement("span"),
endTxt = strTxt.slice(Math.max(strTxt.length - (strTxt.length / 4))) || endTxt;
txtStr.style.overflow = "hidden"
txtStr.style.textOverflow = "ellipsis"
ending.appendChild(document.createTextNode(endTxt))
ending.classList.add("ellipsis")
document.querySelectorAll(".wrapper")[0].appendChild(ending)
var ell = function(a, b){
if (a <= b){
ending.classList.add("visible")
}
else {
ending.classList.remove("visible")
}
}
ell(parentWidth, strWidth) // We need to display any changes immediately
window.onresize = function(){ // if the window is resized, we also need to display changes
hellip = document.querySelectorAll(".ellipsis")[0].clientWidth
parentWidth = parent.clientWidth
// the use of 'calc()' is because the length of string in px is never known
txtStr.style.width = "calc(100% - " + hellip + "px"
ell(parentWidth, strWidth)
}
})();
(函数(){
//变数
var parent=document.querySelectorAll(“.wrapper”)[0],
parentWidth=parent.clientWidth,x=0,元素,hellip
txtStr=document.querySelector(“#shorten”),
strWidth=txtStr.clientWidth,
strText=txtStr.innerText,
结束=document.createElement(“span”),
endTxt=strTxt.slice(Math.max(strTxt.length-(strTxt.length/4))| | endTxt;
txtStr.style.overflow=“隐藏”
txtStr.style.textOverflow=“省略号”
ending.appendChild(document.createTextNode(endTxt))
结束.classList.add(“省略号”)
document.querySelectorAll(“.wrapper”)[0]。appendChild(结束)
var ell=函数(a,b){
如果(a感谢大家关注这一点,但我设法解决了问题
一旦我找到了生命周期的诀窍,它实际上仍然相当棘手。问题是测量原始文本字符串。现在回想起来,它似乎无关紧要
本质上,我将一些元素作为道具传递到组件中:id、任何所需的填充、上下文所需的结束文本的长度和文本(子项)
一旦它们进入,我需要等到它被装载,直到我可以做任何事情,因为这一切都取决于呈现的DOM。因此,componentDidMount()和componentDidUpdate()是我感兴趣的阶段。componentWillUnmount()用于删除关联的事件侦听器,在本例中,该侦听器是一个调整大小事件
安装后,我可以获得测量所需的位:元素,更重要的是,它的父元素
getElements(){
return {
parent: this.ellipsis.offsetParent,
string: this.props.children
}
}
然后,我需要确保我可以实际测量元素,因此实现一些内联样式以实现这一点:
prepareParentForMeasure(){
if(this.getElements().parent != null){
this.getElements().parent.style.opacity = 0.001
this.getElements().parent.style.overflow = 'visible'
this.getElements().parent.style.width = 'auto'
}
}
一旦我有了这些测量,我就删除了样式
在这一点上,如果我沿着相同的路径继续,脚本将部分工作。然而,添加一个额外的元素作为向导是关键
返回的元素分为三个元素(span标记),每个都有不同的用途。有文本的主位,或者this.props.children,如果您愿意的话。这是始终可用的,并且从不更改。下一个是文本的尾部,字符串末尾用于上下文显示字符串结尾的“n”个字符数-这是一个“省略号”类,尽管llipsis实际上被添加到原始元素和第一个元素中。第三个元素本质上与第一个元素完全相同,但它是隐藏的和不可理解的,尽管它确实有维度。这是因为前两个元素(渲染时)具有不同的宽度,并且不能依赖于它们,因为两者都有助于元素的宽度,而第三个元素有没有
<Fragment>
<span className='text'>{this.props.children}</span>
<span className='ellipsis'>{this.tail()}</span>
<span className='text guide' ref={node => this.ellipsis = node}>
{this.props.children}</span>
</Fragment>
{this.props.children}
{this.tail()}
this.ellipsis=node}>
{this.props.children}
它们位于片段中,因此不需要周围的元素
因此,我有周围父元素的宽度和文本元素的宽度(在第三个跨度中)这意味着,如果我发现文本字符串比周围的包装器宽,我将一个类添加到“可见”的省略号范围,一个到“修剪”的“文本”元素,在字符串的中间得到一个省略号,并且我使用调整大小事件来确保如果有人这样做,所有的测量都被重做,并且数据是重新计算的。ted和相应的呈现。为发布答案干杯这不是一件平常的事,但为好奇的人提供一点帮助是一件好事。我不能把所有的东西都放在这里,真是遗憾。你可以随时共享github reponop。不能这样做。这是专有的,我确实关心一些事情\