提交值时如何在 React 挂钩中使用回调函数?

Posted

技术标签:

【中文标题】提交值时如何在 React 挂钩中使用回调函数?【英文标题】:How to use callback function in React hooks when value is submitted? 【发布时间】:2020-06-24 06:15:21 【问题描述】:

我正在使用 React hooks 构建一个应用程序。

但问题是我可以故意单击按钮两次以发生错误。

所以我想在单击按钮时使用 useState 发送 api 请求时禁用该按钮。

但是,发送 api 和 useState 都是异步工作的,很难预料它是如何工作的。

因此我想出了在 React 中使用 setState 回调函数的想法,但是由于我是 React hooks 的新手,所以很难掌握如何在 React hooks 中使用 setState 回调函数。

代码如下:

    const submitForm = (values: IAgreeMentValues) => 
      const userActivate = Object.assign(props.currentUserObject, values, c)
      delete userActivate.email
      const userActivateJSON = JSON.stringify(userActivate)

      if(values.is14YearsOldOrOlder && values.isAcceptedPrivacyPolicy && values.isAcceptedTerm) 

        setButtonState(true)

        activateUser(userActivateJSON).then(response => 
          if(response.data.result.canLogin) 
            popupStore.add(
              type: 'alert',
              title: t('signUp.agreeMent.registeredCompleted'),
              actionString: t('popUpAlert.ok'),
              onSubmit: isMobile ? pushToAppStore : pushToLogin
            )
           else 
            popupStore.add(
              type: 'alert',
              title: t('error.occured'),
              actionString: t('popUpAlert.ok')
            )
          
        )
        .catch(response => 
          setButtonState(false)
          popupStore.add(
            type: 'alert',
            title: response.response.data.error.message,
            actionString: t('popUpAlert.ok'),
          )
        )
       else 
        popupStore.add(
          type: 'alert',
          title: t('signUp.agreeMent.mustBeChecked'),
          actionString: t('popUpAlert.ok')
        )
      
    ;


    return (
      <>
      <div className='signup-step-wrap'>
        <div className='agree-check-box'>
        <Formik enableReinitialize=true initialValues=termsAllSelected
          onSubmit= (values) => submitForm(values)>
            ( values, handleChange, handleSubmit ) => (
              <form onSubmit=handleSubmit>
              <ul className='check'>
              <li>
                <Field type='checkbox' name=`isAcceptedMarketingEmail` id=`agree4` onChange=handleChange />
                <label htmlFor=`agree4`>t('signUp.agreeMent.isAcceptedMarketingEmail')</label>
              </li>
              <li>
                <Field type='checkbox' name=`isAcceptedMarketingSms` id=`agree5` onChange=handleChange />
                <label htmlFor=`agree5`>t('signUp.agreeMent.isAcceptedMarketingSms')</label>
              </li>
              </ul>
              <div className='btn-btm-signin'>
                <button className='btn-signin active' type='submit' disabled=currentButtonState style=currentButtonState ? background: '#e2e2e2':background: '#1f1f1f'>t('signUp.agreeMent.next')</button>
              </div>
              </form>
            )
        </Formik>
        </div>
      </div>
      </>
    )

【问题讨论】:

我没有看到你在哪里设置了const [currentButtonState, setButtonState] = React.useState(false);。这是一个例子codesandbox.io/s/objective-flower-c1bh7 谢谢。就像示例一样,我将 setButtonState 放在 submitForm 函数的顶部。 【参考方案1】:

您还应该在thensetButtonState(false)

activateUser(userActivateJSON).then(response => 
          if(response.data.result.canLogin) 
            popupStore.add(
              type: 'alert',
              title: t('signUp.agreeMent.registeredCompleted'),
              actionString: t('popUpAlert.ok'),
              onSubmit: isMobile ? pushToAppStore : pushToLogin
            )
           else 
            popupStore.add(
              type: 'alert',
              title: t('error.occured'),
              actionString: t('popUpAlert.ok')
            )
          
          setButtonState(false)
        )

【讨论】:

以上是关于提交值时如何在 React 挂钩中使用回调函数?的主要内容,如果未能解决你的问题,请参考以下文章

React 的 Upload 文件表单编辑回显及 onChange 自定义回调的方式

React 的 Upload 文件表单编辑回显及 onChange 自定义回调的方式

在Stripe + React中发生无效的挂钩调用错误

如何在 React 函数组件(useState 挂钩)中访问 ag-Grid API?

无法挂钩回调函数?

在 React Native 中的类中挂钩