react-native - React Native - 带有内联文本的 hitSlop 的内联可压组件

标签 react-native flexbox

客户想要 React Native 应用程序中的一段文本,其中有可按下的内联文本。问题是我不能将 hitSlop 放在 Text 上,如果我使用 TouchableOpacity,它不会与文本内联显示 -每个都是自己的 block 。

这是我尝试过的:

export default class App extends React.Component {
  render() {
    return (
      <View style={styles.container}>
        <Text style={ styles.text }>Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi </Text>

        <TouchableOpacity
          onPress={ () => Alert.alert('howdy') }
          hitSlop={ { top: 15, right: 15, bottom: 15, left: 15 } }
        >
          <Text style={ styles.buttonText }>ut aliquip ex ea commodo consequat.</Text>
        </TouchableOpacity>

        <Text style={ styles.text }>Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</Text>
      </View>
    );
  }
}

const styles = StyleSheet.create({
  container: {
    marginTop: 50,
    flexDirection: 'row',
    flexWrap: 'wrap',
  },
  text: {
    flexWrap: 'wrap',
  },
  buttonText: {
    color: 'red',
  }
});

有零食here .

有没有办法在文本上获得一些命中率?或者有没有办法让 TouchableOpacity 与其他文本内联?在任何一种情况下,hitSlop 都需要与它周围的惰性文本重叠。

有什么想法吗?谢谢。

附录:我忘了提到,在 Android 上,您不能将 View(TouchableOpacity 继承)作为 Text。它适用于 iOS 但不适用于 Android,这是 Not Acceptable 。

最佳答案

您的原始解决方案非常接近。它不起作用的原因是 flexWrap 将整个元素(ViewText)保持在一起,而不是在最近的单词处换行。

您可以通过拆分长文本字符串并为每个单词创建单独的 TouchableOpacity 来解决这个问题。这样 flexWrap 就会像普通的自动换行一样。

这是 Snack

const touchableText = 'ut aliquip ex ea commodo consequat.';
const loremText = 'Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.';
const ipsumText = 'Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.';

export default () => (
  <View style={styles.container}>
    <CompoundText text={loremText} />
    <CompoundTextLink text={touchableText} />
    <CompoundText text={ipsumText} />
  </View>
);

const CompoundText = ({text}) => 
  text.split(' ').map(word => <Text>{word} </Text>);

const CompoundTextLink = ({ text }) => 
  text.split(' ').map(word => <TextLink word={word} />);

const TextLink = ({ word }) => (
  <TouchableOpacity
    hitSlop={{top: 10, bottom: 10, left: 10, right: 10}}
    onPress={() => Alert.alert('howdy')}
    style={styles.zIndex1}
  >
    <Text style={styles.buttonText}>{word} </Text>
  </TouchableOpacity>
);

const styles = StyleSheet.create({
  container: {
    marginTop: 50,
    flexDirection: 'row',
    flexWrap: 'wrap',
  },
  buttonText: {
    color: 'red',
  }
});

关于react-native - React Native - 带有内联文本的 hitSlop 的内联可压组件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53127606/

相关文章:

javascript - 使用 useNativeDriver react 原生动画 - _reactNative.Animated.event(...) 不是函数

android - react native 获取请求非常慢的android

react-native - 未找到 React/RCTDefines.h' 文件(RN0.61)

css - Angular Materials Flex-box 在 iOS Safari 上无法正确显示

html - 所有元素的 flexbox 大小不一样

css - 移动浏览器列 View 问题 Material 设计(css)

android - 如何从apk文件中删除权限?

ios - react native : how to get the names of all the albums

css - Flexbox 在 Safari 中仍然不稳定,flex-wrap 不起作用

html - 迭代三列 flexbox