【发布时间】:2020-06-03 03:03:44
【问题描述】:
我尝试了很多东西,但似乎无法理解为什么 setTypes 不会更新 'types' 数组??
import { useState, useEffect } from 'react';
import { PostList } from './post-list';
import * as api from '../utils/api';
export const PostSelector = (props) => {
const [posts, setPosts] = useState([]);
const [loading, setLoading] = useState(false);
const [type, setType] = useState('post');
const [types, setTypes] = useState([]);
const fetchTypes = async () => {
setLoading(true);
const response = await api.getPostTypes();
delete response.data.attachment;
delete response.data.wp_block;
const postTypes = response.data;
console.log(response.data); // {post: {…}, page: {…}, case: {…}}
setTypes(postTypes);
console.log(types); // []
// Why types remain empty??
}
const loadPosts = async (args = {}) => {
const defaultArgs = { per_page: 10, type };
const requestArgs = { ...defaultArgs, ...args };
requestArgs.restBase = types[requestArgs.type].rest_base; // Cannot read property 'rest_base' of undefined
const response = await api.getPosts(requestArgs);
console.log(response.data);
}
useEffect(() => {
fetchTypes();
loadPosts();
}, []);
return (
<div className="filter">
<label htmlFor="options">Post Type: </label>
<select name="options" id="options">
{ types.length < 1 ? (<option value="">loading</option>) : Object.keys(types).map((key, index) => <option key={ index } value={ key }>{ types[key].name }</option> ) }
</select>
</div>
);
}
请查看 console.log 并注意不同的响应。
我要做的是加载类型列表,在本例中为“帖子”、“页面”和“案例”,然后根据当前“类型”呈现帖子列表。默认类型是“post”。
如果我将 [types] 添加到 useEffect.我终于得到了值,但组件不停地呈现。
感谢大家的 cmets。很多人都指出了这个问题,因为我们设置状态并不意味着它会立即设置,因为它是异步的。
那我们如何解决这个问题呢?不管是什么原因,我们如何完成它?如果我们不知道它何时可用,我们如何在任何时间点使用我们的状态并根据我们的状态执行计算?我们如何确保我们等待所需的一切,然后使用我们期望的值?
【问题讨论】:
-
尝试使用扩展运算符。
setTypes([...postTypes]); -
看起来 response.data 是一个对象,而不是一个数组
-
这回答了你的问题。 stackoverflow.com/questions/60294328/…
-
欢迎您,但我不明白重新渲染如何与作为对象的类型相关联?
-
@drjorgepolanco,谢谢,我希望您已经阅读了本文中的 cmets ;) 很高兴它对您有所帮助。编码愉快。
标签: javascript reactjs react-hooks use-state