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

批量做网站长沙高端网站制作公司

批量做网站,长沙高端网站制作公司,思途智旅游网站开发,wordpress替换主题数据库为什么hook必须在组件内的顶层声明#xff1f; 这是为了确保每次组件渲染时#xff0c;Hooks 的调用顺序保持一致。React利用 hook 的调用顺序来跟踪各个 hook 的状态。每当一个函数组件被渲染时#xff0c;所有的 hook 调用都是按照从上到下的顺序依次执行的。React 内部会…为什么hook必须在组件内的顶层声明 这是为了确保每次组件渲染时Hooks 的调用顺序保持一致。React利用 hook 的调用顺序来跟踪各个 hook 的状态。每当一个函数组件被渲染时所有的 hook 调用都是按照从上到下的顺序依次执行的。React 内部会维护一个状态列表这个列表中的每个状态项都对应一个 hook 的调用包括 useState、useEffect 等。当你调用 useState(initialValue) 时React 会在内部为这个状态分配一个索引。该索引基于 hook 调用的顺序。例如第一次调用 useState 时它会在状态列表的第一个位置存储状态第二次调用会在第二个位置存储以此类推。 考虑下面这个demo const Component () {const [count, setCount] useState(0);const handleOfClick () setCount(count 1);return button onClick{setCount}{count}/button }Q既然每次视图的更新都会重新执行整个函数那必然会执行到const [count, setCount] useState(0)这句代码。如果我在上一次更新中把count加到10为什么在新的渲染周期中React能记住这个10而不是传给useState的0呢 A当组件重新渲染时React 会根据组件的调用顺序再次按顺序调用对应的 hook。这样React 可以确保它能够始终访问到正确的状态。例如当第二次渲染时React 知道第一个 useState 是哪个状态因为它在第一次渲染时已经分配了这个状态的索引这个索引是靠hook调用的顺序产生的索引来追踪的。 所以如果在条件语句、循环或嵌套函数中调用 hook可能会导致调用顺序的变化从而产生不可预知的状态。 useImperativeHandle useImperativeHandle通常是和forwardRef配合使用的用来把子组件中的属性或者方法暴露给父组件在进行组件的封装或者组件间的通信的时候常会使用。如下 // 封装一个可拖拽的组件 const DragComponent forwardRef((props: {children: React.ReactNode, // 求求你不要挂一个很复杂的组件进来// other config...},ref // ref是必须的) {// 复位const resetPosition () {// todo: 可以在父组件中调用让这个可拖拽的组件在父组件中回到第一次渲染的位置}useImperativeHandle(ref, () {resetPosition // 显式声明})return (div{props.children}/div)} )// 之后在某一个页面中使用它 const Page () {const dragRef useRef(null)const handleOfClick () {dragRef.current?.reset();}return (divDragComponent ref{dragRef}/button onClick{handleOfClick}复位/button/div) }useCallback useCallBack用来缓存一个函数的引用它常常配合memo使用以提高渲染的性能。 const Component memo(({ count, setCount }: { count: number; setCount: () void } ) {console.log(CountComponeng render);return (divbutton onClick{() setCount()}CountComponeng: {count}/button/div);})function App() {console.log(App render);const [parentCount, setParentCount] useState(0);const [childCount, setChildCount] useState(0);const addChildCount useCallback(() {setChildCount(childCount 1);}, [childCount]);// 这样也行// const addChildCount useCallback(() {// setChildCount((count) count 1);// }, []);return (div idapph1Hello Vite React!/h1button onClick{() setParentCount(parentCount 1)}parentCount: {parentCount}/buttonCountComponeng setCount{setChildCount} count{childCount} //div); }export default App; useReducer 类似redux的更规范的写法我用的还不多权当记录该说不说确实优雅 import React, { useReducer } from react;// 定义初始状态 const initialState { count: 0 };// 定义 reducer 函数 const reducer (state, action) {switch (action.type) {case increment:return { count: state.count 1 };case decrement:return { count: state.count - 1 };default:return state;} };const Counter () {// 使用 useReducerconst [state, dispatch] useReducer(reducer, initialState);return (divpCount: {state.count}/pbutton onClick{() dispatch({ type: increment })}Increment/buttonbutton onClick{() dispatch({ type: decrement })}Decrement/button/div); }; export default Counter;setState的函数写法和变量写法 我有这样的代码const [count, setCount] useState(0)在普通的情况下setCount(count 1) 和setCount((count) count 1)都能实现count加1并更新视图的操作。 但是考虑下面这个demo const handleOfClick () {setCount(count1)setCount(count1)setCount(count1) }每一次点击count最终都只能加1而不能加3这个React官网介绍的很清楚这里不多说。但是如果把上面的setCount(count1)换成setCount((count) count 1)确实能实现点击一次就3并更新视图的功能因为这种函数的写法保证了在进行状态更新时能够获取到最新的状态值特别是在状态更新依赖于之前的状态值时可以避免因为异步执行导致的潜在问题。 始终记住setState是异步的而且不是没setState一次就更新一次视图的涉及到React为了优化渲染性能而使用的批量更新策略。 再考虑一个更普遍的场景 const Page () {const [count, setCount] useState(1);useEffect(() {const scrollableContainer document.getElementById(scrollable-container);scrollableContainer?.addEventListener(scroll, () {setCount(count 1)});}, [])return div idscroll-container{count}/div }你会发现任凭你滚动的再快count只会加到2然后就一直不变了。因为此处的useEffect只会执行一次当你使用 addEventListener 直接绑定事件时你得到的是一个闭包。在这个闭包中count 的值是在事件绑定时捕获的(1)。 但是把setCount(count1)换成setCount((count) count 1)就能每次滚动的时候都加1因为它会接受当前状态作为参数这样每次更新都会基于最新的状态进行计算从而避免因为闭包问题导致的状态不正确的问题。
http://www.w-s-a.com/news/848170/

