1. 程式人生 > >react native實現可展開Text控制元件

react native實現可展開Text控制元件

原理元件初始化時不設定Text控制元件的numberOfLines屬性,測量一下元件高度(最大高度),然後在設定numberOfLines屬性,再次測量一下元件高度(最小高度),若最大高度大與最小高度,表示需要顯示“展開”。

/* eslint new-cap: ["error", { "capIsNew": false }] */

import React, {
  Component,
  PropTypes,
} from 'react';

import {View, Image, StyleSheet, Animated, Text} from 'react-native';
export default class CollapsibleText extends Component {
  static propTypes = {
    style: Text.propTypes.style,
    expandTextStyle:Text.propTypes.style,
    numberOfLines: PropTypes.number
  }
  constructor(props){
    super(props);
    this.state = {
      /** 文字是否展開 */
      expanded:true,
      numberOfLines:null,
      /** 展開收起文字是否處於顯示狀態 */
      showExpandText:false,
      expandText:'展開',
      /** 是否處於測量階段 */
      measureFlag:true
    }
    this.numberOfLines = props.numberOfLines;
    /** 文字是否需要展開收起功能:(實際文字內容是否超出numberOfLines限制) */
    this.needExpand = true;
    this.measureFlag = true;
  }


  _onTextLayout(event){
    if(this.measureFlag){
      if(this.state.expanded){
        this.maxHeight = event.nativeEvent.layout.height;
        this.setState({expanded:false,numberOfLines:this.numberOfLines});
      }else{
        this.mixHeight = event.nativeEvent.layout.height;
        if(this.mixHeight == this.maxHeight){
          this.needExpand = false;
        }else{
          this.needExpand = true;
          this.setState({showExpandText:true})
        }
        this.measureFlag = false;
      }
    }

  }

  _onPressExpand(){
    if(!this.state.expanded){
      this.setState({numberOfLines:null,expandText:'收起',expanded:true})
    }else{
      this.setState({numberOfLines:this.numberOfLines,expandText:'展開',expanded:false})
    }
  }

  render() {
    const { numberOfLines, onLayout, expandTextStyle, ...rest } = this.props;
    let expandText = this.state.showExpandText?(
        <Text
          style={[this.props.style,styles.expandText,expandTextStyle]}
          onPress={this._onPressExpand.bind(this)}>
          {this.state.expandText}</Text>
      ) : null;
    return (
      <View>
        <Text
          numberOfLines={this.state.numberOfLines}
          onLayout={this._onTextLayout.bind(this)}
          {...rest}
          >
          {this.props.children}
        </Text>
        {expandText}
      </View>
    );
  }
}

const styles = StyleSheet.create({
  expandText: {
    color:'blue',
    marginTop:0
  }


});

相關推薦

react native實現展開Text控制元件

