从 reducer 中从服务器获取

Posted

技术标签:

【中文标题】从 reducer 中从服务器获取【英文标题】:Fetching from a server from within a reducer 【发布时间】:2022-01-23 21:59:42 【问题描述】:

我正在使用 react 和 Immer 来制作一个非常简单的前端。我需要显示的数据是简单的嵌套 Json。 json 以状态存储在树的顶部,使用 immer 的简单 reducer 允许编辑 json。 我想添加一个按钮,从服务器上的 json 触发刷新 json 状态。

function SectionRender(props)
    
      const [jsonData, jsonDispatch] = useImmerReducer(jsonDataReducer, props.json);
      const handleRefreshClick = () => jsonDispatch( type:"refresh")
return  <div> 
        /* rest of display */ 
        <button onClick=handleRefreshClick>Reinitialiser</button>
        </div>

这是顶部。它与减速器一起使用:

function jsonDataReducer(draft, action) 
    switch (action.type) 
        /* other cases for edit */
        case "refresh":
            const newStuff = getServerData().then(
            (value) => 
                console.log("we got something");
                //something that would modify the state here??
            ,
            () => 
                console.log("no server response")           
            )
            break;
        default:
            break;
    

我尝试返回“新东西”值。但是由于它是一个承诺,整个状态都变成了一个承诺,当它尝试渲染时,其余的显示崩溃。在 .then() 中修改草稿似乎也不起作用(可能是因为该函数早已返回可变草稿)。

很明显,我可能没有正确地构建事物,但我不知道我应该如何构建它,或者我应该做什么来允许从异步函数调用中修改状态。

【问题讨论】:

【参考方案1】:

Reducer 是纯函数,您应该避免在其中添加任何副作用,例如异步调用。因此,请尝试将这个异步逻辑排除在 reducer 之外(在 handleRefreshClick 期间),一旦您从异步调用接收到输出,然后使用从调用返回的数据调度操作以修改状态。

喜欢

const handleRefreshClick = () => 
    getServerData().then(
        (value) => 
            jsonDispatch( type:"refresh", data: value)
        ,
        () => 
            console.log("no server response")           
        )

【讨论】:

当我从减速器中取出异步调用时,我意识到这会产生另一个密切相关的问题。如果不在 reducer 中,如何将状态推送回服务器?

以上是关于从 reducer 中从服务器获取的主要内容,如果未能解决你的问题,请参考以下文章

在颤动中从服务器获取图像到gridview

在Angular 2中从服务到组件获取异步数据

如何在 Angular 中从服务器获取带有 jwt 令牌的响应标头

在 iOS5 中从网络服务器获取 json 的问题

获取错误(生成 XML 文档时出错。)在 asp.net 的 extjs 中从服务器端获取数据

在 Android 中从服务器数据库获取数据到 Sqlite 数据库