react hooks 监测浏览器窗口大小

·

1 min read

state 和 props 变化,导致组件函数重新执行,重新渲染页面。

import { useCallback, useEffect, useState } from "react"

function getSize() {
  const width = window.innerWidth
  if (width > 1000) {
    return 'large'
  } else {
    return 'small'
  }
}

function useSize() {
  // useState 可以传一个方法执行
  const [size, setSize] = useState(getSize())
  const handler = useCallback(() => {
    setSize(getSize())
    // react 的状态更新是异步的,这里打印的值可能跟页面显示的不同
    // 打印size可以放在 useEffect 中
    console.log(size);
  }, [getSize])
  console.log(33);
  useEffect(()=> {
    // 窗口 resize 事件
    window.onresize = handler
    // 销毁 resize 绑定的方法
    return ()=> {
      console.log(111);
      window.removeEventListener('resize', handler)
    }
  }, [])
  return size
}

const CompA = function () {
  const [count, setCount] = useState(0)
  const [varB, setVarB] = useState(0)
  // excute on every render
  useEffect(()=> {
    console.log('a');
  })

  // excute once
  useEffect(() => {
    console.log('b');
  }, [])

  return (
    <>
    <button onClick={()=> setCount(count + 1)}>increase</button>
    </>
  )
}

const Demo = function() {

  // const [size, setSize] = useState('small')
  const size = useSize()

  return (
    <>
      {size}
      <CompA></CompA>
    </>
  )
}
export default Demo