iis服务器助手广告广告
返回顶部
首页 > 资讯 > 前端开发 > JavaScript >React文字展开收起组件的实现示例
  • 714
分享到

React文字展开收起组件的实现示例

2024-04-02 19:04:59 714人浏览 八月长安
摘要

目录前言背景开发1.1 定义组件所需字段1.2 获取截断后的文字1.3 获取展开收起按钮1.4 展开收起逻辑1.5 完整代码1.5.1 逻辑代码1.5.2 样式代码1.6 安装使用组

前言

最近想把在项目中封装的一些公用组件奉献出来,毕竟独乐乐不如众乐乐,好东西就要大家分享。这次还是来聊实战,主题就是文字展开收起组件的实现过程,这个需求在前端项目中也算常见的需求了,可能你已经在项目中使用了自己或别人封装的组件,但是这次还是希望你能耐心地看看我的实现过程,毕竟多一个思路也会让你在后续的工作中游刃有余。

背景

老规矩,实战项目必有背景。那还是先来聊聊这个文字展开收起组件产生的需求背景,需求其实就是要你把多余的文字省略显示,然后有展开收起的按钮可以操作。对,就是这么直白,上图:

上图是文字收起的图示,超过一定的字数那就收起省略显示,并出现查看全部按钮。

上图显示的就是操作了查看全部按钮之后,文字需要全部显示出来并有收起按钮。还是来看一张gif图的显示最后该组件完成后的效果,如下图:

开发

该组件还是使用React+typescript的技术栈,所以还是之前的老话,如果不是此技术栈的同学就只有参考实现思路,后续待不忙时再来提供其他技术栈对应的版本。

文字展开收起组件的开发就没有啥思考的点,就只需要在做的时候考虑一定字数这个问题,超过它截取文字并加上...,然后展开时展示所有文字即可,其它的操作基本是常规操作。话不多说,直接往下看→

1.1 定义组件所需字段

interface IndexProps {
    content: string;    // 文本内容
    maxLen?: number;   // 文字最大显示长度
    expandText?: string; // 展开按钮文字
    collapseText?: string; // 收起按钮文字
    contentRender: (text: string, handler: React.Reactnode) => React.ReactNode; // 自定义内容
    onExpand?: (expanded: boolean) => void; // 展开、收起后触发
}

可以看到文字展开收起组件需要用到上述6个字段,其中contentcontentRender是必须传入的,否则组件会报错,其他字段皆为可选字段,需要时就传入不需要就会使用组件定义的默认值。

1.2 获取截断后的文字

获取截断后的文字,其实是根据字段maxLen来自动获取,maxLen设置的默认值为300,即超过300个文字之后就会被截断。maxLen的值是可以修改的,若你设置为200,即文字超过200就会被截取,故其为可选字段。代码如下:


const getText = (text: string): string => {
    return (text || '').slice(0, maxLen) + '...'
}

1.3 获取展开收起按钮

细心的小伙伴可以从1.1定义的字段中可以看到,其中contentRender这个字段代表的意思为自定义内容,即该组件的内容是可以自定义的。因为在设计的时候,就考虑到该组件应用的场景可能有点多,所以希望它是可以根据不同的需求场景来进行自定义的,所以该组件的render内容就只有此方法,如下:

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

contentRender方法其实接收两个参数:text代表文本内容,其实就是传入的content,只不过它会根据判断条件判断是否被截取;在组件加载时,就会对其进行如下判断:

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

通过上述代码可以获取到需要渲染的文本内容,然后将其赋值给body,即它就是contentRender方法接收的第一个参数。

而第二个参数handler其实就是这里将要说的,获取展开收起按钮的方法。如下:


const getExpandBtn = (): React.ReactNode => (
    showBtn ? (
        <span
            className="custom-text-expanded-handler"
            onClick={() => expandToggle(!expanded)}
        >{expanded ? collapseText : expandText}
        </span>
    ) : null
)

从上可以看到,所谓的自定义其实就是我们可以对参数text进行自定义,可以将其使用div包裹,或者对其样式进行自定义皆是可以的。而在我们的项目中,则是又写一个名词解释组件对其自定义,名词解释组件可在下篇文章中简述。

1.4 展开收起逻辑

