首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >RTK查询响应状态

RTK查询响应状态
EN

Stack Overflow用户
提问于 2022-08-14 14:56:37
回答 1查看 154关注 0票数 1

我正在尝试将一些Axio代码转换为RTK查询,并且遇到了一些问题。来自RTK查询的“数据”响应似乎不像我想的那样像useState。

原始axio代码:

代码语言:javascript
复制
const [ importantData, setImportantData ] = useState('');
useEffect(() => {
    async function axiosCallToFetchData() {
        const response = await axiosAPI.post('/endpoint', { payload });
        const { importantData } = await response.data;
        setImportantData(importantData);
    }

    axiosCallToFetchData()
        .then((res) => res)
        .catch((error) => console.log(error));
}, []);

const objectThatNeedsData.data = importantData;

新的RTK查询代码

代码语言:javascript
复制
const { data, isSuccess } = useGetImportantDataQuery({ payload });
if(isSuccess){
    setImportantData(data.importantData);
}

const objectThatNeedsData.data = importantData;

然而,这给了我一个无限的呈现循环。此外,如果我试图将'data‘对象作为一个状态对象,并将其抛到我的组件中:

代码语言:javascript
复制
const objectThatNeedsData.data = data.importantData;

然后我得到一个未定义的错误,因为它试图在importantData完成之前加载它。我觉得这应该是个简单的解决办法,但我被困住了。我已经看过了这些文档,但是大多数示例只是使用if语句块来检查状态。API调用至少是使用RTK进行的,并且得到了正确的响应。有什么建议吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-08-14 15:31:51

第一个问题是,在呈现过程中总是调用setImportantData,而不检查是否有必要--这总是会导致重发。如果您想这样做,您需要检查它是否有必要:

代码语言:javascript
复制
if(isSuccess && importantData != data.importantData){
    setImportantData(data.importantData);
}

但是正如您注意到的,这实际上是不必要的-当您已经可以在组件中访问它时,几乎不需要将内容复制到本地状态。

但是,如果访问data.importantData,首先需要检查data是否存在--您忘了在这里检查isSuccess

代码语言:javascript
复制
if (isSuccess) {
  objectThatNeedsData.data = data.importantData;
}

尽管如此,如果objectThatNeedsData不是您在呈现期间声明的新局部变量,那么您可能不应该仅仅在呈现过程中修改它。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73352627

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档