ReactJs 无法获取异步内容形式 api 在 useEffect 中调用并稍后在组件中使用它
ReactJs can't get async content form api call in useEffect and use it later in component
我迷路了。我已经尝试了几乎所有我知道的。在我的另一个组件中,类似的过程工作正常,但在这个组件中,显然有一些错误的实现。
我有一个 Context Provider,并设置了两个要共享的值,一个调用 Api 并检索联系人列表 (getContactsList
) 的函数,以及一个变量我把联系人列表放在哪里 (contactsList
)。
我在 useEffect
中调用 getContactsList
。后来,我可以使用 contactsList
变量,但始终是一个空数组。我知道问题可能与 Promises 和异步函数有关,但我在我的代码中找不到错误。
我在这里留下了组件的副本,从有问题的视图组件开始:
详细信息组件:
function ContactDetail() {
const { getContactsList, contactsList } = useContext(ContactsContext);
const { id } = useParams();
useEffect(() => { getContactsList().catch(null) }, []);
const contact = contactsList?.filter(c => {
return (Number(c.id) === Number(id))
});
return (
<div>
{contact? "contact finded" : "contact not finded"}
</div>
);
}
Api通话
async function apiCall (
url,
method = "get",
body,
headers)
{
try {
const response = await fetch(url, {
method,
body,
headers
});
const r = await response.json();
return r;
}
catch (err) {
Promise.reject(err);
}
}
提供商
function ContactsProvider({ children }) {
const [ contactsList,setContactsList ] = useState([]);
const getContactsList = async () => {
try {
const contactsResult = await apiCall("https://fakeurl.com");
setContactsList(contactsResult);
}
catch(err) {
setContactsList([]);
}};
return (
<ContactsContext.Provider value={{getContactsList, contactsList}}>
{children}
</ContactsContext.Provider>
);
}
另外,代码在我的GitHub:https://github.com/thenablyn/local-search-browser.git
此代码似乎不在您的存储库中,但我已经测试了您编写的内容并且它似乎有效,来自 useParams 的 id
是否有可能不匹配筛选时的任何联系人?
错误是我在执行array.filter()方法时忘记获取第一个元素。这是一个小错误。
该作业中的代码必须如下所示:
const [contact] = contactsList.filter(...); //this get the first element and assign to constant "contact"
我迷路了。我已经尝试了几乎所有我知道的。在我的另一个组件中,类似的过程工作正常,但在这个组件中,显然有一些错误的实现。
我有一个 Context Provider,并设置了两个要共享的值,一个调用 Api 并检索联系人列表 (getContactsList
) 的函数,以及一个变量我把联系人列表放在哪里 (contactsList
)。
我在 useEffect
中调用 getContactsList
。后来,我可以使用 contactsList
变量,但始终是一个空数组。我知道问题可能与 Promises 和异步函数有关,但我在我的代码中找不到错误。
我在这里留下了组件的副本,从有问题的视图组件开始:
详细信息组件:
function ContactDetail() {
const { getContactsList, contactsList } = useContext(ContactsContext);
const { id } = useParams();
useEffect(() => { getContactsList().catch(null) }, []);
const contact = contactsList?.filter(c => {
return (Number(c.id) === Number(id))
});
return (
<div>
{contact? "contact finded" : "contact not finded"}
</div>
);
}
Api通话
async function apiCall (
url,
method = "get",
body,
headers)
{
try {
const response = await fetch(url, {
method,
body,
headers
});
const r = await response.json();
return r;
}
catch (err) {
Promise.reject(err);
}
}
提供商
function ContactsProvider({ children }) {
const [ contactsList,setContactsList ] = useState([]);
const getContactsList = async () => {
try {
const contactsResult = await apiCall("https://fakeurl.com");
setContactsList(contactsResult);
}
catch(err) {
setContactsList([]);
}};
return (
<ContactsContext.Provider value={{getContactsList, contactsList}}>
{children}
</ContactsContext.Provider>
);
}
另外,代码在我的GitHub:https://github.com/thenablyn/local-search-browser.git
此代码似乎不在您的存储库中,但我已经测试了您编写的内容并且它似乎有效,来自 useParams 的 id
是否有可能不匹配筛选时的任何联系人?
错误是我在执行array.filter()方法时忘记获取第一个元素。这是一个小错误。
该作业中的代码必须如下所示:
const [contact] = contactsList.filter(...); //this get the first element and assign to constant "contact"