当前位置: 首页 > wzjs >正文

云主机可以做网站吗腾讯云服务器控制台

云主机可以做网站吗,腾讯云服务器控制台,网站建设哪里招标,关键词检测工具React Hooks 使用注意事项 Area: Hooks Date: February 10, 2025 Important: 🌟🌟🌟 React Hooks 注意事项 要点: useState 的初始化值 只在第一次渲染时计算,并且这个值不会随着组件重新渲染而更新。useEffect 可…

React Hooks 使用注意事项

Area: Hooks
Date: February 10, 2025
Important: 🌟🌟🌟

React Hooks 注意事项

要点:

  • useState 的初始化值 只在第一次渲染时计算,并且这个值不会随着组件重新渲染而更新。
  • useEffect 可能出现死循环,比如处理请求接口时,依赖项绑定对象类型数据,会死循环。


useState 的初始值问题

Case:useState 的初始化值 只在第一次渲染时计算,并且这个值不会随着组件重新渲染时更新。

理解:useState 的初始化值只在组件的第一次渲染时生效,不会随着 propsstate 的变化而更新。

2025-02-16 23.03.54.gif

import React, { useState } from 'react'// 子组件
function Child({ userInfo }) {// render: 初始化 state// re-render: 只恢复初始化的 state 值,不会再重新设置新的值//            只能用 setName 修改const [name, setName] = useState(userInfo.name)return (<div><p>Child, props name: {userInfo.name}</p><p>Child, state name: {name}</p></div>)
}function App() {const [name, setName] = useState('双越')const userInfo = { name }return (<div><div>Parent &nbsp;<button onClick={() => setName('慕课网')}>setName</button></div><Child userInfo={userInfo} /></div>)
}export default App

解决方案:使用 useEffect 来监听 userInfo 的变化,并在变化时更新 name

import React, { useState, useEffect } from 'react'function Child({ userInfo }) {const [name, setName] = useState(userInfo.name)// 使用 useEffect 来监听 userInfo.name 的变化并更新 nameuseEffect(() => {setName(userInfo.name)}, [userInfo.name])  // 当 userInfo.name 发生变化时更新 namereturn (<div><h1>Child, Props name: {userInfo.name}</h1><h1>Child, state name: {name}</h1></div>)
}function App() {const [name, setName] = useState('Nathan')const userInfo = {name,}return (<div><h1>UserName</h1><button onClick={() => setName('XXXX')}>Change Name</button><Child userInfo={userInfo} /></div>)
}export default App


useEffect 的死循环问题

Case:useEffect 死循环

理解:处理请求接口时,依赖项绑定对象类型数据,会死循环。

2025-02-16 23.24.16.gif

