React - useEffect的使用
import React, { Component, useState, useEffect } from 'react'
import { useControl } from './hooks/useControl'
import ReactDOM from 'react-dom/client'
import { nanoid } from 'nanoid'
import {
  // 🤴🏻🟨 推荐使用as将路由重命名为Router
  HashRouter,
  BrowserRouter as Router,
  Route,
  Link,
  NavLink,
  Switch,
  Redirect,
} from 'react-router-dom'
import { getChannelsAPI } from './api/channel'
const root = ReactDOM.createRoot(document.getElementById('root'))
// useEffect的基本使用
// useEffect(() => {每次状态变化,会自动执行,可以获取更新后的状态})
function AppCom01() {
  const [count, setCount] = useState(0)
  useEffect(() => {
    // 每次count变化,回调函数会自动执行,可以获取到更新之后的count
    console.log('count发生了变化 ~~~ ', count)
    document.title = count
  })
  return (
    <>
      <div>
        <h1>count: {count}</h1>
        <button
          onClick={() => {
            setCount(count + 1)
          }}
        >
          plus(1)
        </button>
      </div>
    </>
  )
}
// 学习目标: useEffect模拟生命周期 - 更新时
// 1. useEffect(() => {}, []) => 挂在之后
// 2. useEffect(() => {}, [依赖项]) => 挂载更新二合一
function AppCom02() {
  const [count, setCount] = useState(0)
  // 挂载后
  // useEffect(() => {
  //   console.log('执行=>')
  //   document.title = count
  // }, [])
  // 模拟更新之后
  // 👹 代表:挂载\更新二合一 等同于 componentDidUpdate和componentDidMount
  // 类似vue中的watch 开启immediately
  useEffect(() => {
    console.log('执行了 ====> ', count)
    document.title = count
  }, [count])
  return (
    <>
      <div>
        <h1>count: {count}</h1>
        <button
          onClick={() => {
            setCount(count + 1)
          }}
        >
          plus(+1)
        </button>
      </div>
    </>
  )
}
// 🍅 useEffect模拟生命周期 - 第二个参数小结
// 语法:
// 1. useEffect(() => {}, []) 挂载之后
// 2. useEffect(() => {}, [依赖项]) 挂载更新二合一
// 3. useEffect(() => {}) 👎 会监听所有状态的变化
function AppCom03() {
  const [count, setCount] = useState(0)
  const [msg, setMsg] = useState('We are the world!')
  // 👳🏻♂️ 挂载之后
  useEffect(() => {
    console.log('挂载之后,只会执行一次🥩')
  }, [])
  // 👳🏻♂️ 代表: 挂载更新二合一
  // 依赖项:只监听依赖项的变化
  useEffect(() => {
    console.log('count: ', count)
  }, [count])
  // 代表:挂载更新二合一
  // 不写依赖项:监听所有的数据变化
  // 👎👎
  useEffect(() => {
    console.log('I can listen all data change and execute some logic')
  })
  return (
    <>
      <div>
        <h1>count: {count}</h1>
        <h1>msg: {msg}</h1>
        <button onClick={() => setCount(count + 1)}>plus(+1)</button>
        <br />
        <button onClick={() => setMsg(msg + '~')}>click(+~)</button>
      </div>
    </>
  )
}
// 🍅 useEffect监听多个状态的变化
function AppCom04() {
  const [count, setCount] = useState(0)
  const [msg, setMsg] = useState('we are the world')
  // 1. 🍑分开监听
  useEffect(() => {
    console.log('I can listen count.', count)
  }, [count])
  useEffect(() => {
    console.log('I can listen msg', msg)
  }, [msg])
  // 2. 🍓同时监听
  useEffect(() => {
    console.log('I can listen count and msg', count + msg)
  }, [count, msg])
  return (
    <>
      <div>
        <code>
          count: {count}
          msg: {msg}
        </code>
        <button onClick={() => setCount(count + 1)}>click - plus(+1)</button>
        <button onClick={() => setMsg(msg + '~')}>click - plus(+~)</button>
      </div>
    </>
  )
}
// 🍅 useEffect模拟卸载时生命周期 - 卸载时
function AppCom05() {
  const [isShow, setIsShow] = useState(true)
  return (
    <div>
      {isShow && <Child />}
      <button onClick={() => setIsShow(!isShow)}>点击卸载子组件</button>
    </div>
  )
}
function Child() {
  // 在子组件中挂载时监听窗口改变事件
  const resizeFn = () => {
    console.log('窗口发生改变...')
  }
  useEffect(() => {
    window.addEventListener('resize', resizeFn)
    // 卸载的时候: useEffect(() => {return 卸载时会自动执行的回调函数})
    return () => {
      window.removeEventListener('resize', resizeFn)
    }
  }, [])
  return (
    <>
      <div>我是子组件!!!</div>
    </>
  )
}
// 🍅 useEffect综合写法
function AppCom06() {
  const [isShow, setIsShow] = useState(true)
  return (
    <>
      <div>
        {isShow && <ChildCom06 />}
        <br />
        <button onClick={() => setIsShow(!isShow)}>点击卸载子组件</button>
      </div>
    </>
  )
}
function ChildCom06() {
  const resizeFn = () => {
    console.log('window change ..')
  }
  // 🍓 一个useEffect只维护一个逻辑的挂载和卸载
  // 🍓 多个逻辑,使用多个useEffect维护
  useEffect(() => {
    window.addEventListener('resize', resizeFn)
    return () => {
      window.removeEventListener('resize', resizeFn)
    }
  }, [])
}
// 🍑 useEffect发送请求获取数据
function AppCom07() {
  const [list, setList] = useState([])
  const loadData = async () => {
    const res = await getChannelsAPI()
    setList(res.data.channels)
  }
  // 🟨 useEffect接收同步的回调函数,不能是异步函数
  useEffect(() => {
    loadData()
  }, [])
  return (
    <>
      <div>
        APP
        {list.map((item) => {
          return (
            <>
              <div key={item.id}>{item.name}</div>
            </>
          )
        })}
      </div>
    </>
  )
}
const divNode = (
  <div>
    <AppCom07 />
  </div>
)
root.render(divNode)
     学而不思则罔,思而不学则殆!
 
                     
                    
                 
                    
                
 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号