原理:元件初始化時不設定Text控制元件的numberOfLines屬性,測量一下元件高度(最大高度),然後在設定numberOfLines屬性,再次測量一下元件高度(最小高度),若最大高度大與最小高度,表示需要顯示“展開”。/* eslint new-cap: ["err

javascript/HTML實現多個text控制元件自動/動態計算總數

<html><head><title>untitled</title><style type="text/css"> input {width: 40px;} </style><script typ

React NativeText控制元件屬性和樣式

屬性 numberOfLines 文字行數限制,新增後超過限制行數文字會在末尾預設以…的形式省略。 ellipsizeMode 設定文字縮略格式,配合numberOfLines使用,values: * tail:在末尾…省略(預設值) * c

基於React Native實現的介面載入元件react-native-loadview

react-native-loadview 基於React Native實現的介面載入元件, Installation npm install react-native-loadview --save Import into your project import

H5實現多圖片預覽上傳,點選拖拽控制元件介紹

在做圖片上傳時發現一個蠻好用的控制元件,支援多張圖片同時上傳,可以點選選擇圖片,也可以將圖片拖拽到上傳框直接上傳,方便,好用,介面也簡單,基本可以直接放到專案裡使用。 先看看他的樣式: 選擇圖片後

react-native實現樹結構選擇元件

react-native-tree-select react-native-tree-select 樹結構選擇元件 專案結構 --components: treeSelect元件 --treeSelectExample: 元件演示程式碼 --.gitignor

(二)React Native中View和Text元件的使用

前言 前段時間實在太忙,由於剛進公司,第一個專案要用混合開發,這種開發模式自己也沒用過,期間遇見過與h5的各種奇葩問題,並且Android這端都是由自己負責,經過兩個月的努力,公司專案終於上線。加之後面又回了一趟學校答辯,才把事情忙完了。這期間一直沒時間好好學

頁面中拖拽控制元件的簡單實現方案

頁面中可拖拽控制元件的簡單實現,可直接一句話實現. 核心程式碼邏輯類如下: import android.animation.ObjectAnimator; import android.view.MotionEvent; import andr

React Native實現Text顯示...的效果

大家好,這裡我給大家講一些React native中的Text控制元件顯示省略號的實現方法。     專案開發中文字的顯示是必不可少的,比如產品簡介或描述,產品詳情等。往往會遇到文字過長的情況,一般怎麼處理這些問題呢? 大多數軟體都是將介面佈局中顯示不下的內容顯示為...,

Android開發之玩轉FlexboxLayout佈局(用於普通控制元件實現流式佈局,也結合RecycleView實現流式佈局)

在這之前,我曾認真的研究過鴻洋大神的Android 自定義ViewGroup 實戰篇 -> 實現FlowLayout,按照大神的思路寫出了一個流式佈局,所有的東西都是難者不會會者不難,當自己能自定義流式佈局的時候就會覺得這東西原來很簡單了。如果各位小夥伴也看過那篇

easyUI之拖動控制元件——easyui-draggable

以上為元件的屬性,一下對屬性做實踐操作解釋: draggable提供可拖動控制元件 實現方式(js): 頁面定義: <div id="box" class="easyui-draggable" style="width:400px;height:200px;backgro

React-Native學習--輪播圖第三方元件-react-native-swiper

一.通過npm安裝react-native-swiper $ npm install react-native-swiper --save $ npm i react-timer-mixin --save 二.在專案中匯入 import Swiper from

微信小程式實現顯示和隱藏控制元件-頭像-取值-bindblur事件

微信小程式實現顯示和隱藏控制元件 .wxml: <view class=" {{showOrHidden?'show':'hidden'}}"></view> .wxss: .hidden { display: none; } .show { display: b

Tkinter-Text控制元件常用功能示例

簡介及簡例 Text 控制元件用來顯示多行文字. Tkinter 的 Text 控制元件很強大, 很靈活, 可以實現很多功能. 雖然這個控制元件的主要用途是顯示多行文字, 但其還可以被用作簡單的文字編輯器, 甚至是網頁瀏覽器.  Text 控制元件可以顯示網頁連結, 圖片, HTML頁

類似footer的效果,利用簡單的佈局實現ListView底部懸浮控制元件

平時使用listview/recycleview的時候,都會經常碰到這麼一個需求:就是一個ListView下面懸浮一個佈局,當ListView的項超過螢幕下方則固定在底部。 一開也是想到用ListView的footer去實現,後來發現一個簡單的佈局實現這個功能。 看圖:  

HTML5學習第6篇—video:自己實現video的播放控制元件(新增樣式版)

     本篇部落格接著上一篇文章,實現了一個帶樣式的video播放控制元件,程式碼如下: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8">

HTML5學習第5篇—viedo:自己實現viedo的播放控制元件(簡版)

      最近正在學習html5新增的媒體元素video,為了能夠更熟悉video的屬性、方法和事件,決定自己實現一下video的播放控制元件,因為是初學,只是寫了個簡版。程式碼如下: <!DOCTYPE html> <html lang="en

React Native實現再按一次退出應用程式功能

解決點選兩次手機back鍵退出程式 程式碼及註釋如下: //雙擊返回鍵退出程式

React-Native開發中的靈異元件-列表

靈異元件 眾所周知,列表是移動開發中非常常用的元件(控制元件)。原生的列表,拿iOS來來說,有UITableView & UICollectionview,就算是長列表的情況也只是載入速度慢,不會出現突然不再載入的情況,Android的應該也是這種情況。但是

react-native實現多張圖片上傳

最近在搞這個圖片上傳功能,,剛開始的時候iOS用的是 react-native-image-crop-picker這個外掛,,iOS那邊完美執行沒有毛病,,,但是到android這邊之後就開始報各種資源