React Native 如何处理平面列表中项目的onPress???

bsxbgnwa  于 2023-02-09  发布在  React
关注(0)|答案(3)|浏览(187)

我的平面列表是一个无状态的组件,当项目被按下时,我想通过调用方法“handleOnPress”来处理onPress。我该怎么做呢?下面是示例代码。
'

handleOnPress = () => {
  .....
}
<SampleListView
    data={prop.data}
    onPress={this.handleOnPress}
/>
const SampleListView = (props: Props) => {
  return (
    <FlatList
        style={styles.container}
        data={props.data}
        keyExtractor={item => item.id.toString()}
        renderItem={renderItem}
    />
    )
}
renderItem = ({ item }: { item: DataSample }) => {
  return (
  <TouchableWithoutFeedback onPress={ () => props.onPress}>
      ....
  </TouchableWithoutFeedback>
  )
}

'

e4eetjau

e4eetjau1#

你能试试这个吗?

handleOnPress = () => {
  .....
}
<SampleListView
    data={prop.data}
    onPress={this.handleOnPress}
/>
const SampleListView = (props: Props) => {
  return (
    <FlatList
        style={styles.container}
        data={props.data}
        keyExtractor={item => item.id.toString()}
        renderItem={renderItem}
    />
    )
}
renderItem = ({ item }: { item: DataSample }) => {
  return (
    <TouchableWithoutFeedback onPress={props.onPress}>
      <View>
        ....
      </View>
    </TouchableWithoutFeedback>
  )
}

请注意这两个链接。
https://facebook.github.io/react-native/docs/flatlist
TouchableWithoutFeedback with custom component inside doesn't fires onPress callback
不同之处在于,将callback作为参数并添加View层。

qyuhtwio

qyuhtwio2#

您的代码的问题是这个onPress={props.onPress}您的renderItem函数不知道( prop )它所知道的是传递给它的项目参数。
如果你这么做

onPress={() => alert("clicked")}

通过数据传递onPress函数,或者在构造函数中绑定renderItem函数,然后调用

onPress={() => this.props.onPress()}
zaqlnxep

zaqlnxep3#

<FlatList
    style={styles.container}
    data={props.data}
    keyExtractor={item => item.id.toString()}
    renderItem={ ({ item }) => (
     <SomeComponent
       title={item.title}
       onPress={ () => pressHandler() }
     /> 
    )}
/>

因此,基本上在“renderItem”中,你传递的组件将被分配给每个“item”迭代。例如,你有博客文章数据,“renderItem”组件将表示每个文章(item)的布局。
这意味着您可以在该组件上设置onPress(例如〈SomeComponent onPress={()=〉pressHandler()} /〉),并将处理函数传递给此onPress属性。
您甚至可以将参数传递给此处理程序,例如:

<FlatList
  style={styles.container}
  data={props.data}
  keyExtractor={item => item.id.toString()}
  renderItem={ ({ item }) => (
   <SomeComponent
     title={item.title}
     onPress={ () => pressHandler(item.id) }
   /> 
  )}
 />

请记住,您的数据对象需要有这个“id”或“_id”或“uid”或其他东西,但您肯定需要从“item”对象引用这个“id”,因为您正在迭代的数据的每个示例都会自动Map到“item”对象。
一旦它被传递给子组件(SomeComponent /〉),您就可以像这样访问它:

export const SomeComponent = ({ title, onPress }) => {

 return (
   <Pressable onPress={onPress}>
      [...some content here]
   </Pressable>
 );

};

除了Pressable,你可以尝试其他的东西,但我发现onPress on View可能无法正常工作,而“Pressable”将在你的应用程序中更具未来性。

相关问题