当我的组件最初挂载时,我使用useEffect钩子异步获取数据。我还想使用一个效果(或另一个更适合这种情况的钩子)来转换这些数据,同样是在我的组件最初挂载时。
引用上下文并初始化增强节本地状态
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
});
}
});
}, []);
当我把上面的内容从use效应中拉出来,放在一个基本的if语句中时,它就起作用了(无限循环仍然是一个问题)...
if(schema && sections){
let newSectionArr = [];
...
}
我知道我应该根据React文档使用多种效果来分离关注点,但我不确定如何使一种效果“等待”另一种效果。
谢谢你的帮助。
第二部分不需要在use效应
中,它只是从您现有的状态派生出来的。您正在执行一个无限循环,因为您正在调用set增强状态,但是增强状态是派生的,不需要存在于状态本身。您的最终组件可能看起来像这样:
const displayContext = useContext(DisplayContext);
const { sections } = displayContext;
const schemaContext = useContext(SchemaContext);
const { schema, getSchema } = schemaContext;
// No need for redundant enhancedSections state
useEffect(() => {
async function fetchData() {
await getSchema()
}
fetchData();
}, []);
let enhancedSections = [];
const schemaData = schema ? schema.data : [];
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;
enhancedSections.push(item);
}
}
});
}
});
// Use enhancedSections as you need now
我试图创建一个从服务器获取数据的函数,它工作了。但我不确定这是不是正确的方法? 我不确定是调用fetchData函数的地方。我在里面做那个有用吗?对地方?而且,这个电话只会发生一次?因为我用[]? 一般来说,你会怎么做这样的事情?
太长,读不下去了如何模拟或使用带有数组的道具强制重置我的组件? 我正在实现一个组件,它显示一个计时器,并在达到零时执行回调。目的是让回调更新对象列表。后一个组件由新的React钩子和组成。 包含对计时器启动时间和剩余时间的引用。设置每秒钟调用一次的间隔,以更新剩余的时间,并检查是否应该调用回调。 该组件并不意味着重新安排计时器,或者在间隔达到零时保持间隔,它应该执行回调并空闲。为了让计时器刷新,我
从 react 导入 useState,将其粘贴到正文函数,但 react 告诉我错误的使用钩子。虽然另一个钩子像这样工作。
问题内容: 在带有钩子的React中,更新状态的正确方法是嵌套对象是什么? 一个人怎么会使用到的更新来(附加一个字段)? (改变价值)? 问题答案: 您可以像这样传递新值
本文向大家介绍解决JQuery全选/反选第二次失效的问题,包括了解决JQuery全选/反选第二次失效的问题的使用技巧和注意事项,需要的朋友参考一下 最近在项目中,遇到一个问题,测试全选/反选功能时,第一次对母框进行选中/非选中时,能同步子框的全选/反选状态,之后再点击母框,子框就没反应了。 原代码大致结构关键如下: 步骤一:尝试正面刚一波: 卒-----完全没有效果,弃之。 步骤二:快速上网搜索一