gpt4 book ai didi

reactjs - 立即更新 useState

转载 作者:行者123 更新时间:2023-12-05 00:44:35 27 4
gpt4 key购买 nike

useState 不会立即更新状态。

我正在使用 react-select并且我需要根据请求的结果使用选择的 (multi) 选项加载组件。

出于这个原因,我创建了状态 defaultOptions 来存储 queues 常量的值。

原来加载组件的时候,只显示第二次的值。

我在queues中做了一个console.log,返回的不是空的。

我对 defaultOptions 状态做了同样的事情,返回为空。

我创建了一个 codesandbox以便更好地观看。

const options = [
{
label: "Queue 1",
value: 1
},
{
label: "Queue 2",
value: 2
},
{
label: "Queue 3",
value: 3
},
{
label: "Queue 4",
value: 4
},
{
label: "Queue 5",
value: 5
}
];

const CustomSelect = (props) => <Select className="custom-select" {...props} />;

const baseUrl =
"https://my-json-server.typicode.com/wagnerfillio/api-json/posts";

const App = () => {
const userId = 1;
const initialValues = {
name: ""
};
const [user, setUser] = useState(initialValues);
const [defaultOptions, setDefaultOptions] = useState([]);
const [selectedQueue, setSelectedQueue] = useState([]);

useEffect(() => {
(async () => {
if (!userId) return;
try {
const { data } = await axios.get(`${baseUrl}/${userId}`);
setUser((prevState) => {
return { ...prevState, ...data };
});

const queues = data.queues.map((q) => ({
value: q.id,
label: q.name
}));

// Here there is a different result than emptiness
console.log(queues);
setDefaultOptions(queues);
} catch (err) {
console.log(err);
}
})();

return () => {
setUser(initialValues);
};
}, []);

// Here is an empty result
console.log(defaultOptions);

const handleChange = async (e) => {
const value = e.map((x) => x.value);
console.log(value);
setSelectedQueue(value);
};

return (
<div className="App">
Multiselect:
<CustomSelect
options={options}
defaultValue={defaultOptions}
onChange={handleChange}
isMulti
/>
</div>
);
};
export default App;

最佳答案

当您调用 setState 时,React 不会立即更新状态,有时可能需要一段时间。如果你想在设置新状态后做某事,你可以使用 useEffect 来确定状态是否改变如下:

    const [ queues, setQueues ] = useState([])

useEffect(()=>{
/* it will be called when queues did update */
},[queues] )

const someHandler = ( newValue ) => setState(newValue)

关于reactjs - 立即更新 useState,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66607037/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com