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

React Native + TypeScript:祖孙组件向父组件的Props传递问题

解决React Native跨组件状态传递问题

1. 父组件(HomeTeamInfo.tsx):定义状态与接收回调

父组件维护最终表单数据的状态,同时定义一个回调函数,将其传递给子组件用于接收数据。

import React, { useState } from 'react';
import { View, Button } from 'react-native';
import AddPlayer from './AddPlayer';

const HomeTeamInfo = () => {
  // 存储最终表单数据的状态
  const [formData, setFormData] = useState({
    playerName: '',
    awayTeam: ''
  });

  // 接收子组件传来数据的回调函数
  const handleSaveData = (data: { playerName: string; awayTeam: string }) => {
    setFormData(prev => ({ ...prev, ...data }));
    // 可在此添加关闭Modal、提交表单等后续逻辑
  };

  return (
    <View>
      {/* 原有表单内容 */}
      <AddPlayer onSave={handleSaveData} />
    </View>
  );
};

export default HomeTeamInfo;

2. 子组件(AddPlayer.tsx):收集自身数据并传递回调给孙组件

子组件管理自身TextInput的状态,同时将父组件的回调传递给孙组件,最后在点击SAVE按钮时汇总所有数据,通过回调传给父组件。

import React, { useState } from 'react';
import { View, TextInput, Button, Modal } from 'react-native';
import AwayTeamInfo from './AwayTeamInfo';

interface AddPlayerProps {
  onSave: (data: { playerName: string; awayTeam: string }) => void;
}

const AddPlayer: React.FC<AddPlayerProps> = ({ onSave }) => {
  const [playerName, setPlayerName] = useState('');
  const [selectedTeam, setSelectedTeam] = useState('');
  const [modalVisible, setModalVisible] = useState(false);

  // 接收孙组件传来的下拉选中值
  const handleTeamSelect = (team: string) => {
    setSelectedTeam(team);
  };

  // 点击SAVE时触发父组件回调,传递汇总数据
  const handleSave = () => {
    onSave({ playerName, awayTeam: selectedTeam });
    setModalVisible(false);
  };

  return (
    <View>
      <Button title="添加球员" onPress={() => setModalVisible(true)} />
      <Modal visible={modalVisible}>
        <View>
          <TextInput
            placeholder="球员姓名"
            value={playerName}
            onChangeText={setPlayerName}
          />
          {/* 将回调传给孙组件,用于接收下拉选择值 */}
          <AwayTeamInfo onTeamSelect={handleTeamSelect} />
          <Button title="SAVE" onPress={handleSave} />
          <Button title="取消" onPress={() => setModalVisible(false)} />
        </View>
      </Modal>
    </View>
  );
};

export default AddPlayer;

3. 孙组件(AwayTeamInfo.tsx):传递下拉选择值给子组件

孙组件仅需在用户选择下拉选项时,通过接收的回调函数将选中值传递给子组件。

import React from 'react';
import { View, Picker } from 'react-native';

interface AwayTeamInfoProps {
  onTeamSelect: (team: string) => void;
}

const AwayTeamInfo: React.FC<AwayTeamInfoProps> = ({ onTeamSelect }) => {
  return (
    <View>
      <Picker
        selectedValue=""
        onValueChange={(itemValue) => onTeamSelect(itemValue)}
      >
        <Picker.Item label="选择球队" value="" />
        <Picker.Item label="球队A" value="teamA" />
        <Picker.Item label="球队B" value="teamB" />
        <Picker.Item label="球队C" value="teamC" />
      </Picker>
    </View>
  );
};

export default AwayTeamInfo;

核心逻辑说明

  • 数据通过回调函数逐层向上传递:孙组件→子组件→父组件,每一层仅负责传递回调和管理自身对应的状态。
  • 若后续组件层级更深或数据传递更复杂,可考虑使用React Context或Redux简化状态管理,但逐层传递props是新手最易上手的基础方案。

内容的提问来源于stack exchange,提问作者Elvys Pons

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 07:08:15