最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

React文字展開收起組件的實(shí)現(xiàn)示例

 更新時(shí)間:2022年07月13日 10:06:02   作者:小黑豆豆  
本文主要介紹了React文字展開收起組件的實(shí)現(xiàn)示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧

前言

最近想把在項(xiàng)目中封裝的一些公用組件奉獻(xiàn)出來(lái),畢竟獨(dú)樂(lè)樂(lè)不如眾樂(lè)樂(lè),好東西就要大家分享。這次還是來(lái)聊實(shí)戰(zhàn),主題就是文字展開收起組件的實(shí)現(xiàn)過(guò)程,這個(gè)需求在前端項(xiàng)目中也算常見的需求了,可能你已經(jīng)在項(xiàng)目中使用了自己或別人封裝的組件,但是這次還是希望你能耐心地看看我的實(shí)現(xiàn)過(guò)程,畢竟多一個(gè)思路也會(huì)讓你在后續(xù)的工作中游刃有余。

背景

老規(guī)矩,實(shí)戰(zhàn)項(xiàng)目必有背景。那還是先來(lái)聊聊這個(gè)文字展開收起組件產(chǎn)生的需求背景,需求其實(shí)就是要你把多余的文字省略顯示,然后有展開收起的按鈕可以操作。對(duì),就是這么直白,上圖:

上圖是文字收起的圖示,超過(guò)一定的字?jǐn)?shù)那就收起省略顯示,并出現(xiàn)查看全部按鈕。

上圖顯示的就是操作了查看全部按鈕之后,文字需要全部顯示出來(lái)并有收起按鈕。還是來(lái)看一張gif圖的顯示最后該組件完成后的效果,如下圖:

開發(fā)

該組件還是使用React+typescript的技術(shù)棧,所以還是之前的老話,如果不是此技術(shù)棧的同學(xué)就只有參考實(shí)現(xiàn)思路,后續(xù)待不忙時(shí)再來(lái)提供其他技術(shù)棧對(duì)應(yīng)的版本。

文字展開收起組件的開發(fā)就沒有啥思考的點(diǎn),就只需要在做的時(shí)候考慮一定字?jǐn)?shù)這個(gè)問(wèn)題,超過(guò)它截取文字并加上...,然后展開時(shí)展示所有文字即可,其它的操作基本是常規(guī)操作。話不多說(shuō),直接往下看→

1.1 定義組件所需字段

interface IndexProps {
    content: string;    // 文本內(nèi)容
    maxLen?: number;   // 文字最大顯示長(zhǎng)度
    expandText?: string; // 展開按鈕文字
    collapseText?: string; // 收起按鈕文字
    contentRender: (text: string, handler: React.ReactNode) => React.ReactNode; // 自定義內(nèi)容
    onExpand?: (expanded: boolean) => void; // 展開、收起后觸發(fā)
}

可以看到文字展開收起組件需要用到上述6個(gè)字段,其中contentcontentRender是必須傳入的,否則組件會(huì)報(bào)錯(cuò),其他字段皆為可選字段,需要時(shí)就傳入不需要就會(huì)使用組件定義的默認(rèn)值。

1.2 獲取截?cái)嗪蟮奈淖?/h3>

獲取截?cái)嗪蟮奈淖?,其?shí)是根據(jù)字段maxLen來(lái)自動(dòng)獲取,maxLen設(shè)置的默認(rèn)值為300,即超過(guò)300個(gè)文字之后就會(huì)被截?cái)唷?code>maxLen的值是可以修改的,若你設(shè)置為200,即文字超過(guò)200就會(huì)被截取,故其為可選字段。代碼如下:

/**
 * 獲取截?cái)嗪蟮奈淖?
 * @param text
 */
const getText = (text: string): string => {
    return (text || '').slice(0, maxLen) + '...'
}

1.3 獲取展開收起按鈕

細(xì)心的小伙伴可以從1.1定義的字段中可以看到,其中contentRender這個(gè)字段代表的意思為自定義內(nèi)容,即該組件的內(nèi)容是可以自定義的。因?yàn)樵谠O(shè)計(jì)的時(shí)候,就考慮到該組件應(yīng)用的場(chǎng)景可能有點(diǎn)多,所以希望它是可以根據(jù)不同的需求場(chǎng)景來(lái)進(jìn)行自定義的,所以該組件的render內(nèi)容就只有此方法,如下:

return (
    <>{contentRender(body, getExpandBtn())}</>
)

contentRender方法其實(shí)接收兩個(gè)參數(shù):text代表文本內(nèi)容,其實(shí)就是傳入的content,只不過(guò)它會(huì)根據(jù)判斷條件判斷是否被截??;在組件加載時(shí),就會(huì)對(duì)其進(jìn)行如下判斷:

useEffect(() => {
    let contentBody = content || '';
    if (contentBody.length > maxLen) {
        contentBody = getText(contentBody);
        setShowBtn(true);
    }
    setBody(contentBody);
    return () => {
        setExpanded(false);
        setShowBtn(false);
    }
}, [content]);

