如何在 Meteor Method 完成之前禁用反应按钮

How to disable react button until Meteor Method finishes

我有一个带有 React 组件的 Meteor 应用程序,该组件有一个按钮可以触发异步 Meteor 方法。

该方法需要一些时间运行,我希望在等待响应时防止再次点击它。 我可以禁用点击处理程序中的按钮,但是一旦函数完成,我似乎无法重新启用它,因为 'this' (作为反应组件)对于回调函数是未知的。

关于如何在方法回调上修改反应元素有什么想法吗?

我会在你的本地状态中创建一个布尔值,比如 isWaiting: false 并在你的事件处理程序中的函数(你的异步流星方法)中,一旦该按钮被点击它应该改变 isWaitingtrue。根据您选择的模式(async/await 或承诺),我会在成功和拒绝时将 isWaiting 设置回 false。之后,让 disable 属性依赖于 isWaiting 状态。

你可以使用 try-catch-finally:

const [isWaiting, setIsWaiting] = useState(false);

async function meteorMethod() {
  setIsWaiting(true)
  try {
    // await...
  } catch(err) {
    // ...
  }
  finally {
    setIsWaiting(false)
  }
}

return (
  <>
    <button disable={isWaiting} onClick={meteorMethod}>Submit</button>
  </>
)

import React, {useState} from "react"

const SampleAsync = () => {

  let [isWaiting, setWaiting ] = useState(false)

  let meteorMethod = () => {
      setWaiting(true)
      Meteor.call('insertSometing', data,(result,error) => {
        if(error) 
        console.log('erro')
        else
        setWaiting(false)
      })
  }


  // If isWaiting is true the button disable and if false unable
  // you can also do this: <button disable={isWaiting} onClick={meteorMethod}>Submit</button>
  return (
    <div>
      // you can add inline if
      <button disable={isWaiting == true ? true : false  } onClick={meteorMethod}>Submit</button>
    </div>
  )
}

export default SampleAsync