Skip to content

ahooks处理effect

Alt text

1. 使用useUpdateEffect

useUpdateEffect用法等同于useEffect,但是会忽略首次执行,只在依赖更新时执行。

jsx
import { Button, Row, Col  } from 'antd'
import { useUpdateEffect } from 'ahooks'
import { useEffect, useState } from 'react'

function App() {
  const [count, setCount] = useState(0)
  useUpdateEffect(()=>{
    console.log("useUpdateEffect")
  })
  useEffect(() => {
    console.log("useEffect")
  })
  const handleClick = () =>{
    setCount(count + 1)
  }
  return (
    <>
      <Row>
        <Col span={24}>
          {count}
        </Col>
      </Row>
      <Row>
        <Col span={24}>
          <Button type="primary" onClick={handleClick}>点击</Button>
        </Col>
      </Row>
    </>
  )
}
export default App

运行效果:
Alt text

3. 使用useLockFn

useLockFn常用来作为防重复提交功能:

jsx
import { Button, Row, Col, message } from 'antd'
import { useLockFn } from 'ahooks'
import axios from 'axios'
import { useState } from 'react'

const dataUrl = 'https://api.seniverse.com/v3/location/search.json?key=S9TdqSWVKQAmPmXmB&q=北京'

function App() {
  const [count, setCount] = useState([])
  const mockApiRequest = async () => {
    const data = await axios.get(dataUrl)
    return data.data.results
  }

  const handleClick = useLockFn(async () => {
    message.info('Start to submit')
    const result = await mockApiRequest()
    setCount(result)
    message.success('Submit finished')
  })
  return (
    <>
      <Row>
        <Col span={24}>
          {JSON.stringify(count, null, 2)}
        </Col>
      </Row>
      <Row>
        <Col span={24}>
          <Button type="primary" onClick={handleClick}>点击</Button>
        </Col>
      </Row>
    </>
  )
}

export default App

它不同useEffect,它useLockFn支持直接使用async和await的问题。

4. 使用useUpdate

useUpdate会返回一个函数,调用该函数会强制组件重新渲染。

jsx
import { Row, Col, Button } from 'antd'
import { useState } from 'react'
import { useUpdate } from 'ahooks'

function App() {
  const [count, setCount] = useState(1)
  const update = useUpdate();
  
  return (
    <>
      <Row>
        <Col span={24}>
          {count}, {Date.now()}
        </Col>
        <Col span={24}>
          <Button type='primary' onClick={update}>点击</Button>
        </Col>
      </Row>
    </>
  )
}
export default App

运行发现count的值并未发生改变,但是页面被强制渲染了: Alt text