通過(guò)上述代碼可以獲取到需要渲染的文本內(nèi)容,然后將其賦值給body,即它就是contentRender方法接收的第一個(gè)參數(shù)。

而第二個(gè)參數(shù)handler其實(shí)就是這里將要說(shuō)的,獲取展開收起按鈕的方法。如下:

/**
 * 獲取展開收起按鈕
 * @param status
 */
const getExpandBtn = (): React.ReactNode => (
    showBtn ? (
        <span
            className="custom-text-expanded-handler"
            onClick={() => expandToggle(!expanded)}
        >{expanded ? collapseText : expandText}
        </span>
    ) : null
)

從上可以看到,所謂的自定義其實(shí)就是我們可以對(duì)參數(shù)text進(jìn)行自定義,可以將其使用div包裹,或者對(duì)其樣式進(jìn)行自定義皆是可以的。而在我們的項(xiàng)目中,則是又寫一個(gè)名詞解釋組件對(duì)其自定義,名詞解釋組件可在下篇文章中簡(jiǎn)述。

1.4 展開收起邏輯

所謂的展開收起邏輯其實(shí)就是讓文字省略展示或者全部展示,而在這個(gè)過(guò)程中可以使用暴露出去的onExpand方法做其他邏輯操作,代碼如下:

/**
 * 展開、收起
 * @param status
 */
const expandToggle = (status: boolean) => {
    let text = status ? content : getText(content);
    setExpanded(status);
    setBody(text);
    onExpand(status);
}

1.5 完整代碼

好了,通過(guò)上述的簡(jiǎn)單介紹,組合代碼可以得到文字展開收起組件完整代碼。

1.5.1 邏輯代碼

創(chuàng)建index.tsx文件,并寫入如下所示代碼:

import * as React from 'react';
import {useEffect, useState} from "react";
import './index.scss';


interface IndexProps {
    content: string;    // 文本內(nèi)容
    maxLen?: number;   // 文字最大顯示長(zhǎng)度
    expandText?: string; // 展開按鈕文字
    collapseText?: string; // 收起按鈕文字
    contentRender: (text: string, handler: React.ReactNode) => React.ReactNode; // 自定義內(nèi)容
    onExpand?: (expanded: boolean) => void; // 展開、收起后觸發(fā)
}


/**
 * 自定義文字展開收起組件
 * @param props
 * @constructor
 */
const TextExpand = (props: IndexProps) => {
    const {
        content,
        maxLen = 300,
        expandText = '查看全部',
        collapseText = '收起',
        contentRender = (text: string, handler: React.ReactNode) => {},
        onExpand = (expanded: boolean) => {},
    } = props;
    const [body, setBody] = useState<any>(null);
    const [expanded, setExpanded] = useState<boolean>(false);
    const [showBtn, setShowBtn] = useState<boolean>(false);


    useEffect(() => {
        let contentBody = content || '';
        if (contentBody.length > maxLen) {
            contentBody = getText(contentBody);
            setShowBtn(true);
        }
        setBody(contentBody);
        return () => {
            setExpanded(false);
            setShowBtn(false);
        }
    }, [content])


    /**
     * 獲取截?cái)嗪蟮奈淖?
     * @param text
     */
    const getText = (text: string): string => {
        return (text || '').slice(0, maxLen) + '...'
    }


    /**
     * 獲取展開收起按鈕
     * @param status
     */
    const getExpandBtn = (): React.ReactNode => (
        showBtn ? (
            <span
                className="custom-text-expanded-handler"
                onClick={() => expandToggle(!expanded)}
            >{expanded ? collapseText : expandText}
            </span>
        ) : null
    )


    /**
     * 展開、收起
     * @param status
     */
    const expandToggle = (status: boolean) => {
        let text = status ? content : getText(content);
        setExpanded(status);
        setBody(text);
        onExpand(status);
    }


    return (
        <>{contentRender(body, getExpandBtn())}</>
    )
}

export default TextExpand;

1.5.2 樣式代碼

創(chuàng)建index.scss文件,同樣寫入如下代碼即可:

.custom-text-expanded-handler {
    margin-left: 6px;
    color: #545FD6;
    &:hover {
        color: #1890ff;
        cursor: pointer;
    }
}

1.6 安裝使用組件

組件寫好,那就來(lái)使用它。該組件已經(jīng)發(fā)布到npm上了,所以小伙伴們可以到npm上查看并下載,也可以通過(guò)如下命令進(jìn)行安裝使用:

npm i react-text-expand-collapse 或 yarn add react-text-expand-collapse

安裝好之后,在項(xiàng)目中引用使用:

// 引入組件
import TextExpand from 'react-text-expand-collapse/src/index';

// 使用
<div style={{
  width: 500,
  margin: '10px auto 0',
  color: '#333',
  fontSize: '12px',
  textAlign: 'left',
  backgroundColor: '#fff'
}}>
  <TextExpand
    content={str}
    maxLen={100}
    contentRender={(text: string, handler: any) => {
      return (
          <>
            <span>{text}</span>
            {handler}
          </>
      )
    }}
  />
