No Description

RichTextWrapper.js 2.2KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107
  1. /**
  2. * Desc: //富文本(表情)控件
  3. *
  4. * Created by WangGanxin on 2018/2/24
  5. * Email: mail@wangganxin.me
  6. */
  7. import React, {Component,PureComponent} from 'react';
  8. import {
  9. View,
  10. Image,
  11. Text,
  12. StyleSheet,
  13. } from 'react-native';
  14. import {EMOTIONS_DATA} from './DataSource';
  15. import PropTypes from 'prop-types';
  16. let emojiReg = new RegExp('\\/\\{[a-zA-Z_]{1,18}'); //表情符号正则表达式
  17. export default class RichTextWrapper extends Component {
  18. constructor(props){
  19. super(props);
  20. this.state={
  21. Views:[],
  22. };
  23. }
  24. componentWillReceiveProps(nextProps) {
  25. this.state.Views.length=0;
  26. let textContent = nextProps.textContent;
  27. this._matchContentString(textContent);
  28. }
  29. _matchContentString(textContent){
  30. // 匹配得到index并放入数组中
  31. let emojiIndex = textContent.search(emojiReg);
  32. let checkIndexArray = [];
  33. // 若匹配不到,则直接返回一个全文本
  34. if (emojiIndex === -1) {
  35. this.state.Views.push(<Text key ={'emptyTextView'+(Math.random()*100)}>{textContent}</Text>);
  36. } else {
  37. if (emojiIndex !== -1) {
  38. checkIndexArray.push(emojiIndex);
  39. }
  40. // 取index最小者
  41. let minIndex = Math.min(...checkIndexArray);
  42. // 将0-index部分返回文本
  43. this.state.Views.push(<Text key ={'firstTextView'+(Math.random()*100)}>{textContent.substring(0, minIndex)}</Text>);
  44. // 将index部分作分别处理
  45. this._matchEmojiString(textContent.substring(minIndex));
  46. }
  47. }
  48. _matchEmojiString(emojiStr) {
  49. let castStr = emojiStr.match(emojiReg);
  50. let emojiLength = castStr[0].length;
  51. this.state.Views.push(<Image key={emojiStr} style={styles.subEmojiStyle} resizeMethod={'auto'} source={EMOTIONS_DATA[castStr]}/>);
  52. this._matchContentString(emojiStr.substring(emojiLength));
  53. }
  54. render(){
  55. return (
  56. <View style={styles.container}>
  57. {this.state.Views}
  58. </View>
  59. );
  60. }
  61. }
  62. RichTextWrapper.propTypes = {
  63. textContent:PropTypes.string,
  64. };
  65. const styles = StyleSheet.create({
  66. container: {
  67. flexDirection:'row',
  68. alignItems:'center',
  69. flexWrap:'wrap',
  70. },
  71. subEmojiStyle:{
  72. width:25,
  73. height:25,
  74. }
  75. });