【发布时间】:2021-03-25 09:09:21
【问题描述】:
useState 不会立即更新状态。
我正在使用react-select,我需要根据请求的结果使用选择的 (multi) 选项加载组件。
出于这个原因,我创建了状态defaultOptions,来存储queues 常量的值。
原来在加载组件的时候,只显示第二次的值。
我在queues中做了一个console.log,返回与空不一样。
我对@987654329@ 状态做了同样的事情,返回是空的。
我创建了一个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;
【问题讨论】:
-
useState 在第一次渲染后触发。如果您想立即使用数据开始,或者您在状态中预取选项然后进行渲染,或者在您添加的同一个组件中加载作为初始渲染并在您第一次获取后显示。在这里,您仅在打开后才运行 useEffect
-
但在这里我得到了数据
const {data} = await api.get ('/users/${userId}');` 得到数据后,我将结果添加到状态setUserQueues。尽管我真的尝试过,但我无法做到这一点。 -
我认为建议您执行
if (!userQueues) return <div>Loading</div>之类的操作或什么都不做,这样就不会出现没有信息的渲染。您不会将数据移动到第一个渲染。您将第一个渲染移至数据。 -
在哪里为您的退货声明定义了
queues? -
queues在这里声明const queues = data.queues.map((q) => ({...
标签: reactjs react-hooks react-select