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

React-Admin:如何在Show View组件中获取record.id并传入自定义函数

解决方案

问题原因

你当前直接在ClientsShow组件顶层访问未定义的record变量无法获取值,react-admin的Show组件会异步拉取资源记录并存储在内部Context中,只有Show的后代组件或通过官方提供的控制器钩子才能拿到record数据。

方案1:使用useShowController钩子(推荐,可在组件顶层直接获取record)

这个钩子可以直接在Show组件内部获取控制器返回的所有状态,包括record、加载状态等:

import { useShowController, Show, TabbedShowLayout, Tab, ShowActions } from 'react-admin';

export const ClientsShow = props => {
    const classes = useStyles(); 
    // 调用钩子获取record和加载状态
    const { record, isLoading } = useShowController(props);
    // 加载中返回占位,避免record为undefined时报错
    if (isLoading) return <div>加载中...</div>;
    const chartDataThisYear = ClientShowGroupSum(null, "other", record.id)

    return (
        <Show actions={<ShowActions />} {...props}>
            <TabbedShowLayout >
                <Tab label="Principal">
                    <SimpleLineChart
                      chartTitle="Faturamento R$"
                      mylabels={ chartDataThisYear.chartlabels }
                      myvalues={ chartDataThisYear.chartvalues }                     
                      tooltipXpre={"Data: "}
                      tooltipYpre={"R$"} />
                </Tab>
            </TabbedShowLayout>
        </Show>
    )
}

方案2:使用useRecordContext钩子(适合在子组件内获取record)

如果你的逻辑不需要在组件顶层处理,可以把图表逻辑封装为独立子组件,在子组件内通过Context拿record:

import { useRecordContext, Show, TabbedShowLayout, Tab, ShowActions } from 'react-admin';

// 封装独立的图表组件
const ClientRevenueChart = () => {
  const record = useRecordContext();
  const chartDataThisYear = ClientShowGroupSum(null, "other", record.id);
  return (
    <SimpleLineChart
      chartTitle="Faturamento R$"
      mylabels={ chartDataThisYear.chartlabels }
      myvalues={ chartDataThisYear.chartvalues }                     
      tooltipXpre={"Data: "}
      tooltipYpre={"R$"} />
  )
}

export const ClientsShow = props => {
    const classes = useStyles(); 
    return (
        <Show actions={<ShowActions />} {...props}>
            <TabbedShowLayout >
                <Tab label="Principal">
                    <ClientRevenueChart />
                </Tab>
            </TabbedShowLayout>
        </Show>
    )
}

额外说明

如果你的ClientShowGroupSum是异步请求函数,需要配合useEffect和useState存储返回结果,避免重复调用:

const { record, isLoading } = useShowController(props);
const [chartData, setChartData] = useState({chartlabels: [], chartvalues: []});

useEffect(() => {
  if (!record) return;
  // 异步调用后更新状态
  ClientShowGroupSum(null, "other", record.id).then(res => setChartData(res));
}, [record])

内容的提问来源于stack exchange,提问作者Diego Gaona

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 16:36:08