如何使用 Async / Await 和 React 钩子?

Posted

技术标签:

【中文标题】如何使用 Async / Await 和 React 钩子?【英文标题】:How to use Async / Await with React hooks? 【发布时间】:2020-10-04 04:32:00 【问题描述】:

我正在学习 React 并遵循视频教程。讲师使用了类组件,而我正在使用功能组件来复习钩子概念。

我想将此代码转换为功能代码:

return(
      <div className=classes.editorContainer>
        <ReactQuill 
          value=this.state.text 
          onChange=this.updateBody>
        </ReactQuill>
      </div>
    );
  
  updateBody = async (val) => 
    await this.setState( text: val );
    this.update();
  ;

我尝试过这样做,但异步似乎没有按我预期的那样工作。 Await 不适用于 setText

const [text, setText] = useState('')
const updateBody = async(val) => 
        await setText(val)
        update()

【问题讨论】:

setTextsetTitle? 你不需要使用await @SomoKRoceS 是的,这是一个错误。我编辑了它 @japrescott 我希望我的更新功能在用户停止输入后 1.5 秒后运行。该怎么做? this question 有用吗? 【参考方案1】:

首先,setText 函数不会返回您可以等待并确保数据已设置的承诺。

如果要设置状态并确保在设置值后调用update 函数,则需要使用另一个名为useEffect 的钩子。 使用useEffect,基本可以得到最新的更新状态。

如果您不关心状态是否设置,您可以将您的异步函数转换为以下内容,

const updateBody = (val) => 
    setTitle(val)
    update()

【讨论】:

useEffect(() =&gt; update(), [text]) 我这样做了,但结果相同。我希望我的更新功能在用户停止输入后 1.5 秒后运行。该怎么做?【参考方案2】:

你可以使用useEffect钩子来触发你想要在状态更新后触发的函数。

const [text, setText] = useState('')

useEffect(() => 
  update()
, [text]); // This useEffect hook will only trigger whenever 'text' state changes

const updateBody = (val) => 
  setText(val)

基本上你useEffect()钩子接受两个参数useEffect(callback, [dependencies]);

callback 是包含副作用逻辑的回调函数。 useEffect() 在 React 将更改提交到屏幕后执行回调函数。 Dependencies 是一个可选的依赖数组。 useEffect() 仅当渲染之间的依赖关系发生变化时才执行回调。

将你的副作用逻辑放入回调函数中,然后使用 dependencies 参数来控制你希望副作用何时运行

你可以在this article找到更多关于useEffect()钩子的信息

【讨论】:

以上是关于如何使用 Async / Await 和 React 钩子?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Async / Await 和 React 钩子?

如何将 RestSharp 与 async/await 一起使用

async和await异步编程资源汇总

Angular 8 - 如何使用 Promises 和 Async/Await [重复]

js异步回调Async/Await与Promise区别 新学习使用Async/Await

async和await浅析