Javascript 在react中获取数据的最佳方法是什么? 我目前使用contentful进行数据管理,因此这次不是通常的axios/fetch方法。
我使用useContext将数据共享给我的组件,并使用useEffect设置新数据的状态。你问什么问题丑陋的语法。当我在第二个重新渲染器中传递数据时,我无法立即访问数据,Javascript 在react中获取数据的最佳方法是什么? 我目前使用contentful进行数据管理,因此这次不是通常的axios/fetch方法。,javascript,reactjs,Javascript,Reactjs,我使用useContext将数据共享给我的组件,并使用useEffect设置新数据的状态。你问什么问题丑陋的语法。当我在第二个重新渲染器中传递数据时,我无法立即访问数据,数据[0][0]还不存在,因此它会抛出一个错误。这导致了这种令人厌恶的语法:{data?data[0].sys.contentType.sys.id:“}它可能“很好”,而且“有效”。但在我看来,这简直太残忍了 App.jsx const-App=()=>{ const contentfulHook=useState(null)
数据[0][0]
还不存在,因此它会抛出一个错误。这导致了这种令人厌恶的语法:{data?data[0].sys.contentType.sys.id:“}
它可能“很好”,而且“有效”。但在我看来,这简直太残忍了
App.jsx
const-App=()=>{
const contentfulHook=useState(null);
使用效果((e)=>{
然后((res)=>contentfulHook[1](res.items));
/*
或-相同的结果
(异步()=>{
const data=wait client.getEntries()。然后((res)=>res.items);
contentfulHook[1](等待数据);
})();
*/
//加载内容时移除预加载程序
设置超时(()=>{
const preload=document.getElementById(“预加载程序”);
preload.style.opacity=0;
Preload.addEventListener(“transitionend”,(e)=>{
预加载。移除();
});
}, 0);
}, []);
console.log(contentfulHook[0]);
返回(
);
};
render(,document.getElementById(“根”));
关于这个问题,我有两个建议:
数据
、加载
和错误
模式(Apollo和其他库可能使用)const-App=()=>{
const{data,loading,error}=useRequest();
返回(
);
};
常量useRequest=()=>{
const[data,setData]=useState(null)
常量[loading,setLoading]=useState(false)
const[error,setError]=useState(null)
useffect(()=>{
设置加载(真)
client.getEntries()
.然后((res)=>setData(res.items))
.catch((e)=>setError(e))
.最后(()=>{
移除预加载程序();
设置加载(假);
});
}, []);
返回{数据,加载,错误};
}
常量RemovePreload=()=>{
设置超时(()=>{
const preload=document.getElementById(“预加载程序”);
preload.style.opacity=0;
Preload.addEventListener(“transitionend”,(e)=>{
预加载。移除();
});
}, 0);
}
render(,document.getElementById(“根”));
无论哪种方式,在渲染时访问数据
属性之前,仍然需要检查数据。即使它处于顶级状态,如:
const-App=()=>{
const{data,loading,error}=useRequest();
返回(
{data&&{data[0].sys.contentType}
);
};
关于这个问题,我有两个建议:
数据
、加载
和错误
模式(Apollo和其他库可能使用)const-App=()=>{
const{data,loading,error}=useRequest();
返回(
);
};
常量useRequest=()=>{
const[data,setData]=useState(null)
常量[loading,setLoading]=useState(false)
const[error,setError]=useState(null)
useffect(()=>{
设置加载(真)
client.getEntries()
.然后((res)=>setData(res.items))
.catch((e)=>setError(e))
.最后(()=>{
移除预加载程序();
设置加载(假);
});
}, []);
返回{数据,加载,错误};
}
常量RemovePreload=()=>{
设置超时(()=>{
const preload=document.getElementById(“预加载程序”);
preload.style.opacity=0;
Preload.addEventListener(“transitionend”,(e)=>{
预加载。移除();
});
}, 0);
}
render(,document.getElementById(“根”));
无论哪种方式,在渲染时访问数据
属性之前,仍然需要检查数据。即使它处于顶级状态,如:
const-App=()=>{
const{data,loading,error}=useRequest();
返回(
{data&&{data[0].sys.contentType}
);
};
您可以使用数组分解吗?这就是通常使用的:const[value,setValue]=contentfulHook
我想在provider中同时传递readState和setState,语法与App.jsx中的语法类似,因此如果需要,我可以同时使用这两种语法是的,这就是我在示例中分解contentfulHook
的原因。问题更多的是必须检查undefined/null,而不是索引到useState返回的内容吗?是的,我发现语法难看且令人不快。我希望能够使用数据,而不必有条件地检查数据是否存在嗯,是的,我理解。这是可以解决的问题。我想已经可以用悬念了。你能用数组解构吗?这就是通常使用的:const[value,setValue]=contentfulHook
我想在provider中同时传递readState和setState,语法与App.jsx中的语法类似,因此如果需要,我可以同时使用这两种语法是的,这就是我在示例中分解contentfulHook
的原因。问题更多的是必须检查undefined/null,而不是索引到useState返回的内容吗?是的,我发现语法难看且令人不快。我希望能够使用数据,而不必有条件地检查数据是否存在嗯,是的,我理解。这是可以解决的问题。我想已经有悬念了。