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

React Native中如何传递多选复选框数据至其他屏幕并展示

解决React Native多选商品无法传递所有选中项的问题

问题场景

在开发React Native应用时,我在SelectProducts屏幕实现了商品复选框选择功能,希望将所有选中商品的item.id、item.ad_headline、item.ad_price、item.ad_picture信息传递到RecordASale屏幕并展示,但当前仅能传递最后一个选中的商品数据,附上相关代码寻求修正方案。

原代码问题分析

  • includeSelectedItem函数每次触发时,直接用单个商品对象覆盖selectedBoxesItem状态,导致之前选中的商品数据被丢失,最终只保留最后一次选中的项
  • 提交时传递的[selectedBoxesItem]本质是把单个对象包装成数组,自然只能展示一个商品

修正方案

1. 修改SelectProducts屏幕的选中逻辑

调整includeSelectedItem函数,维护一个选中项数组,根据复选框状态添加或移除商品:

import React, {useState, useEffect} from 'react'
import { StyleSheet, Text, View, Alert, Image, ScrollView, TouchableOpacity, DataTable } from 'react-native';
import Checkbox from 'expo-checkbox';

const SelectProducts = ({route, navigation}) => { // 补充接收navigation参数
    const [checkedBox, setCheckedBox] = useState([]);
    const [selectedBoxesItem, setSelectedBoxesItem] = useState([]);
    const [itemList, setItemList] = useState([]);

    const includeSelectedItem = (item, index) => {
        const newCheckedBox = [...checkedBox];
        newCheckedBox[index] = !newCheckedBox[index];
        setCheckedBox(newCheckedBox);

        if (newCheckedBox[index]) {
            // 勾选时将商品添加到选中数组
            setSelectedBoxesItem(prev => [...prev, {
                selectedUniqueKey: item.id,
                selectedItemName: item.ad_headline,
                selectedItemPrice: item.ad_price,
                selectedItemPic: item.ad_picture
            }]);
        } else {
            // 取消勾选时从数组中移除对应商品
            setSelectedBoxesItem(prev => prev.filter(itemData => itemData.selectedUniqueKey !== item.id));
        }
    }

    const handleSelectedSubmit = () => {
        navigation.navigate({
            name: 'RecordASale',
            params: {
                post: selectedBoxesItem, // 直接传递完整的选中项数组
            },
            merge: true,
        })
    }

    return (
        <DataTable>
            {itemList.map((item, index) => (
                <DataTable.Row key={item.id}>
                    <DataTable.Cell>
                        <View style={styles.checkboxContainer}>
                            <Checkbox
                                value={checkedBox[index]}
                                onValueChange={() => includeSelectedItem(item, index)}
                                color={checkedBox[index] ? '#800080' : undefined}
                                style={styles.checkbox}
                            />
                        </View>
                    </DataTable.Cell>
                    <DataTable.Cell>
                        <Image source = {{uri: "https://cdn.beraty.com/beraty-ads/"+item.ad_picture}} style = {{ width: 30, height: 30 }} />
                    </DataTable.Cell>
                    <DataTable.Cell>{item.ad_headline}</DataTable.Cell>
                    <DataTable.Cell>{item.ad_price}</DataTable.Cell>
                </DataTable.Row>
            ))}
        
            <View style = {styles.submitButton}>
                <Text style = {styles.submitButtonText} onPress={() => handleSelectedSubmit()}>Done</Text>
            </View>
        </DataTable>
    );
}

const styles = StyleSheet.create({
    checkboxContainer: {
        flexDirection: 'row',
        alignItems: 'center',
    },
    checkbox: {
        marginRight: 8,
    },
    submitButton: {
        marginTop: 20,
        padding: 10,
        backgroundColor: '#800080',
        borderRadius: 5,
        alignItems: 'center',
    },
    submitButtonText: {
        color: 'white',
        fontSize: 16,
    }
});

2. 调整RecordASale屏幕渲染逻辑

原代码逻辑无需大改,优化key值和空状态提示:

const RecordASale = ({route}) => {
   return (
       <View>
           {route.params?.post?.length > 0 ? route.params.post.map((item) => (
               <View key={item.selectedUniqueKey}> {/* 用商品唯一ID作为key更稳定 */}
                   <Image source = {{uri: "https://cdn.beraty.com/beraty-ads/"+item.selectedItemPic}} style = {{ width: 30, height: 30 }} />
                   <Text>{item.selectedItemName}</Text>
                   <Text>{item.selectedItemPrice}</Text>
               </View>
           )) : <Text>暂无选中商品</Text>}
       </View>
   );
}

关键修正点说明

  • 选中状态管理:通过数组维护所有选中项,勾选时添加、取消时过滤移除
  • 参数传递:直接传递完整的选中项数组,而非单个对象包装的数组
  • 组件key优化:用商品唯一ID作为列表项key,避免索引key导致的渲染异常
  • 修复navigation参数缺失:原SelectProducts组件未接收navigation参数,需补充到props中

内容的提问来源于stack exchange,提问作者Tosin Seyi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 07:27:23