所谓的展开收起逻辑其实就是让文字省略展示或者全部展示,而在这个过程中可以使用暴露出去的onExpand方法做其他逻辑操作,代码如下:


const expandToggle = (status: boolean) => {
    let text = status ? content : getText(content);
    setExpanded(status);
    setBody(text);
    onExpand(status);
}

1.5 完整代码

好了,通过上述的简单介绍,组合代码可以得到文字展开收起组件完整代码。

1.5.1 逻辑代码

创建index.tsx文件,并写入如下所示代码:

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


interface IndexProps {
    content: string;    // 文本内容
    maxLen?: number;   // 文字最大显示长度
    expandText?: string; // 展开按钮文字
    collapseText?: string; // 收起按钮文字
    contentRender: (text: string, handler: React.ReactNode) => React.ReactNode; // 自定义内容
    onExpand?: (expanded: boolean) => void; // 展开、收起后触发
}



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])


    
    const getText = (text: string): string => {
        return (text || '').slice(0, maxLen) + '...'
    }


    
    const getExpandBtn = (): React.ReactNode => (
        showBtn ? (
            <span
                className="custom-text-expanded-handler"
                onClick={() => expandToggle(!expanded)}
            >{expanded ? collapseText : expandText}
            </span>
        ) : null
    )


    
    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 样式代码

创建index.scss文件,同样写入如下代码即可:

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

1.6 安装使用组件

组件写好,那就来使用它。该组件已经发布到npm上了,所以小伙伴们可以到npm上查看并下载,也可以通过如下命令进行安装使用:

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

安装好之后,在项目中引用使用:

// 引入组件
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>

最后实现效果,如下图:

如果你有需求需要用到该组件但不想去下载安装,那你就直接把这个完整代码拷到你的项目中去,直接创建文件引用即可。(最好还是下载使用吧,这样对作者有一定的支持,作者也会挺开心的^_^)

最后,文字展开收起组件的开发思路和实现就介绍完了,其实这个需求还是挺常见的,如果你以后遇到这样的需求就来看看我的这篇文章吧,3Q?

资源

npm地址:react-text-expand-collapse

GitHub仓库:https://github.com/Jacky010/react-text-expandCollapse

到此这篇关于React文字展开收起组件的实现示例的文章就介绍到这了,更多相关React文字展开收起内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: React文字展开收起组件的实现示例