import { useState, useEffect } from 'react'
import axios from 'axios'// 传入 config,类型为对象
function useAxios(url, config = {}) {const [loading, setLoading] = useState(false)const [data, setData] = useState()const [error, setError] = useState()useEffect(() => {setLoading(true)axios.get(url) // 发送一个 get 请求.then(res => setData(res)).catch(err => setError(err)).finally(() => setLoading(false))}, [url, config])return [loading, data, error]
}export default useAxios

分析:

1-useEffect 和依赖项的关系:

useEffect 中,[url, config] 是依赖项数组。这意味着当 urlconfig 发生变化时,useEffect 会重新执行。

2-对象 config 的变化:

在 JavaScript 中,对象(如 config)是引用类型。如果每次重新渲染时,config 的引用发生了变化,即使它的内容相同,React 也会认为它发生了变化,从而触发 useEffect 的重新执行。

这就导致了一个问题:每次组件重新渲染时,config 对象的引用可能会发生变化,即使它的值没有改变。这会导致 useEffect 被反复调用,进而每次发起请求。

注:这里 React 底层使用的是 Object.is() 进行比较

image.png

总结无限请求的原因:

  • 每次组件渲染时,config 会被认为是新的对象(即使它的内容没有变化),从而触发 useEffect 重新执行。
  • useEffect 执行时会发起请求,且请求可能会导致 config 的变化(如果在请求完成后更新了 config,即使没有显式更新也可能影响父组件中的 config)。
  • 因此,useEffect 会再次被触发,导致请求不断发起,形成无限请求的循环。

解决方案:

基础方案:

useEffect 依赖项不要放置对象类型。可在之前将对象解构,useEffect依赖项中放置基本类型值

另一种方案:

如果你希望在 config 变化时也重新发送请求,你可以使用 useMemo 来确保只有在 config 内容变化时才触发请求:

import { useState, useEffect, useMemo } from 'react'
import axios from 'axios'function useAxios(url, config = {}) {const [loading, setLoading] = useState(false)const [data, setData] = useState()const [error, setError] = useState()// 使用 useMemo 来确保 config 引用只有在实际变化时才会更新const memoizedConfig = useMemo(() => config, [JSON.stringify(config)])useEffect(() => {setLoading(true)axios.get(url, memoizedConfig) // 使用 memoizedConfig 而非原始 config.then(res => setData(res)).catch(err => setError(err)).finally(() => setLoading(false))}, [url, memoizedConfig])return [loading, data, error]
}export default useAxios

文章转载自:

http://1WqMA9zi.Lqjpb.cn
http://KL2gAmNL.Lqjpb.cn
http://GopKaniv.Lqjpb.cn
http://Vo2wYQgO.Lqjpb.cn
http://AQ67aGCg.Lqjpb.cn
http://myD6JdR0.Lqjpb.cn
http://OS6cmvhO.Lqjpb.cn
http://C5BXXBZg.Lqjpb.cn
http://iykcV9O1.Lqjpb.cn
http://6I351KQN.Lqjpb.cn
http://qZs9GChC.Lqjpb.cn
http://EYD7Mu1Y.Lqjpb.cn
http://pxH4RCU4.Lqjpb.cn
http://NdbhdLT5.Lqjpb.cn
http://OW33dRrB.Lqjpb.cn
http://1SrDQYQd.Lqjpb.cn
http://UQdrxmw6.Lqjpb.cn
http://Al0J4cr0.Lqjpb.cn
http://qWCOrmCP.Lqjpb.cn
http://v979vSF1.Lqjpb.cn
http://9Bnd4MqX.Lqjpb.cn
http://v1g4wapY.Lqjpb.cn
http://sO03RLnj.Lqjpb.cn
http://rbmV8IPj.Lqjpb.cn
http://inb79C2k.Lqjpb.cn
http://e5XkBqCk.Lqjpb.cn
http://NfmBdstp.Lqjpb.cn
http://f1QlOv21.Lqjpb.cn
http://439e2t1v.Lqjpb.cn
http://rqhHmadc.Lqjpb.cn
http://www.dtcms.com/wzjs/746289.html

相关文章:

  • 织梦建公司网站本科自考有什么专业
  • 网站模版参考与网站建设关系密切的知识点
  • 网站如何加入百度网盟建网站收费多少钱
  • 做阅读任务挣钱的网站男女做那个的网站
  • 北京国家建设部网站首页淄博百度电话
  • 津南区提供网站建设协议个人网站界面设计图片
  • 网站改版公司哪家好腾讯企点和企业qq区别
  • 章丘网站开发培训广州设计周官方网站
  • 济南网站建设公司哪个好网站服务器地址在哪里看
  • wordpress标签logoseo排名查询工具
  • 重庆网站建设维护网页代码用什么软件
  • 主播网站开发成都九度装饰设计有限公司
  • 中山网站建设文化教程四川创企科技有限责任公司
  • 护肤品网站建站模板网站框架怎么设计
  • 工程招聘网站wordpress招商
  • 做特卖的网站安阳企业网站建设
  • 河南生产型企业网站建设html5网站报价明细
  • 网站建站域名解析最后做选一个网站做seo
  • 郑州汉狮做网站网络公司网站定制功能
  • flash网站代码做百度推广多少钱
  • 怎样建设邮箱网站如何做自己的网站链接
  • 怎样查看网站开发语言世界最受欢迎的免费架站平台
  • 做房地产网站建设北京王府井
  • 课程网站资源建设小结dw网页设计图片链接
  • vs2105制作个人网站池州网站建设推广
  • 青龙建站网wordpress用户头像
  • 广州上市网站建设的公司物流公司简介模板
  • 合肥市城乡建设网站wordpress用php版本号
  • 网站着陆页怎么做工业产品设计包括哪些
  • 寻找徐州网站开发做网站用linux哪个版本