上篇父子之间通信讲的是父子之间方法的通信,今天讲的是父子之间数据共享,因为是自己遇到什么就来总结什么了,所以没有一下更新完。
Father.tsx
import React, { useEffect, useState, useRef } from 'react';
import Child from './component/child.tsx';
const Father = () =>{const childRef = useRef<any>();const [fatherData, setFatherData] = useState();const dataList = async()=>{try{//这是我调用的接口,可以根据自己项目修改const {ret,data} = await list(param);if(ret){setFatherData(data);}}}useEffect(()=>{console.log(childRef?.current?.sonData)},[childRef?.current?.sonData])return(<Child ref={childRef} fatherData={fatherData}></Child>)
}
export default Father;
Child.tsx
import React, { useEffect, useState, forwardRef, useImperativeHandle } from 'react';
const Child = (props: any,ref: any)=>{const [sonData, setSonData] = useState();const sonDataRef = useRef<any>();const { fatherData } = props;//调用接口const infos= async()=>{try{//这是我调用的接口,可以根据自己项目修改const {ret,data} = await information(param);if(ret){//方法一:setSonData(data);//方法二:sonDataRef.current = data;}}}useEffect(()=>{console.log(fatherData )},[fatherData])useImperativeHandle(ref, ()=>({infosItem,sonData(或者sonData:sonDataRef.current||sonData)}));return(<></>)
}
export default forwardRef(Child);
我是这样穿的,具体问题具体传值。
问题:
我父子组件中都要调用一个接口,要拿到里边的一个id,我本来是父子之间各自调用了这个方法,本来说没问题,后来后端觉得不妥,让我修改一下,这两个地方处理的逻辑不一样,都在代码下边也各自调用了这些方法,我就想如果是父组件调用了,那么就把取到的data传值给子组件,或者就是子调用传给父,但是遇到了一个问题。
先说子传父:因为我存data用的是useState存值的,所以第一次传过去的是undefined,但是第一次不应该是undefined,可能你们会说如果是undefined就不传,但是不传他们就不是同时执行了,父组件中的数据初始化就出不来,只有操作了一个事件才会出现,这是不符合逻辑的。
然后我去父传子,同样这个问题,因为他们是同步同时执行的,数据在初次渲染的时候就要出来。
我想实现父传子或者子传父在子组件(或者父组件)初始化就要用的值,如何做?