GraphQL 和 ReactJS 状态

Posted

技术标签:

【中文标题】GraphQL 和 ReactJS 状态【英文标题】:GraphQL and ReactJS state 【发布时间】:2019-06-30 11:23:21 【问题描述】:

我使用 ApolloProvider 作为 HOC 从服务器获取数据,并使用 Query'react-apollo' 在页面和组件中呈现数据。

这是一个问题。 <Query /> 将数据直接呈现给 <input /> 等元素,而不使用组件的状态。但是如果我想用onChange() 函数更改<input /> 值怎么办,我在哪里存储新值? 是否可以使用 Apollo 获取 componentDidMount() 中的数据,保存然后传递给 render()

这是我的虚拟代码,仅作为示例:

const USER = id => gql`
  
    user(id: "$id") 
      _id
      name
      surname
      email
    
  
`;

render() 
    const  id  = this.props;

    return (
      <Query query=USER(id)>
        ( loading, error, data ) => 
          if (loading) return <p>Loading...</p>;
          if (error) return <p>Error:(</p>;

          const  user  = data;

          return (
            <div>
              <input type="text" value=user.name />
              <input type="text" value=user.surname />
              <input type="text" value=user.email />
            </div>
          );
        
      </Query>
    );
  

我想在这些输入中添加onChange() 函数,然后进行 GraphQL 突变

【问题讨论】:

【参考方案1】:

您可以将Mutation 包裹在您的查询周围(或者相反,它不会改变任何内容)。然后将您输入的onChange 函数绑定到Mutation 操作。

<Mutation mutation=UPLOAD_FILE>
    action =>
        <Query query=USER(id)>
            ( loading, error, data ) => 
                if (loading) return <p>Loading...</p>;
                if (error) return <p>Error:(</p>;

                const  user  = data;

                return (
                    <div>
                        <input type="text" value=user.name onChange=ev => action( variables:  newText: ev.target.value  ) />
                        <input type="text" value=user.surname onChange=ev => action( variables:  newText: ev.target.value  )  />
                        <input type="text" value=user.email onChange=ev => action( variables:  newText: ev.target.value  )  />
                    </div>
                );
            
        </Query>
    
</Mutation>

您还可以通过将结果绑定到类中的函数来从 JSX 中取出逻辑:

handleInputChange = (action, type) => ev => 
    action( variables:  [type]: ev.target.value  )


<Mutation mutation=UPLOAD_FILE>
    action =>
        <Query query=USER(id)>
            ( loading, error, data ) => 
                if (loading) return <p>Loading...</p>;
                if (error) return <p>Error:(</p>;

                const  user  = data;

                return (
                    <div>
                        <input type="text" value=user.name onChange=this.handleInputChange(action, 'name') />
                        <input type="text" value=user.surname onChange=this.handleInputChange(action, 'surname')  />
                        <input type="text" value=user.email onChange=this.handleInputChange(action, 'email')  />
                    </div>
                );
            
        </Query>
    
</Mutation>

【讨论】:

谢谢你的提示,我会试试你的例子。然而,状态不用于存储值是很奇怪的,因为它在您需要为输入(例如电子邮件)添加验证并且在验证后使用保存按钮进行变异的情况下很有用 好吧,在我的第二个示例中,您可以验证handleInputChange 函数中的给定输入是否正确,因为每个更改都会通过它。您还可以使用突变将返回的内容来设置您的状态并控制您的输入。你需要一个例子吗?

以上是关于GraphQL 和 ReactJS 状态的主要内容,如果未能解决你的问题,请参考以下文章

GraphQL API 中的 HTTP 状态代码处理

如何在第一次渲染和点击时都渲染 useQuery? [ReactJS,graphql]

如何使用 reactjs 和 graphql 在 gatsby 中映射嵌套数组

ReactJS/Javascript/Graphql/React-apollo:传递查询变量

在 reactJS 中使用动态字段的 Apollo 客户端 graphql 查询

使用 Azure AD、ReactJS 和 NodeJS 验证用户并使用 Graph API