開源個 react 多行縮略組件称杨,支持自定義縮略符肌毅、尾文本過濾、縮略回調(diào)等

背景

入職頭條快一年姑原,平常工作中悬而,不止一次聽到 UI 反饋,頭條 App 內(nèi)的 h5 上偶爾會出現(xiàn)下面這樣的體驗 bug锭汛。

image-20210228170527346

在縮略符 “...” 前面會小概率出現(xiàn)標(biāo)點符號笨奠,看起來很不雅觀。這么長時間這個問題一直沒解決唤殴,因為自己手頭的業(yè)務(wù)有點多也就沒去關(guān)注這個他人需求般婆。

最近剛好弄完績效評估處于需求真空期,剛好想起這個問題眨八,就順手給解決了腺兴,沉淀了個 react 的縮略組件左电×啵考慮到這是個很通用的需求,所以整理了一下開源出來篓足。

先直接上干貨吧段誊,組件已經(jīng)開源在 github 上,倉庫地址: react-ellipsis (覺得有用可以給個 star)栈拖。

可能會有人疑惑连舍,這么常見的需求真的沒有可用的輪子嗎?我一開始也帶著這個疑惑涩哟,搜了一下 npm 和 github索赏,發(fā)現(xiàn)還真沒有能完全符合條件的...

那就自己來造一個吧 -。-

造輪子前

在準(zhǔn)備動手解決問題前贴彼,我瀏覽了一下 npm 和 github 上已有的縮略組件潜腻,根據(jù) star 數(shù)挑幾個看看

react-lines-ellipsis

截止發(fā)文

  • stars 數(shù) 376
  • 未處理 issue 15
  • 上次功能更新 2 年前

問題:

  • 不支持結(jié)尾標(biāo)點符號過濾,只能過濾空白符(可通過 pr 解決器仗,但是作者很長時間未處理 pr 了)

  • 每個 ellipsis 組件都會生成一個隱藏的 div 去計算融涣,性能損耗嚴(yán)重

    image
  • 不支持設(shè)置高度縮略

react-truncate

截止發(fā)文

  • stars 數(shù) 503
  • 未處理 issue 33
  • 上次功能更新 8 月前

問題:

  • 不支持結(jié)尾標(biāo)點符號過濾童番,只能過濾空白符
  • 不支持按單詞或字母切割
  • onResize 需要自行調(diào)用
  • 使用 canvas 實現(xiàn),當(dāng)元素較多時性能損耗嚴(yán)重

其他組件或多或少都有各自的問題導(dǎo)致無法滿足我們的需求威鹿,所以動手自己擼吧剃斧。

輪子介紹

吭哧吭哧搞了一個下午就寫完了,目前迭代到 0.5.2 版本忽你。

先看個簡單的示例

image

提示:容器拉伸是為了方便演示加的幼东,實際組件不包含拉伸功能。

已經(jīng)實現(xiàn)和計劃中的功能:

已完成功能

  • 自定義縮略符
  • 自定義縮略符節(jié)點
  • 尾字符過濾
  • 縮略回調(diào)
  • 縮略符點擊回調(diào)
  • 自適應(yīng)

計劃中

  • 按單詞或字母分割
  • 支持內(nèi)容換行
  • 支持收起符
  • ResizeObserver 不支持時用 window.onresize 兼容

具體功能和示例可以查看 react-ellipsis 文檔

Q & A

  • 如何保障性能檀夹?

    切割算法上筋粗,其他組件大多是通過切割成字符數(shù)組后,一個個減少直到容器不再溢出炸渡,時間復(fù)雜度是 O(n)娜亿。react-ellipsis-component 使用二分切割將時間復(fù)雜度降到 O(logn)。

    計算時在原容器上計算蚌堵,其他組件使用隱藏的 div 或者 canvas买决,當(dāng) ellipsis 組件很多時性能損耗嚴(yán)重。

    在自適應(yīng)上吼畏,使用 ResizeObserver 實現(xiàn)督赤,而其他組件使用 window.onresize(性能損耗比較大)。

  • 兼容性

    兼容性主要在于 ResizeObserver 實現(xiàn)的自適應(yīng)縮略泻蚊,如果不需要自適應(yīng)縮略躲舌,可以覆蓋絕大部分的現(xiàn)代瀏覽器。組件本身除了 react 不依賴其他庫性雄,兼容性有保證没卸。

    后續(xù)會添加 window.onresize 的兼容邏輯進(jìn)一步提高兼容性。

    附:ResizeObserver 兼容性表

    image
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末秒旋,一起剝皮案震驚了整個濱河市约计,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌迁筛,老刑警劉巖煤蚌,帶你破解...
    沈念sama閱讀 217,542評論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異细卧,居然都是意外死亡尉桩,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,822評論 3 394
  • 文/潘曉璐 我一進(jìn)店門贪庙,熙熙樓的掌柜王于貴愁眉苦臉地迎上來蜘犁,“玉大人,你說我怎么就攤上這事插勤」潦荩” “怎么了革骨?”我有些...
    開封第一講書人閱讀 163,912評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長析恋。 經(jīng)常有香客問我良哲,道長,這世上最難降的妖魔是什么助隧? 我笑而不...
    開封第一講書人閱讀 58,449評論 1 293
  • 正文 為了忘掉前任筑凫,我火速辦了婚禮,結(jié)果婚禮上并村,老公的妹妹穿的比我還像新娘巍实。我一直安慰自己,他們只是感情好哩牍,可當(dāng)我...
    茶點故事閱讀 67,500評論 6 392
  • 文/花漫 我一把揭開白布棚潦。 她就那樣靜靜地躺著,像睡著了一般膝昆。 火紅的嫁衣襯著肌膚如雪丸边。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,370評論 1 302
  • 那天荚孵,我揣著相機(jī)與錄音妹窖,去河邊找鬼。 笑死收叶,一個胖子當(dāng)著我的面吹牛骄呼,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播判没,決...
    沈念sama閱讀 40,193評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼蜓萄,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了哆致?” 一聲冷哼從身側(cè)響起绕德,我...
    開封第一講書人閱讀 39,074評論 0 276
  • 序言:老撾萬榮一對情侶失蹤患膛,失蹤者是張志新(化名)和其女友劉穎摊阀,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體踪蹬,經(jīng)...
    沈念sama閱讀 45,505評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡胞此,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,722評論 3 335
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了跃捣。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片漱牵。...
    茶點故事閱讀 39,841評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖疚漆,靈堂內(nèi)的尸體忽然破棺而出酣胀,到底是詐尸還是另有隱情刁赦,我是刑警寧澤,帶...
    沈念sama閱讀 35,569評論 5 345
  • 正文 年R本政府宣布闻镶,位于F島的核電站甚脉,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏铆农。R本人自食惡果不足惜牺氨,卻給世界環(huán)境...
    茶點故事閱讀 41,168評論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望墩剖。 院中可真熱鬧猴凹,春花似錦、人聲如沸岭皂。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,783評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽爷绘。三九已至歹篓,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間揉阎,已是汗流浹背庄撮。 一陣腳步聲響...
    開封第一講書人閱讀 32,918評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留毙籽,地道東北人洞斯。 一個月前我還...
    沈念sama閱讀 47,962評論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像坑赡,于是被迫代替她去往敵國和親烙如。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,781評論 2 354

推薦閱讀更多精彩內(nèi)容