</div>

最后實(shí)現(xiàn)效果,如下圖:

如果你有需求需要用到該組件但不想去下載安裝,那你就直接把這個(gè)完整代碼拷到你的項(xiàng)目中去,直接創(chuàng)建文件引用即可。(最好還是下載使用吧,這樣對(duì)作者有一定的支持,作者也會(huì)挺開心的^_^)

最后,文字展開收起組件的開發(fā)思路和實(shí)現(xiàn)就介紹完了,其實(shí)這個(gè)需求還是挺常見的,如果你以后遇到這樣的需求就來(lái)看看我的這篇文章吧,3Q??

資源

npm地址:react-text-expand-collapse

github倉(cāng)庫(kù):https://github.com/Jacky010/react-text-expandCollapse

到此這篇關(guān)于React文字展開收起組件的實(shí)現(xiàn)示例的文章就介紹到這了,更多相關(guān)React文字展開收起內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • React中的Hooks進(jìn)階理解教程

    React中的Hooks進(jìn)階理解教程

    這篇文章主要介紹了React中的Hooks進(jìn)階理解,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-06-06
  • React Native 圖片查看組件的方法

    React Native 圖片查看組件的方法

    這篇文章主要介紹了React Native 圖片查看組件的方法,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-03-03
  • react+ts實(shí)現(xiàn)簡(jiǎn)單jira項(xiàng)目的最佳實(shí)踐記錄

    react+ts實(shí)現(xiàn)簡(jiǎn)單jira項(xiàng)目的最佳實(shí)踐記錄

    這篇文章主要介紹了react+ts實(shí)現(xiàn)簡(jiǎn)單jira項(xiàng)目,本文通過(guò)圖文實(shí)例相結(jié)合給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-07-07
  • React實(shí)現(xiàn)頁(yè)面狀態(tài)緩存(keep-alive)的示例代碼

    React實(shí)現(xiàn)頁(yè)面狀態(tài)緩存(keep-alive)的示例代碼

    因?yàn)?react、vue都是單頁(yè)面應(yīng)用,路由跳轉(zhuǎn)時(shí),就會(huì)銷毀上一個(gè)頁(yè)面的組件,但是有些項(xiàng)目不想被銷毀,想保存狀態(tài),本文給大家介紹了React實(shí)現(xiàn)頁(yè)面狀態(tài)緩存(keep-alive)的代碼示例,需要的朋友可以參考下
    2024-01-01
  • React Hook 'useEffect' is called in function報(bào)錯(cuò)解決

    React Hook 'useEffect' is call

    這篇文章主要為大家介紹了React Hook 'useEffect' is called in function報(bào)錯(cuò)解決,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-12-12
  • 詳解如何在React中執(zhí)行條件渲染

    詳解如何在React中執(zhí)行條件渲染

    在現(xiàn)代Web開發(fā)中,React作為一種流行的JavaScript庫(kù),為開發(fā)者提供了一種高效構(gòu)建用戶界面的方式,條件渲染是React中的一個(gè)關(guān)鍵概念,本文將深入探討如何在React中實(shí)現(xiàn)條件渲染,并通過(guò)示例代碼演示常見的用法,需要的朋友可以參考下
    2025-01-01
  • react中實(shí)現(xiàn)拖拽排序react-dnd功能

    react中實(shí)現(xiàn)拖拽排序react-dnd功能

    這篇文章主要介紹了react中實(shí)現(xiàn)拖拽排序react-dnd功能,本文結(jié)合實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-02-02
  • 淺談react 同構(gòu)之樣式直出

    淺談react 同構(gòu)之樣式直出

    這篇文章主要介紹了淺談react 同構(gòu)之樣式直出,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-11-11
  • react+antd 遞歸實(shí)現(xiàn)樹狀目錄操作

    react+antd 遞歸實(shí)現(xiàn)樹狀目錄操作

    這篇文章主要介紹了react+antd 遞歸實(shí)現(xiàn)樹狀目錄操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-11-11
  • react如何實(shí)現(xiàn)篩選條件組件

    react如何實(shí)現(xiàn)篩選條件組件

    這篇文章主要介紹了react如何實(shí)現(xiàn)篩選條件組件問(wèn)題,具有很好的參考價(jià)價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-10-10

最新評(píng)論

共和县| 炉霍县| 新沂市| 河间市| 承德市| 湄潭县| 克东县| 哈密市| 寿宁县| 亚东县| 庄河市| 河西区| 嵊泗县| 香港| 宁明县| 阳山县| 泽州县| 红原县| 泾川县| 武安市| 乌拉特前旗| 尼玛县| 清苑县| 宁安市| 黄山市| 宁乡县| 襄樊市| 上饶县| 鄂州市| 开化县| 和林格尔县| 资源县| 汝州市| 芦溪县| 崇明县| 邯郸市| 皮山县| 玉林市| 福建省| 康平县| 通海县|