成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

教你實(shí)現(xiàn)React文字展開收起組件

3403771864 / 1055人閱讀

  今天我們講講項(xiàng)目中實(shí)戰(zhàn)就是文字展開收起組件的實(shí)現(xiàn)過(guò)程,講解這個(gè)就是為了讓多給大家一個(gè)思路,想法。

  簡(jiǎn)單來(lái)說(shuō)文字展開收起組件產(chǎn)生的需求背景,就是為省略顯示,然后有展開收起的按鈕可以操作。我們看顯示效果上圖:

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

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

  開發(fā)

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

  文字展開收起組件開發(fā),我們現(xiàn)在就只需要在做的時(shí)候考慮一定字?jǐn)?shù)這個(gè)問(wèn)題,超過(guò)它截取文字并加上...,然后展開時(shí)展示所有文字即可,其它的操作基本是常規(guī)操作。我們一起往下看

  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ā)
  }

  運(yùn)行之后我們就可以看到文字展開收起組件,其中content,contentRender是必須傳入的,否則組件會(huì)報(bào)錯(cuò),其他字段皆為可選字段,在要用到的時(shí)候就會(huì)傳入,不用就使用組件定義的默認(rèn)值。

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

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

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

  1.3 獲取展開收起按鈕

  不小人是不是從1.1定義的字段中可以看到,其中contentRender這個(gè)字段代表的意思為自定義內(nèi)容,即該組件的內(nèi)容是可以自定義的。講白了說(shuō)就是在設(shè)計(jì)的時(shí)候,就已經(jīng)想到組件應(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ù)判斷條件判斷是否被截?。辉诮M件加載時(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)行安裝使用:

  1

  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)效果,如下圖:

  文章內(nèi)的代碼有需要也可以直接拷走使用,也可以應(yīng)用在項(xiàng)目中,幫助大家解決問(wèn)題。

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/127976.html

相關(guān)文章

  • React Native 中切換TextInput保持鍵盤展開

    摘要:傳給回調(diào)函數(shù)的里,包含一個(gè)觸摸事件參數(shù)。官網(wǎng)的版文檔中,和組件中都有屬性,這個(gè)屬性接收一個(gè)回調(diào)函數(shù),函數(shù)原型是,在組件和的組件的時(shí)候觸發(fā)該事件,傳給回調(diào)函數(shù)的里,參數(shù),其中的屬性為該組件的。 1、問(wèn)題 問(wèn)題場(chǎng)景: 由于手機(jī)屏幕高度不定,做表單頁(yè)面時(shí),外層通常加上ScrollView組件,使其能夠適應(yīng)屏幕進(jìn)行滾動(dòng)。業(yè)務(wù)需要里面放置多個(gè)TextInput組件。 問(wèn)題描述: 出現(xiàn)的問(wèn)題是,首...

    xiangzhihong 評(píng)論0 收藏0
  • 支持多框架的組件庫(kù)KPC 1.0正式發(fā)布

    摘要:自從年月份對(duì)外公布以來(lái),已經(jīng)經(jīng)過(guò)了個(gè)月的迭代,期間發(fā)布了幾十個(gè)正式版本,但一直沒(méi)有到,因?yàn)槲覀冇X(jué)得是個(gè)里程碑版本,我們必須做的足夠完善才敢稱之為。 自從17年11月份對(duì)外公布以來(lái),KPC已經(jīng)經(jīng)過(guò)了8個(gè)月的迭代,期間發(fā)布了幾十個(gè)正式版本,但一直沒(méi)有到1.0,因?yàn)槲覀冇X(jué)得1.0是個(gè)里程碑版本,我們必須做的足夠完善才敢稱之為1.0。而如今我們有信心對(duì)外宣布:KPC 1.0終于來(lái)了! 其實(shí)距離...

    劉厚水 評(píng)論0 收藏0
  • 工作記錄:不定寬度展開收起卡片

    摘要:寫在前面的嘮簡(jiǎn)單記錄一下工作中出現(xiàn)的需求和常見的問(wèn)題,時(shí)常記錄總結(jié),希望能在之后的工作中吸取經(jīng)驗(yàn)教訓(xùn),提高工作效率。只展示一行數(shù)據(jù)的時(shí)候給固定高度為了顯示展開收起按鈕,因?yàn)樵O(shè)定分辨率是來(lái)回變的,思來(lái)想去還是使用了監(jiān)聽事件。 寫在前面的嘮 簡(jiǎn)單記錄一下工作中出現(xiàn)的需求和常見的問(wèn)題,時(shí)常記錄總結(jié),希望能在之后的工作中吸取經(jīng)驗(yàn)教訓(xùn),提高工作效率。如果可以幫助有同樣問(wèn)題的同學(xué)我會(huì)很開心的,有的...

    leon 評(píng)論0 收藏0
  • React hooks寫了一個(gè)日歷組件,來(lái)看看?

    摘要:然后使用,在的上綁定了,很簡(jiǎn)單。日歷遍歷的思路這一次的提交主要是確定了日歷組件,怎么寫,具體思路看下面的代碼,盡量通過(guò)注釋把思路講的清楚一些。前言 在最近的項(xiàng)目中,大量的嘗試了react hooks,我們的組件庫(kù)用的是Next,除了一個(gè)地方因?yàn)橐褂肍orm + Field的組合,所以使用了class組件,經(jīng)過(guò)了這個(gè)項(xiàng)目,也算是總結(jié)一些使用的經(jīng)驗(yàn),所以準(zhǔn)備自己封裝一個(gè)日歷組件來(lái)分享一下。以下...

    cangck_X 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<