首页IT科技reacthooks自动生成路由(ReactHooks之useEffect)

reacthooks自动生成路由(ReactHooks之useEffect)

时间2025-06-20 16:35:17分类IT科技浏览4687
导读:useEffect( 副作用钩子 useEffect相当于 componentDidMount(组件挂载),componentDidUpdate(组件更新) 和 componentWillUnmount(组件将要销毁) 这三个生命周期函数的组合。...

useEffect() 副作用钩子

useEffect相当于 componentDidMount(组件挂载)             ,componentDidUpdate(组件更新) 和 componentWillUnmount(组件将要销毁) 这三个生命周期函数的组合            。

useEffect(() => { ... },[]) useEffect 可以接收两个参数                  ,第一个参数接收一个函数       ,可以用来做一些副作用          ,比如异步请求                  ,修改外部参数等行为;返回值(如果有)则在组件销毁或者调用函数前调用                    。 第二个参数是一个数组          ,数组中的内容可以称之为依赖项       ,当数组中的值发生变化就会触发执行 useEffect 第一个参数中的函数      。

理解函数副作用

对于React组件来说                  ,主作用是根据数据(state/props)渲染UI             ,除此之外都是副作用(比如手动修改DOM            、发送ajax请求)         。

常见的副作用:

数据请求(发送ajax) 手动修改 DOM localstorage操作

useEffect 函数的作用就是为react函数组件提供副作用

函数中有返回值

useEffect 第一个参数函数中有return返回值    ,即返回值相当于销毁                    。

相当于原来生命周期的componentWillUnmount(组件销毁前执行)

使用场景 取消订阅 清除定时器 清除window.onresize窗口方法 import React ,{useState,useEffect}from react function Test() { useEffect(() => { let timer = setInterval(() => { console.log(this is effect); }, 1000) // 这里return 一个回调函数                   ,在函数中清除副作用 return () => { clearInterval(timer); } }) return ( <div>Test</div> ) } export default function App() { const [flag, setFlag] = useState(true); return ( <div> {flag ? <Test/> : null} <div> <button onClick={() => setFlag(!flag)}>点击</button> </div> </div> ) }

点击按钮                ,Test组件卸载,清除定时器timer         。

默认状态(无依赖项)

useEffect 不传递第二个参数                ,表示不监听任何参数的变化      。

每次渲染DOM之后                   ,都会执行 useEffect 中的第一个函数                    。 import React from react export default function App() { const [count, setCount] = useState(0); useEffect(() => { console.log("触发副作用"); }); return ( <div> <p>点击{count}次</p> <button onClick={() => setCount(count + 1)}>Click</button> </div> ) } 组件初始化时触发一次 当每次点击按钮时    ,count发生改变             ,组件更新            。控制台每次都会打印log   。

依赖项为空数组

useEffect 函数还可以接收第二个参数                  ,作为该副作用的依赖项       ,当第二个参数 传入一个空数组[] 时          ,表明只有 组件初始化的时候执行一次 相当于componentDidMount(组件挂载)

import React from react export default function App() { const [count, setCount] = useState(0); useEffect(() => { console.log("触发副作用"); document.title = `点击了${count}次`; }, []); // 注意这里                  ,传入 [] return ( <div> <p>点击{count}次</p> <button onClick={() => setCount(count + 1)}>Click</button> </div> ) } 组件初始化时触发一次 当点击按钮时          ,title 不再改变                    。控制台不再打印log                。

依赖特定项

当依赖项数组中传入值时       ,那么该副作用会在 组件初始化的时候执行一次                  ,依赖的特定项变化时会再次执行 就像componentDidMount和componentDidUpdate组合的生命周期函数一样

function App() { const [count, setCount] = useState(0); const [name, setName] = useState(李白); useEffect(() => { console.log(触发渲染) document.title = `clicked ${count} times`; console.log(name: , {name}); },[count]) // 这里我们传入 count             ,不传name return ( <> <p>当前次数:{count}</p> <p><button onClick={() => setCount(count + 1)}>累计</button></p> <p><button onClick={() => setName("杜甫")}>改名{name}</button></p> </> ) } 当我们点击 “累计            ” 按钮时    ,控制台会打印log                   ,title也会改变                , 但是我们点击 “改名                    ”时,控制台不会打印log。 因为我们在依赖项数组中传入了 count 而没有 name                。

发送网络请求

不可以直接在 useEffect 的回调函数外层直接包裹await                ,因为异步会导致清理函数无法立即返回

❌错误示例: useEffect(async () => { const res = await getData(url); console.log(res); })

可在 useEffect 中定义一个请求数据方法                   ,调用                    。

正确示例:

useEffect(() => { async function initData() { const res = await getData(url); console.log(res); } initData() }, []) // 仅组件初始化时调用

创心域SEO版权声明:以上内容作者已申请原创保护,未经允许不得转载,侵权必究!授权事宜、对本内容有异议或投诉,敬请联系网站管理员,我们将尽快回复您,谢谢合作!

展开全文READ MORE
uniapp遇到的问题(uniapp系列-报错或常见问题处理集锦)