简体   繁体   English

React 钩子中的状态不会立即改变

[英]State not changing immediately in React hooks

I am changing state after calling an onChange event it is not reflecting immediately.我在调用 onChange 事件后改变状态,它没有立即反映。 How can I make my state change Immediately.我怎样才能让我的状态立即改变。 Here is my parent component code.这是我的父组件代码。

import React from 'react';
import {One, test, test1} from './Sample/SampleData';

export const FirstUser = () => {
    const [data, setData] = React.useState(One)
    const [id, setId] = React.useState("")
    
    React.useEffect(()=> {
            onChangeId(id)
    },[id])

const onChangeId = (myId:string) => {
    setId(myId)
    switch (myId) {
        case '1':
            setData(test);
            break;
        case '2':
            setData(test1);
            break;
        default:
            setData(One);
            break;
    }
}
    return (
        <div>
            <ChildComponent
                firstData={One} 
                onChangeId={onChangeId} 
                secondData={data}
            />
        </div>
    );
};

And below is my ChildComponent code -下面是我的 ChildComponent 代码 -

import React from 'react';

export const ChildComponent = ({
    firstData,
    onChangeId,
    secondData
}: NewInterface) => {
const [format, setFormat] = useState(secondData);
const onChange = (
        type: string,
        val:string
    ) => {
        
        if (type === "welcome") {
                onChangeId(val);
                setFormat(secondData);                
                console.log(secondData , "secondData")                
        }
    };
    return (
        
            <React.Fragment>                
                <AnotherChildComponent
                    onChange={onChange}
                    firstData={firstData}
                    newData={format}
                />
            </React.Fragment>
    
    );
}

code for AnotherChildComponent is -另一个子组件的代码是 -

import React from 'react';

export interface SomeInterface {
    onChange: (
        type: string,
        val:  string
    ) => void;
    
    firstData: DataInterface,
    newData: DataInterface
}

export const AnotherChildComponent = ({
    onChange,
    firstData,
    newData
}: SomeInterface) => {
    let { oneData, twoData } = firstData;
    let { thirdData } = newData;

    const translatedOneData = oneData.map(({ label, value }) => ({
        label: translateFn!(label),
        value
    }));

    const translatedTwoData = twoData.map(({ label, value }) => ({
        label: translateFn!(label),
        value
    }));

    const translatedThreeData = thirdData.map(({ label, value }) => ({
        label: translateFn!(label),
        value
    }));
console.log(newData, "newData")
    return (
        <React.Fragment>
                
                    <Grid container>
                        <Select
                            options={translatedTwoData}
                            value={selectedTwoData}                         
                            onChange={(val: string) =>
                                onChange('welcome', val)
                            }
                        />
                        <SectionLabel label="Newdata" />
                        <Select
                            options={translatedThreeData}
                            value={selectThirdData}
                            onChange={(val: string) =>
                                onChange('guest', val)
                            }
                        />
                    </Grid>
                
            
        </React.Fragment>
    );
};

After setting state of setFormat, When I am consoling secondData in ChildComponent then it is displaying data on second time change.设置 setFormat 的状态后,当我在 ChildComponent 中安慰 secondData 时,它会在第二次更改时显示数据。 It is not displaying data in first time change(immediately).它没有在第一次更改时(立即)显示数据。 Means I am getting desired secondData when I call onChangeId two times.意味着当我两次调用 onChangeId 时,我得到了想要的 secondData。 It is not showing immediately.它没有立即显示。 I have used useEffect and passed id & data one by one but still changes data on two times call.我已经使用了 useEffect 并一一传递了id & data ,但仍然在两次调用时更改了数据。 So can anyone help me in that?那么有人可以帮助我吗?

You should first know that useState mutate callbacks are asynchronous, so your console.log(...) right after calling the callback will always show the old value.您应该首先知道useState mutate 回调是异步的,因此在调用回调后您的console.log(...)将始终显示旧值。 However, I'm pretty sure the UI updates are working fine, unless you show us the code to AnotherChildComponent .但是,我很确定 UI 更新工作正常,除非您向我们展示AnotherChildComponent的代码。

Either way, your console.log will always output the same value as mount time since that is when it was defined.无论哪种方式,您的console.log将始终输出与挂载时间相同的值,因为那是它被定义的时候。

And a WARNING , if you are not careful with the way you call onChangeId in your parent component, you might end up with a recursion.还有一个WARNING ,如果您不小心在父组件中调用onChangeId的方式,您可能会以递归告终。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM