javascript - 使用 JSX 和 React Native 的动态标签名称

标签 javascript reactjs react-native

这个问题的灵感来自这个问题:Dynamic tag name in jsx and React但这一次是针对 React Native 的。

我正在尝试渲染 <TouchableOpacity> iOS 按钮和 <TouchableNativeFeedback> Android 按钮,没有成功。

我尝试了以下代码:

render() {
    const { element } = this.props;

    const ButtonElementName = Platform.OS === 'ios' ? 'TouchableOpacity' : 'TouchableNativeFeedback';

    return (
      <ButtonElementName style={styles.sectionEntryContainer}>
        <View style={styles.sectionDayContainer}>  
          <LinearGradient
            style={styles.gradientStyle}
            start={{x: 0, y: 0}} end={{x: 1, y: 0}}
            colors={COLOR_MAP[element.item.data.mood].colors}
          >
            <Text style={styles.sectionDayText}>{ moment(element.item.day, 'D').format('Do') }</Text>
          </LinearGradient>
        </View>
        <View style={styles.sectionDayDescriptionContainer}>
          <Text style={styles.sectionDayText}>{ element.item.data.optionalDescription }</Text>
        </View>
      </ButtonElementName>
    );
  }

但是在iOS模拟器上尝试时出现以下错误:

Invariant Violation: View config not found for name TouchableOpacity

如果不创建 HOC,我该如何去做呢?

最佳答案

不应通过名称引用元素,而应直接通过类引用元素

import {
  TouchableNativeFeedback,
  TouchableOpacity
} from 'react-native';

const Element = Platform.OS === 'ios' ? TouchableOpacity : TouchableNativeFeedback;

class SomeComponent extends React.Component {

  render() {
    const { element } = this.props;

    return (
      <Element style={styles.sectionEntryContainer}>
        <View style={styles.sectionDayContainer}>  
          <LinearGradient
            style={styles.gradientStyle}
            start={{x: 0, y: 0}} end={{x: 1, y: 0}}
            colors={COLOR_MAP[element.item.data.mood].colors}
          >
            <Text style={styles.sectionDayText}>{ moment(element.item.day, 'D').format('Do') }</Text>
          </LinearGradient>
        </View>
        <View style={styles.sectionDayDescriptionContainer}>
          <Text style={styles.sectionDayText}>{ element.item.data.optionalDescription }</Text>
        </View>
      </Element>
    );
  }
}

关于javascript - 使用 JSX 和 React Native 的动态标签名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54408388/

相关文章:

android - gradlew assembleRelease 和 gradlew assembleReleaseStaging 生成 APK 无需更改

javascript - ComponentDidUpdate 用法和超出最大更新深度

javascript - 为什么当 Dev Console 启动时我在 Chrome 中获得更好的性能?

javascript - 如何在传奇中测试多个takeEvery?

reactjs - 单击时更改按钮的样式

javascript - React 测试库如何使用 waitFor

javascript - 如何使用 yii2fullcalendar 处理长按事件

javascript - JS 中的 Observable 模式和 Mediator 模式之间的真正区别是什么?

javascript - 将跨度内的数字转换为日期格式 | Javascript |

javascript - 动画 View 中出现错误 : Exception in HostFunction: Malformed calls from JS: field sizes are different.