相关文章:

  • 在建设厅网站上查询注销建造师查域名是否注册
  • 企业网站推广方案策划公司网站在国外打开很慢使用cdn好还是国外租用服务器好
  • 龙华o2o网站建设百度不收录什么网站吗
  • 模板搭建网站百度信息流推广
  • 移动端网站制作模板自己做的网站点击赚钱
  • 网站站长如何赚钱wordpress抓取别人网站
  • 做网站媒体专门做产品定制的网站
  • 公司企业网站建设步骤免费asp网站模板
  • 台州企业网站搭建价格做留言的网站
  • 西安网站建设q.479185700強高端网站设计定制公司
  • 网站设计是平面设计吗音频文件放到网站空间里生成链接怎么做
  • seo是对网站进行什么优化可以在哪些网站做翻译兼职
  • 南宁seo网站推广服务网站建设客户分析
  • 网站属于什么公司甜品售卖网站网页设计
  • 如何在宝塔中安装wordpressseo1888网站建设
  • 网站系统cms湖南平台网站建设制作
  • 美团网站怎么做未备案网站加速
  • 通用cms网站wordpress可以商用
  • 阳江网络问政平台 周报济南seo公司案例
  • 重庆聚百思网站开发网络市场调研
  • seo工具共享网站敬请期待的英语
  • 最好看免费观看高清大全中国移动网络优化做什么的
  • 网站开发的步骤医院网站建设细节
  • 阿雷网站建设wordpress lucene
  • seo做多个网站建筑公司企业标语
  • 各大网站收录查询汕尾手机网站设计
  • 东莞网站平台费用58同城推广能免费做网站吗
  • 网站建设的组织机构做博客网站赚钱吗
  • 移动网站建设的前期规划内容南阳网站备案
  • 天津公司网站建设公司哪家好网站建设评估