gpt4 book ai didi

javascript - 如何处理中继突变中 Unresolved props?

转载 作者:行者123 更新时间:2023-12-02 14:14:47 28 4
gpt4 key购买 nike

我创建了一个 Relay.Mutation ,它应该触发 User 对象的更新:

class UserMutation extends Relay.Mutation {
public getMutation() {
return Relay.QL`mutation {saveUser}`;
}

public getVariables() {
return {
id: this.props.user.id,
loginName: this.props.user.loginName,
firstName: this.props.user.firstName,
lastName: this.props.user.lastName,
mail: this.props.user.mail
}
}

public getFatQuery() {
return Relay.QL`
fragment on UserPayload {
user {
id,
loginName,
firstName,
lastName,
mail
}
}
`;
}

public getConfigs() {
return [{
type: "FIELDS_CHANGE",
fieldIDs: {
user: this.props.user.id
}
}];
}

static fragments = {
user: () => Relay.QL`
fragment on User {
id,
// I initially had only id here
loginName,
firstName,
lastName,
mail
}
`
}
}

我在我的组件 UserDetails 中使用此突变,如下所示:

// I initially passed this.props.user to the mutation
this.props.relay.commitUpdate(new UserMutation({ user: this.state.user })

执行时,relay 将 user 传递到后端,仅设置 id,没有任何其他属性。突变未执行,因为输入变量缺少其他字段。

调试突变后,我发现 this.props.user 已在除 id 之外的所有字段上设置 undefined。但是,this._unresolvedProps.user 是一个所有字段设置正确的用户

当我更改突变的代码并将所有 this.props 替换为 this._unresolvedProps 时,所有必要的数据都会传输到后端,并且突变会在没有任何情况下执行任何错误。前端缓存似乎也正确更新(像 firstName 这样的字段在其他组件中更新)。但我不认为这是正确的方法。

我错过了什么?

更新

UserDetails 组件加载 loginName 等用户数据,并提供文本框来更改这些属性。对应的中继容器如下所示:

export default Relay.createContainer(UserDetails, {
fragments: {
user: () => Relay.QL`
fragment on User {
id,
loginName,
firstName,
lastName,
mail,
roles {
id,
name
},
${UserMutation.getFragment("user")}
}
`
}
});

我在文本输入处理程序中处理文本框更改...

public handleTextInput(fieldName: string, event: any) {
let user = this.state.user;

switch (fieldName) {
case "loginName": {
user.loginName = event.target.value;
break;
}
case "firstName": {
user.firstName = event.target.value;
break;
}
case "lastName": {
user.lastName = event.target.value;
break;
}
case "mail": {
user.mail = event.target.value;
break;
}
}

this.setState({ user: user });
}

...并在提交处理程序中进行表单提交,我现在将 this.state.user 传递给突变:

public handleSubmit(e: any) {
e.preventDefault();
this.props.relay.commitUpdate(new UserMutation({ user: this.state.user }), {
onSuccess: (response: any) => {
this.setState({ user: response.saveUser.user });
}
});
}

我使用 C# 后端:graphql-dotnet 。这是我为突变定义的:

public class ApplicationSchema : Schema
{
public ApplicationSchema()
{
this.Query = new ApplicationQuery();
this.Mutation = new ApplicationMutation();
}
}

public class ApplicationMutation : ObjectGraphType
{
public ApplicationMutation()
{
this.Name = "Mutation";

// save a user
this.Field<UserPayloadType>(
"saveUser",
arguments: new QueryArguments(
new QueryArgument<NonNullGraphType<UserInputType>>
{
Name = "input",
Description = "the user that should be saved"
}),
resolve: context =>
{
var userInput = context.Argument<UserInput>("input");
var clientMutationId = userInput.ClientMutationId;

var user = MemoryRepository.UpdateUser(new User()
{
Id = userInput.Id,
LoginName = userInput.LoginName,
FirstName = userInput.FirstName,
LastName = userInput.LastName,
Mail = userInput.Mail
});

return new UserPayload()
{
ClientMutationId = clientMutationId,
User = user
};
});
}
}

public class UserInputType : InputObjectGraphType
{
public UserInputType()
{
this.Name = "UserInput";

this.Field<NonNullGraphType<StringGraphType>>("id", "The id of the user.");
this.Field<NonNullGraphType<StringGraphType>>("loginName", "The login name of the user.");
this.Field<NonNullGraphType<StringGraphType>>("firstName", "The first name of the user.");
this.Field<NonNullGraphType<StringGraphType>>("lastName", "The last name of the user.");
this.Field<NonNullGraphType<StringGraphType>>("mail", "The mail adress of the user.");

this.Field<NonNullGraphType<StringGraphType>>("clientMutationId", "react-relay property.");
}
}

public class UserPayloadType : ObjectGraphType
{
public UserPayloadType()
{
this.Name = "UserPayload";

this.Field<NonNullGraphType<UserType>>("user", "The user.");

this.Field<NonNullGraphType<StringGraphType>>("clientMutationId", "react-relay property.");
}
}

public class UserType : ObjectGraphType
{
public UserType()
{
this.Name = "User";
this.Field<NonNullGraphType<StringGraphType>>("id", "The id of the user.");
this.Field<NonNullGraphType<StringGraphType>>("loginName", "The login name of the user.");
this.Field<NonNullGraphType<StringGraphType>>("firstName", "The first name of the user.");
this.Field<NonNullGraphType<StringGraphType>>("lastName", "The last name of the user.");
this.Field<NonNullGraphType<StringGraphType>>("mail", "The mail adress of the user.");

Field<ListGraphType<RoleType>>("roles", resolve: context => MemoryRepository.GetRolesOfUser(context.Source as DomainModel.Models.User));
}
}

最佳答案

您的 Relay 容器是否正确获取 User 片段?我在你的 staticfragments 定义片段中看到 User 上只有 id 字段,所以我想知道你的父 Relay 组件是否正在获取它们。

由于您的突变确实依赖于这些字段,因此请将它们添加到 fragments 属性中。

class UserMutation extends Relay.Mutation {
public getMutation() { ... }

// getVariables, FatQuery and Configs ...

static fragments = {
user: () => Relay.QL`
fragment on User {
id,
loginName,
firstName,
lastName,
mail
}
`
}
}

然后尝试将此片段包含在 Relay 组件中,该组件使用您的突变。React-Relay 组件示例:

import UserMutation from 'mutations/user';

class User extends Component {
commit(e) {
Relay.Store.commitUpdate(
new UserMutation({
user: this.props.user
})
);
}

render() {
return (
<div>Hello</div>
);
}
};

export default Relay.createContainer(User, {
fragments: {
user: () => Relay.QL`
fragment on User {
${UserMutation.getFragment('user')}
}
`,
}
});

关于javascript - 如何处理中继突变中 Unresolved props?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39133634/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com