React Hooks(二) useEffect

紹介

useEffect は、React が DOM を更新した後に追加のコードを実行します。つまり、データのリクエスト、サブスクリプションの設定、React コンポーネントの DOM の手動変更などの副作用操作を実行します。

2つの使い方

useEffect(() => {
    
    
  // 相当于 componentDidMount、componentDidUpdate
  console.log("code");
  return () => {
    
    
    // 相当于 componentWillUnmount
    console.log("code");
  }
}, [/*依赖项*/])

関数と配列は useEffect で定義され、2 番目のパラメーターは useEffect のコードの各部分の実行時間を決定します。
1. 依存関係のいくつかの状況:

  • 何も渡さない場合は、コンポーネントの各レンダリング後に useEffect が呼び出されます。これは、componentDidMount およびcomponentDidUpdate に相当します。
    useEffect の関数に状態データの変更が含まれる場合、 useEffect が無限に呼び出されることになることに注意してください。
  • 空の配列 [] を渡すと、一度だけ呼び出されます。これは、componentDidMount と同等です。
  • 変数を含む配列を渡します。変数が変更された場合にのみ、useEffect が実行されます。

注:
実際には、機能コンポーネントにはライフ サイクルはありません。クラス コンポーネントのライフ サイクルの概念を適切な場所に移動することは、単に記憶を助けるだけです。
2. リターン関数
useEffect に監視イベントやタイマーがある場合は、対応する監視イベントやタイマーを閉じる必要があります。

3つの音符

1. 依存関係が参照型の場合、React は依存関係のメモリ アドレスが一致しているかどうかを比較します。矛盾がある場合にのみ、useEffect が実行されます。

const [a, setA] = useState({
    
    
    b: 'dx',
    c: '18',
})

const changeA = () => {
    
    
    setA((old) => {
    
    
        old.b = 'yx'
        return old
    })
 }

/**当changeA执行却没有打印 a*/
useEffect(() => {
    
    
	console.log(a)
},[a])

一般的な変更方法は、参照を変更することです。

const [a, setA] = useState({
    
    
	b: 'dx',
	c: '18',
})

const changeA = () => {
    
    
    setA((old) => {
    
    
        const newA = {
    
    ...old}
        newA.b = 'yx'
        return newA 
    })
}


/**当changeA执行打印  {b:'yx',c:'18'}  */
useEffect(() => {
    
    
    console.log(a)
},[a])

2. useEffect の例を見てください。

import React, {
    
     useState, useEffect } from 'react'
function App() {
    
    
  const [count, setCount] = useState(0) //默认值是0
  const [name, setName] = useState('张三') //默认值是0
  const [size, setsize] = useState({
    
    
    width: document.documentElement.clientWidth,
    height: document.documentElement.clientHeight,
  })
  const onResize = () => {
    
    
    setsize({
    
    
      width: document.documentElement.clientWidth,
      height: document.documentElement.clientHeight,
    })
  }
  //操作
  useEffect(() => {
    
    
    document.title = count
  }) //没有第二个参数就表示只要函数渲染就都执行
  
  useEffect(() => {
    
    
    //监听
    window.addEventListener('resize', onResize, false)
    //监听完了就考虑卸载,卸载的时候必须是return
    return () => {
    
    
      window.addEventListener('resize', onResize, false)
    }
  }, [])
  //空数组里面要是什么也不填写,那他只会发生在第一次渲染后和组件卸载之前执行
  // 也就是钩子函数componentDidMount 和componentWillUnMount
  
  useEffect(() => {
    
    
    console.log('count', count)
  }, [count])
  //只有count发生变化时候执行,和第一次渲染后以及组件卸载前执行

  useEffect(() => {
    
    
    document
      .querySelector('#size')
      .addEventListener('click', handleClick2, false)
    return () => {
    
    
      document
        .querySelector('#size')
        .removeEventListener('click', handleClick2, false)
    }
  })
  const handleClick2 = () => {
    
    
    console.log('点击了')
  }
  function handleClick() {
    
    
    setCount(count + 1)
    setName('李四')
  }

  return (
    <div>
      <span>
        {
    
    count}---{
    
    name}
      </span>
      {
    
    count % 2 === 0 ? (
        <span id="size">
          宽度是:{
    
    size.width}--高度是:{
    
    size.height}
        </span>
      ) : (
        <p id="size">
          宽度是:{
    
    size.width}--高度是:{
    
    size.height}
        </p>
      )}

      <button type="button" onClick={
    
    handleClick}>
        点击
      </button>
    </div>
  )
}

export default App

おすすめ

転載: blog.csdn.net/LittleMoon_lyy/article/details/124519252