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

React组件数据传递问题:如何将获取的cropsData传入SearchCard

如何将获取到的作物数据传入SearchCard组件?

方法:使用React状态管理(useState)

这是最直接的实现方案,通过在父组件中维护数据状态,再将状态作为props传递给SearchCard组件,具体步骤如下:

1. 父组件修改

首先在父组件中引入useState,定义存储作物数据的状态,并在请求成功后更新状态:

import { useState } from 'react';
import SearchCard from './SearchCard'; // 引入SearchCard组件

function ParentComponent() {
  const [search, setSearch] = useState(''); // 搜索关键词状态
  const [crops, setCrops] = useState([]); // 存储获取到的作物数据
  const [isLoading, setIsLoading] = useState(false); // 加载状态

  const handleSearch = async () => {
    if (!search) return;
    setIsLoading(true);
    try {
      const { data } = await getCropDetails(search);
      setCrops(data.crops); // 将请求到的作物数据存入状态
    } catch (error) {
      console.error('获取作物数据失败:', error);
      // 可在此添加错误提示逻辑
    } finally {
      setIsLoading(false);
    }
  };

  return (
    <div>
      {/* 搜索输入区域 */}
      <input 
        type="text" 
        value={search} 
        onChange={(e) => setSearch(e.target.value)} 
        placeholder="输入作物名称搜索"
      />
      <button onClick={handleSearch}>搜索</button>

      {/* 加载状态提示 */}
      {isLoading && <p>加载中...</p>}

      {/* 传递数据给SearchCard */}
      {crops.length > 0 ? (
        <SearchCard data={crops} />
      ) : (
        !isLoading && <p>暂无数据,请搜索作物</p>
      )}
    </div>
  );
}

2. SearchCard组件修改

调整组件逻辑,使其能接收并渲染传入的作物数据,支持数组(多作物)和单个对象(单作物)两种场景:

import * as React from 'react';
import Card from '@mui/material/Card';
import { Stack, CardActions, CardContent, CardMedia, Button, Typography } from '@mui/material';
import { Link } from 'react-router-dom';

function SearchCard({ data }) {
  // 处理数组类型数据,生成多张卡片
  if (Array.isArray(data)) {
    return (
      <Stack direction="row" flexWrap="wrap" gap={2} alignItems='center' justifyContent='center'>
        {data.map((crop, index) => (
          <Card key={index} sx={{ maxWidth: 300 }}>
            <CardMedia
              style={{ height: "300px" }}
              component="img"
              image={crop.image || "https://source.unsplash.com/random"}
              alt={crop.name || "作物"}
            />
            <CardContent>
              <Typography gutterBottom variant="h5" component="div">
                {crop.name}
              </Typography>
              <Typography variant="body2" color="text.secondary">
                {crop.description || "暂无描述信息"}
              </Typography>
            </CardContent>
            <Stack alignItems='center'>
              <Link to={`/details/${crop.id}`} style={{ textDecoration: 'none' }} >
                <CardActions>
                  <Button size="small">查看详情</Button>
                </CardActions>
              </Link>
            </Stack>
          </Card>
        ))}
      </Stack>
    );
  }

  // 处理单个对象类型数据,渲染单张卡片
  return (
    <Stack alignItems='center' justifyContent='center'>
      <Card sx={{ maxWidth: 300 }}>
        <CardMedia
          style={{ height: "300px" }}
          component="img"
          image={data?.image || "https://source.unsplash.com/random"}
          alt={data?.name || "作物"}
        />
        <CardContent>
          <Typography gutterBottom variant="h5" component="div">
            {data?.name || "未知作物"}
          </Typography>
          <Typography variant="body2" color="text.secondary">
            {data?.description || "暂无描述信息"}
          </Typography>
        </CardContent>
        <Stack alignItems='center'>
          <Link to={`/details/${data?.id}`} style={{ textDecoration: 'none' }} >
            <CardActions>
              <Button size="small">查看详情</Button>
            </CardActions>
          </Link>
        </Stack>
      </Card>
    </Stack>
  );
}

export default SearchCard;

补充说明

  • 加入isLoading状态,避免请求过程中出现空白或错误内容
  • 增加数据容错处理(可选链?.),防止数据未加载时触发报错
  • 为详情链接添加动态路由参数,方便跳转到对应作物的详情页
  • 处理了数据为空的场景,给出友好提示

内容的提问来源于stack exchange,提问作者Akash Suklabaidya

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 18:42:50