PAYATHON 2026

React Native 子组件如何通过回调向父组件返回选中值?

数据阿明

结论

data.handleCallback 报错,是因为传入子组件的 data 中没有 handleCallback 函数。当前代码将 data 声明为 typeof dict,而 dict 是空对象 {},类型中也没有回调函数。可以将选项数据和回调函数分别作为 props 传入:选项用于生成 SelectItem,回调用于把选中的值通知父组件。

子组件接收独立的回调 prop

可以将选项定义为字符串键值对,并单独提供 onValueChange 回调来处理选择变化:

interface Props {
  data: Record<string, string>;
  onValueChange: (value: string) => void;
}

const SelectorComponent: React.FC<Props> = ({ data, onValueChange }) => {
  const [selectedValue, setSelectedValue] = React.useState('');

  const handleChange = (itemValue: string) => {
    setSelectedValue(itemValue);
    onValueChange(itemValue);
  };

  return (
    <Select
      selectedValue={selectedValue}
      onValueChange={handleChange}
    >
      {/* 保留现有的 SelectTrigger、SelectPortal 等界面结构 */}
      <SelectContent>
        {Object.entries(data).map(([key, value]) => (
          <SelectItem key={key} label={key} value={value} />
        ))}
      </SelectContent>
    </Select>
  );
};

父组件可以这样传入选项对象和回调函数:

const options: Record<string, string> = {
  First: 'first',
  Second: 'second',
};

const ParentComponent = () => {
  const handleSelection = (value: string) => {
    console.log('父组件收到的选中值:', value);
  };

  return (
    <SelectorComponent
      data={options}
      onValueChange={handleSelection}
    />
  );
};

选择值变化时,子组件会调用 onValueChange(itemValue),父组件中的 handleSelection 随即收到该值。示例沿用原代码通过 Object.entries(data) 生成选项的方式,界面部分可以替换为项目中现有的 gluestack-ui 组件。

如果要继续使用 data.handleCallback

也可以将回调放进 data,同时更新类型,并确保父组件传入了函数:

interface Props {
  data: Record<string, string> & {
    handleCallback: (value: string) => void;
  };
}

原代码会对 data 执行 Object.entries(data)。因此,如果把函数放进同一个对象,遍历时也会将它当作一项。通常把选项对象和回调函数分开传递会更清楚,也能避免回调被当成选项。

原代码中的 const dict = {} 没有定义选项或回调。无论采用哪种 props 结构,父组件都需要传入符合类型声明的选项数据和函数。Select 回调参数的具体类型应以当前使用的组件库类型为准;以上示例沿用原代码中的 string 值。

备注:内容仅供参考。