在React Native中创建一个简单的hashtag格式化程序

时间:2019-10-15 04:35:32

标签: javascript reactjs react-native

是否可以在不使用外部库的情况下解析带有#标签的字符串,然后使用Text组件设置其样式?


const string = "Let's #Tweet on #Twitter";

// Expect:
// Let's <Text style={{ color: 'blue' }}>#Tweet</Text> on <Text style={{ color: 'blue' }}>#Twitter</Text>

我认为这可以做到:

import React from 'react';
import { Text } from 'react-native';

export const HASHTAG_FORMATTER = string => {
  return string.replace(/(^|\s)(#[a-z\d-]+)/ig, `$1${<Text style={{ color: 'blue' }}>$2</Text>}`);
}

用法:

import React from 'react';
import { View, Text } from 'react-native';
import { HASHTAG_FORMATTER } from '../../utilities/hashtag';

const Home = props => {
  return (
    <View>
      <Text>{HASHTAG_FORMATTER("Let's #Tweet on #Twitter")}</Text>
    <View>
  )
}

我得到的是:

  

让我们将[对象对象]上的[对象对象]

查看示例:https://codesandbox.io/s/react-native-69dwm?fontsize=14

有没有一种方法可以在jsx中实现?谢谢。

1 个答案:

答案 0 :(得分:1)

您不能使用像这样的反向引用,当您想进行动态评估时可以使用replace的回调函数

const HASHTAG_FORMATTER = string => {
  return string.replace(/(^|\s)(#[a-z\d-]+)/ig, (m, g1, g2) => {
    return g1 + "<span style={color:'green'}>" + g2 + "< /span>"
  });
}


console.log(HASHTAG_FORMATTER("#tweet"))

要解决您的特定问题,您需要通过拆分字符串然后根据值构建Text组件来解决它

Demo

const HASHTAG_FORMATTER = string => {
  return string.split(/((?:^|\s)(?:#[a-z\d-]+))/gi).filter(Boolean).map((v,i)=>{
    if(v.includes('#')){
      return <Text key={i} style={{color:'green'}}>{v}</Text>
    }   else{
      return <Text key={i}>{v}</Text>
    }
  })
};