You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在React Native FlatList中实现DRY原则,复用OnPress传递的相同Props

React Native 避免重复传递Props优化方案

你当前代码的重复逻辑来自于同一份字段需要同时用于子组件渲染、路由跳转传参两个场景,只需要把公共字段聚合定义,即可消除重复代码,以下是3种可行的实现方案:

方案1:父层预聚合参数(零侵入改法,无需修改子组件)

提前把需要复用的字段提取为单独的对象,分别通过扩展运算符传给子组件、路由跳转方法即可:

const Parent = ({ navigation }) => {
  return (
    <>
      <StatusBar hidden />
      <FlatList
        data={data}
        renderItem={({ item }) => {
          // 只定义一次公共参数
          const commonParams = {
            title: item.name,
            color: item.color,
            foo: item.foo
          }
          return (
            <Child
              {...commonParams}
              onPress={() => navigation.navigate(routes.PATH, commonParams)}
            />
          )
        }}
        keyExtractor={item => item.id.toString()}
      />
    </>
  )
}

Parent.propTypes = {
  navigation: PropTypes.object.isRequired,
}

该方案改动最小,完全兼容现有子组件的逻辑,适合快速优化。

方案2:子组件自处理跳转逻辑(逻辑内聚,父组件代码更简洁)

借助React Navigation提供的useNavigation钩子,将路由跳转逻辑内聚到子组件内部,父组件只需传递完整的item对象即可:

父组件简化后代码:

const Parent = () => {
  return (
    <>
      <StatusBar hidden />
      <FlatList
        data={data}
        renderItem={({ item }) => <Child item={item} />}
        keyExtractor={item => item.id.toString()}
      />
    </>
  )
}

子组件修改后代码:

import { useNavigation } from '@react-navigation/native'

const Child = ({ item }) => {
  const navigation = useNavigation()
  const { name: title, color, foo } = item

  const handlePress = () => {
    navigation.navigate(routes.PATH, { title, color, foo })
  }

  return (
    <TouchableOpacity onPress={handlePress} activeOpacity={0.8}>
      <View style={[styles.row, { backgroundColor: color || colors.primary }]}>
        <Text style={styles.text}>{title}</Text>
      </View>
    </TouchableOpacity>
  )
}

Child.propTypes = {
  item: PropTypes.shape({
    name: PropTypes.string.isRequired,
    color: PropTypes.string.isRequired,
    foo: PropTypes.any.isRequired
  }).isRequired
}

该方案适合子组件跳转逻辑固定的场景,后续修改跳转参数只需要调整子组件代码即可,维护成本更低。

方案3:直接传递完整item(极简改法,适合小数据量场景)

如果跳转的目标页面支持直接接收完整item作为参数,可以进一步简化代码:

// 父组件renderItem逻辑
renderItem={({ item }) => (
  <Child
    title={item.name}
    color={item.color}
    onPress={() => navigation.navigate(routes.PATH, { item })}
  />
)}

注意:如果item包含大量冗余字段,会导致路由参数体积过大,不推荐大数据量场景使用该方案。


内容的提问来源于stack exchange,提问作者GʀᴜᴍᴘʏCᴀᴛ

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 13:18:00