在React Native中创建可重用组件吗?

时间:2019-12-11 19:03:58

标签: javascript reactjs react-native react-navigation react-native-flatlist

我制作了一个可重用的组件来呈现Flatlist,按下时我内部有一个TouchableOpacity,我想导航到特定的屏幕, 并且我根据FlateList中的项目传递了一些参数

所以当我按下导航键时出现错误

  

无法读取未定义的属性导航

这是我的代码

const OrdersList = props => {
  return (
    <View style={styles.container}>
      <FlatList
        data={props.data}
        renderItem={({item}) => {
          return (
            <TouchableOpacity
              onPress={() =>
                props.navigation.navigate(props.screenName, {
                  ...
                  service: item.service,
                  date: item.date,
                  ...
                })
              }
             >
                <Text>
                  {item.service}
                </Text>
            </TouchableOpacity>
          );
        }}
      />
    </View>
  );
};

这是我的用法

 <OrdersList
          data={this.state.orders}
          extraData={this.state}
          screenName="OrderHomeDetails"
          // navigate={ // when i do it i got error he can't find item and thats usual 
          //   (this.props.navigation.navigate,
          //   {
          //     service: item.service,
          //     time: item.time,
          //     username: item.username,
          //     buildingNumber: item.buildingNumber,
          //     date: item.date,
          //     description: item.description,
          //     images: item.images,
          //     status: item.status,
          //     snapshotKey: item.snapshotKey,
          //   })
          // }
        />

2 个答案:

答案 0 :(得分:2)

您的错误是告诉我,正在渲染OrdersList的任何组件均未接收到导航道具。如果此组件是屏幕,则应将其导航到以接收导航道具(这意味着它会列在您使用的create * navigator上)。

由于我没有完全访问您的代码的权限,因此我建议您在OrdersList上使用withNavigation装饰器,这样您就不必再传递父级的导航道具了。

const OrdersList_ = props => {
  return (
    <View style={styles.container}>
      <FlatList
        data={props.data}
        renderItem={({item}) => {
          return (
            <TouchableOpacity
              onPress={() =>
                props.navigation.navigate(props.screenName, {
                  ...
                  service: item.service,
                  date: item.date,
                  ...
                })
              }
             >
                <Text>
                  {item.service}
                </Text>
            </TouchableOpacity>
          );
        }}
      />
    </View>
  );
};

const OrdersList = withNavigation(OrdersList)

 <OrdersList
          data={this.state.orders}
          extraData={this.state}
          screenName="OrderHomeDetails"
          // navigate={ // when i do it i got error he can't find item and thats usual 
          //   (//no need to pass navigation props anymore
          //   {
          //     service: item.service,
          //     time: item.time,
          //     username: item.username,
          //     buildingNumber: item.buildingNumber,
          //     date: item.date,
          //     description: item.description,
          //     images: item.images,
          //     status: item.status,
          //     snapshotKey: item.snapshotKey,
          //   })
          // }
        />

参考:https://reactnavigation.org/docs/en/with-navigation.html

答案 1 :(得分:-1)

configure input