【问题标题】:Make a reusable component in react native?在本机反应中制作可重用组件?
【发布时间】:2019-12-11 19:03:58
【问题描述】:

我制作了一个可重用的组件来呈现一个平面列表,并且在按下它时我有一个 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,
          //   })
          // }
        />

【问题讨论】:

  • 您是否将 OrdersList 组件添加到 createStackNavigator 中?
  • @DominikTargosz 不,我没有 ????
  • 那么你知道你的错误是什么吗?
  • 嗯,如果我将它添加到 createStackNavigator 中,我将获得双菜单和同时渲染两个屏幕,
  • 只有添加到 createStackNavigator 的组件才会接收导航作为道具。我不知道你怎么会得到双菜单。需要查看与您的导航相关的代码

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


【解决方案1】:

您的错误是告诉我呈现 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

【讨论】:

  • 很公平的维尼修斯,这简直就是魅力所在,谢谢
  • 哦对不起我忘记了
【解决方案2】:
const OrdersList = props => {
    return (
      <View >
        <FlatList
          data={props.data}
          renderItem={({item}) => {
            return (
              <TouchableOpacity
                onPress={()=>{

                props.navigate(props.screen,{item:item, item2:props.additionalProp})
                   }
                }
               >
                  <Text>
                    {item.service}
                  </Text>
              </TouchableOpacity>
            )}}
        />
      </View>
    );
  };
  export default class Prova extends Component{

render(){
    return(
        <View>
        <OrdersList
        data={[{service:'service',data:'2019-12-12'},{}]}
        navigate={this.props.navigation.navigate}
        screen={'YourScreen'}
        additionalProp={"additional prop"}
        ></OrdersList>
        </View>
    )}

  }

【讨论】:

  • 他传递的参数呢?
  • 感谢您的回答,但为每个项目传递道具并不是一个好主意,而不是像@Vinicius 所说的那样使用withNavigation
猜你喜欢
  • 1970-01-01
  • 2020-01-18
  • 2018-07-06
  • 1970-01-01
  • 1970-01-01
  • 2023-01-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多