我正在与react 和打字.我是新手,我不确定如何确保子组件根据传递给它的props 正确地设置状态.

我正在将一个对象从父组件传递给子组件作为props .父组件具有一个具有关键点和空值的对象.下面是一个这样的例子:

emptyObject = {
    id: '',
    name: '',
    timestamp: ''
}

异步功能foo查询数据库并基于组件的属性填充值,然后返回更新的对象的promise .然后,应该将更新后的对象传递给子组件,在该子组件中,值存储为State.

function ParentComponent({propName}) {
    const [myObject, setMyObject] = useState(emptyObject);

    useEffect( () => {
        foo(emptyObject).then((x) => {
            setMyObject(x);
        });
    }, [propName]);

    return (
        <>
            <ChildComponent obj = {myObject} />
        </>
    );
}


function ChildComponent({obj}) {
    const {id, name, timestamp} = obj;
    console.log("id: " + id + ". name: " + name) // this gives the correct values
    
    const [myId, setMyId] = useState(id)
    const [myName, setMyName] = useState(name);
    console.log("id: " + myId + ". name: " + myName) // this gives "id: undefined. name: undefined"


    return (
        <displays a form that is pre-populated with the id and name values>
    )
}

我面临的问题是,解构对象会给出正确的值,但State中的值是未定义的.我怀疑这是因为在Reaction中设置State是异步的,但我不确定如何解决这个问题.

我try 的第一件事是在子组件中添加一个挂钩,但同样的问题也出现了.

function ChildComponent({obj}) {
    const {id, name, timestamp} = obj;
    const [myId, setMyId] = useState(id)
    const [myName, setMyName] = useState(name);
    
    useEffect( () => {
        setMyId(id);
        setMyName(name);
    }, [obj]);

我还try 在父级中实现两个useEffects,并修改原始useEffect中的逻辑,以确保值更新,但仍然会出现相同的结果.

const [myObject, setMyObject] = useState(emptyObject);
const [updatedObject, setUpdatedObject] = useState(emptyObject);

    useEffect( () => {
       foo(emptyObject).then((x) => {
           setUpdatedObject(x);
       });
    }, [propName]);

    useEffect( () => {
        setMyObject(updatedObject);
    }, [updatedObject]);

    return (
        <>
            <ChildComponent obj = {myObject} />
        </>
    );

推荐答案

第一次渲染child时,props 会传递等于您设置的初始值(这就是您未定义的原因)的props ,直到foo函数设置props .UseState钩子只会首先初始化,并且在更新init值时,状态不会更新.

你可以通过监听child中的props 更新来解决这个问题.

function ChildComponent({obj}) {
    const [myId, setMyId] = useState('')
    const [myName, setMyName] = useState('');
    
    useEffect(()=>{
      setMyName(obj.name) 
      setMyId(obj.id) 
    },[obj]);    

    return (
        <displays a form that is pre-populated with the id and name values>
    )
}

我的建议是使用您传递到child的props ,因为它已经是parent中的状态,而Make Rerender to You child中的任何更改

function ChildComponent({ obj,  }) {
  const myId = obj.id; // or use it directly `obj.id`
  const myName = obj.name; // or use it directly `obj.name`
    
     .....
}

如果需要从child更新props ,则将setter函数作为props setMyObject传递

function ChildComponent({obj, setMyObject}) {....}

Typescript相关问答推荐

类型ElementTypes不可分配给类型ElementTypes.word'

Typescript联合类型-字段类型覆盖

如何根据参数的值缩小函数内的返回类型?

创建一个根据布尔参数返回类型的异步函数

在动态对话框中使用STEP组件实现布线

类型{}上不存在属性&STORE&A;-MobX&A;REACT&A;TYPE脚本

部分类型化非 struct 化对象参数

Next.js错误:不变:页面未生成

被推断为原始类型的交集的扩充类型的交集

已解决:如何使用值类型限制泛型键?

笛卡尔产品类型

如何通过TypeScrip中的函数防止映射类型中未能通过复杂推理的any值

基元类型按引用传递的解决方法

如何按属性或数字数组汇总对象数组

如何解决&Quot;类型不可分配给TypeScrip IF语句中的类型&Quot;?

Rxjs将省略的可观测对象合并到一个数组中

来自枚举的<;复选框和组件列表

是否使用类型将方法动态添加到类?

如何将元素推入对象中的类型化数组

如何根据Typescript 中带有泛型的对象嵌套键数组获取数组或对象的正确类型?