本文链接: https://www.lsjlt.com/news/154270.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • React文字展开收起组件的实现示例
    目录前言背景开发1.1 定义组件所需字段1.2 获取截断后的文字1.3 获取展开收起按钮1.4 展开收起逻辑1.5 完整代码1.5.1 逻辑代码1.5.2 样式代码1.6 安装使用组...
    99+
    2024-04-02
  • JavaScript实现文字展开和收起效果
    列表式的文字的展开和收起的实现,供大家参考,具体内容如下 需求: 1、当文字超出目标值,则截取目标值,其他隐藏,同时显示“展开”二字和下拉箭头; 2、点击“展开”显示所有文字,同时改...
    99+
    2024-04-02
  • Vue实现文本展开收起功能
    本文实例为大家分享了Vue实现文本展开收起功能的具体代码,供大家参考,具体内容如下 先说说需求,以及实现的需求 1、移动端H5,发表留言后跳转到评论列表,超过5行文字,多余的需要隐藏...
    99+
    2024-04-02
  • React实现复杂搜索表单的展开收起功能
    给时间时间,让过去过去。 上节我们写过了【搜索】表单,以及查询、重置功能。本节对于需要展开收起效果的查询表单 进行概述,主要涉及前端样式知识。 样式效果如下: &nbs...
    99+
    2024-04-02
  • jQuery实现文章收起与展开功能
    本文实例为大家分享了jQuery实现文章收起与展开功能的具体代码,供大家参考,具体内容如下 废话不多说,直接上代码 <!DOCTYPE html> <html ...
    99+
    2024-04-02
  • vue实现超过两行显示展开收起的代码
    目录vue超过两行显示展开收起vue多个展开收起功能说下思路尝试vue超过两行显示展开收起 基于vue-cli2,sass,vant(ui组件):https://youzan.git...
    99+
    2022-11-13
    vue展开收起 超过两行展开收起 vue显示展开收起
  • react实现Radio组件的示例代码
    本文旨在用最清楚的结构去实现一些组件的基本功能。希望和大家一起学习,共同进步 效果展示: 测试组件: class Test extends Component { cons...
    99+
    2024-04-02
  • React实现数字滚动组件numbers-scroll的示例详解
    目录一、设计原理二、实现方式三、使用方式四、参数说明数字滚动组件,也可以叫数字轮播组件,这个名字一听就是非常普通常见的组件,第一反应就是想找找网上大佬的东西顶礼膜拜一下,这一搜,还真...
    99+
    2023-03-10
    React数字滚动组件 React数字滚动 React滚动
  • React+Koa实现文件上传的示例
    目录背景 服务端依赖 后端配置跨域后端配置静态资源访问 使用 koa-static-cache后端配置requst body parse 使用 koa-bodyparser前端依赖 ...
    99+
    2024-04-02
  • 微信小程序怎么实现text文本的展开与收起
    这篇文章主要介绍了微信小程序怎么实现text文本的展开与收起 的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇微信小程序怎么实现text文本的展开与收起 文章都会有所收获,下面我们一起来看看吧。先看看布局文件,关...
    99+
    2023-06-26
  • react实现组件状态缓存的示例代码
    目录前言一、安装第三方库二、配置操作总结前言 在移动端中,用户访问了一个列表页,上拉浏览列表页的过程中,随着滚动高度逐渐增加,数据也将采用触底分页加载的形式逐步增加,列表页浏览到某个...
    99+
    2023-02-24
    react 组件状态缓存 react 组件缓存
  • angularJS实现表格部分列展开缩起示例代码
    AngularJS 简介 AngularJS 是一个 JavaScript 框架。它可通过 <script> 标签添加到 HTML 页面。 AngularJS 通过 指...
    99+
    2024-04-02
  • react组件实现无缝轮播示例详解
    目录正文无缝轮播实现思路构思使用时代码结构Carousel组件CarouselItem组件完善组件完成小圆点正文 需求是做一个无缝轮播图,我说这不是有很多现成的轮子吗?后来了解到他有...
    99+
    2022-11-13
    react 组件无缝轮播 react 无缝轮播
  • React实现一个倒计时hook组件实战示例
    目录前言思路实现总结前言 本篇文章主要实现一个无样式的倒计时 hook 组件,通常不同地方的倒计时样式都不同,但倒计时的逻辑基本是都是一样的,因此可以抽离成一个工具方法或者一个 ...
    99+
    2023-02-23
    React倒计时hook组件 React hook
  • React实现一个通用骨架屏组件示例
    目录骨架屏是什么?Demo设计思路具体实现骨架屏是什么? 找到这里的同志,或多或少都对骨架屏有所了解,请容许我先啰嗦一句。骨架屏(Skeleton Screen)是一种优化用户弱网...
    99+
    2024-04-02
  • react使用antd的上传组件实现文件表单一起提交功能
    本篇内容主要讲解“react使用antd的上传组件实现文件表单一起提交功能”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“react使用antd的上传组件实现文件表单一起提交功能”吧!项目中需要实...
    99+
    2023-06-20
  • React中井字棋游戏的实现示例
    目录需求分析实现分析涉及的组件涉及的状态编码实现项目初始化定义各个组件的props/stateSquare组件propsBoard组件propsGame组件state各组件代码Squ...
    99+
    2022-11-13
    React 井字棋游戏
  • 基于React-Dropzone开发上传组件功能(实例演示)
    这次我要讲述的是在React-Flask框架上开发上传组件的技巧。我目前主要以React开发前端,在这个过程中认识到了许多有趣的前端UI框架——React-Bootstrap、Ant...
    99+
    2024-04-02
  • Pygame显示文字的实现示例
    目录1 Pygame的初始化2 屏幕的创建3 字体的创建4 字体的渲染5 文字的显示使用Pygame显示文字的步骤如图1所示。 图1 显示文字的步骤 1 Pygame的初始化 通过...
    99+
    2023-02-14
    Pygame显示文字 Pygame显示
  • vue 折叠展示多行文本组件的实现代码
    折叠展示多行文本组件 折叠展示多行文本组件,自动根据传入的expand判断是否需要折叠 两种模式:展开/收起展示全文本(默认)、popover展示全文本 先上代码 <t...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作