【问题标题】:How do I 'reset' a React component after a Mutation error with react-apollo?react-apollo 发生突变错误后,如何“重置”一个 React 组件?
【发布时间】:2019-09-19 11:29:12
【问题描述】:

我正在学习 Apollo Server 和 Apollo Client 并遵循一些在线示例。我见过的一种范式是让 apollo-react 突变在

render() {
    const {props: {history}} = this
    const {state: {username, password}} = this

    return <Mutation mutation={REGISTER}
                     onCompleted={() => history.push('/login')}>
      {(register, {data, error, loading}) => {
        if (error) {
          return <div>{error.toString()}</div>
        }
        if (loading) return <div>Loading...</div>
        return ({JSX form, etc})

它工作正常,当我收到错误时——例如,在我的情况下是重复注册——我会显示错误消息而不是正常的 JSX。我不知道该怎么做才能“重置”页面。也就是说,我希望能够采取一些措施来“清除”突变的错误,并让它像错误到来之前那样重新渲染 JSX(用户可以采取行动,或者我会将错误超时,然后“重置”页面)。如果我刷新页面,它可以正常工作,但显然我不想这样做!

我进行了一些搜索,并立即发现自己深入讨论了 Apollo 客户端缓存,这是我要学习的下一个列表。目前,我想知道是否有更简单的方法来做我想做的事情。

非常感谢任何线索!

【问题讨论】:

    标签: reactjs graphql react-apollo apollo-client


    【解决方案1】:

    最简单的解决方案可能是使用 React 组件的状态来保存从突变返回的错误。然后提供用户操作来清除它。

    扩展你的例子,它可能看起来像这样:

    render() {
        const {props: {history}} = this
        const {state: {username, password, registrationError}} = this
    
        if (registrationError) {
          return (
            <div>
              {registrationError.toString()}
              <button onClick={() => this.setState({registrationError: null})}>
                Clear Error
              </button>
            </div>
          );
        }
    
        return <Mutation mutation={REGISTER}
                         onCompleted={() => history.push('/login')}
                         onError={(error) => this.setState({registrationError: error})}>
          {(register, {data, error, loading}) => {
            if (error) {
              // Just in case this is hit, return null
              return null;
            }
            if (loading) return <div>Loading...</div>
            return ({JSX form, etc})
    

    请注意,错误呈现已从 Mutation 回调中移出。 我不完全确定

    【讨论】:

    • 我不能 100% 确定在重新渲染 Mutation 时错误是否会清除,所以我使用了 onError 属性并返回 null 以防万一。
    猜你喜欢
    • 2019-10-22
    • 2019-10-18
    • 2020-02-19
    • 2020-01-11
    • 2020-09-18
    • 2020-10-22
    • 2018-10-21
    • 2019-09-22
    • 2019-02-02
    相关资源
    最近更新 更多