Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/434.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript UI不反映突变后的变化_Javascript_Reactjs_Graphql_Relay_Relaymodern - Fatal编程技术网

Javascript UI不反映突变后的变化

Javascript UI不反映突变后的变化,javascript,reactjs,graphql,relay,relaymodern,Javascript,Reactjs,Graphql,Relay,Relaymodern,我正在使用QueryRenderer在我的应用程序中填充编辑表单。在整个页面中,数据还显示在其他DOM元素中。然后,我通过一个变异将值保存回表单submit。一切都很好,除了我的UI没有反映出后面的变化。以下是我的初步查询: query EditPlanDialogQuery($planId: Int!) { planByPlanId(planId: $planId) { nodeId ...fields }

我正在使用
QueryRenderer
在我的应用程序中填充编辑表单。在整个页面中,数据还显示在其他DOM元素中。然后,我通过一个变异将值保存回表单submit。一切都很好,除了我的UI没有反映出后面的变化。以下是我的初步查询:

    query EditPlanDialogQuery($planId: Int!) {
        planByPlanId(planId: $planId) {
            nodeId
            ...fields
        }
        allSchedules {
            nodes {
                ...fields
            }
        }            
    }
然后我的变异和包装函数定义如下:

    mutation EditPlanDialogMutation($input: UpdatePlanInput!) {
        updatePlan(input: $input) {
            plan {
                ...fields
            }
        }
    }


同样,数据被正确地保存到数据库中,但是显示数据的其他DOM元素不会被渲染以反映更改。我想简单的更新
Relay
就能解决这个问题吗?根据他们的文件,无论如何,情况应该是这样。我试着处理
更新程序
回调,最终得到了要更新的页面,但它看起来非常笨拙。任何建议都将不胜感激,谢谢

不确定你得到的是什么字段,但我猜你没有从变异中得到id。 您必须始终请求节点的id,以便中继可以匹配存储中更新的节点。节点的id必须命名为id(而不是nodeId)


当我遇到这样的问题时,通常是因为两件事:1)前端中使用的项目数据没有作为突变负载(即id)返回;2) 在组件中,中继道具没有直接用于呈现内容,而是存储在状态或任何其他变量中,因此更新了prop.relay,但状态没有更新。试着检查一下这是否是你的情况。如果需要,请告诉我helped@soutot谢谢你的意见。你能详细说明你的第一点吗?至于第二个,我将中继道具传递到子组件中,并直接使用它进行渲染。再次感谢!当然在第一种情况下,我的意思是,当您编写变异的GraphQL时,您可以向其添加有效负载,这意味着变异完成后,它将返回您在有效负载中请求的任何数据。例如,假设您触发了AddUserMutation,有效负载可以是用户的id和名称,这是模型中的现有字段。但是,如果您不在前端使用此有效负载(即您只显示用户电子邮件),则在变异完成后,您的数据将不会更新。请注意,“在前端使用”表示您的GraphQL没有要求它。如果不清楚,请随时询问。希望它能帮助我尝试在初始查询和变异中选择
nodeId
,但没有成功。谢谢你的输入。你能把域名nodeId改成id吗?当我遇到解决问题的类似问题时,它对我起了作用。具体来说,将nodeId更改为id并返回补丁中更改的字段。如果你更新你的答案,我会接受。很高兴它起作用,我更新了我的答案。(当id被命名为_id时,我也有类似的问题)
    editPlan = (values: any) => {
        const {
            nodeId,
            ...otherValues
        } = values;
        const variables = {
            input: {
                nodeId: nodeId,
                planPatch: { ...otherValues },
            },
        };
        commitMutation(
            environment,
            {
                mutation,
                variables,
                onCompleted: (response, errors) => alert(response),
                onError: err => alert(err),
            }
        );
    }
mutation EditPlanDialogMutation($input: UpdatePlanInput!) {
    updatePlan(input: $input) {
        plan {
            id
            ...fields
        }
    }
}