【发布时间】:2020-02-21 08:28:07
【问题描述】:
当我的组件最初安装时,我正在使用 useEffect 挂钩异步获取数据。我还想使用效果(或更适合这种情况的其他钩子)来转换这些数据,当我的组件最初安装时也是如此。
引用上下文并初始化enhancedSections本地状态
const displayContext = useContext(DisplayContext);
const { sections } = displayContext;
const schemaContext = useContext(SchemaContext);
const { schema, getSchema } = schemaContext;
const [enhancedSections, setEnhancedSections] = React.useState(sections);
在挂载时获取数据(可行)
useEffect(() => {
async function fetchData() {
await getSchema()
}
fetchData();
}, []);
转换获取的数据,setEnhancedSections
这里的问题是schema此时仍然为空
useEffect(() => {
let newSectionsArr = [];
const schemaData = schema.data; //schema hasn't fetched yet
Object.entries(sections).forEach(section => {
let sectionKey = section[0];
for(var i = 1; i < section.length; i++){
section[i].forEach(item => {
let table = schemaData.find(table => table[item.definition.table_name]);
if (table) {
let obj = table[item.definition.table_name].columns.find(column => column.field === item.definition.field_name);
if (obj) {
item.definition.description = obj.description;
item.section = sectionKey;
newSectionArr.push(item);
}
}
setEnhancedSections(newSectionArr); // infinite loop...different problem
});
}
});
}, []);
当我将上述内容从 useEffect 中提取并放入基本 if 语句时,它可以工作(无限循环仍然是一个问题)...
if(schema && sections){
let newSectionArr = [];
...
}
我知道我应该根据 React 文档使用多种效果来分离关注点,但我不确定如何让一种效果“等待”另一种效果。
感谢您的帮助。
【问题讨论】:
-
如果我的回答不起作用,请告诉我。我对此很有信心,但如果没有,我还有其他想法。
标签: reactjs async-await infinite-loop react-hooks use-effect