场景需求:A B 两组件,当 A组件(如添加、删除、更新数据)后需要刷新 B组件 表格数据时,或需要在特定时机强制更新表格数据时,这是一种很常见的 React 组件间通信模式,通过 ref 暴露必要的方法给父组件使用。
1、单页面
import { useRef } from 'react'
const tableRef = useRef<HTMLTableSectionElement>(null)
<div ref={tableRef}> xxx </div>
2、多页面
1.子组件暴露ref
export type TranslationTableRef = { refresh: () => void }
useImperativeHandle(ref, () => ({
refresh: mutate,
}))
const { data: translationRecord, mutate } = useSWR(
{
action: 'FetchTranslationUsageData',
params: query,
},
params => translationsListApi(params.params),
{ refreshInterval: 3000 },
)
2.父组件接收
//父组件
import type { TranslationTableRef } from './xxx'
const tableRef = useRef<TranslationTableRef>(null)
<DocumentUploader transRecordTableRef={tableRef.current}/> //需要调用的子组件
<TransRecordTable ref={tableRef} /> //被调用的子组件
3.调用
export default function DocumentUploader({ transRecordTableRef }: { transRecordTableRef: TranslationTableRef | null }) {
xxx
const handleOk = async () => {
try {
await xxxApi({
params: {
xxx:xxx
},
})
transRecordTableRef?.refresh()
}
finally {
xxx
}
}
}