React.useCallback(function,array)使用,React中的函数组件和类组件的取值(快照or最新值)
admin
2024-03-01 20:57:36
0

目录

React.useCallback(function,array)

React.memo

示例1

示例2

React中的函数组件和类组件的取值(快照or最新值)

闭包例子

修改React例子


React.useCallback(function,array)

返回一个函数,只有在array中的依赖项变化的时候才会更新(返回一个新的函数)。

使用场景:当父组件传入子组件函数时,由于React.memo进行的是浅比较,重新渲染时,函数的引用是发生改变的,所以会导致子组件重新渲染,而用useCallback后只要依赖的变量未发生改变将始终返回同一个函数引用,不会导致子组件重新渲染。

注意区别于useMemo 缓存的是函数的返回结果useCallback缓存的是函数。

React.memo

React纯组件pureComponent、React.memo(FunComponent,compareFunction)、React.useMemo(callback,array)_YF-SOD的博客-CSDN博客

示例1

点击 Button1 的时候只会更新 Button1 和 Button3 后面的内容;

点击 Button2 会将三个按钮后的内容都更新;

点击 Button3 的也是只更新 Button1 和 Button3 后面的内容。

没有用useCallback包括的函数,每次都会重新声明一个新的方法,新的方法尽管和旧的方法一样,但是依旧是两个不同的对象,React.memo对比后发现对象props改变,就重新渲染了。而用uesCallback包括的函数只有当依赖项改变时才会返回新的函数(对象),所以不会重新渲染。

const Button = React.memo(({ onClickButton, children }) => {return (<>{Math.random()});
});
export default function App() {const [count1, setCount1] = useState(0);const [count2, setCount2] = useState(0);const [count3, setCount3] = useState(0);const handleClickButton1 = () => {setCount1(count1 + 1);}const handleClickButton2 = useCallback(() => {setCount2(count2 + 1);}, [count2]);return (
); } const rootElement = document.getElementById("root"); ReactDOM.render(, rootElement);

示例2

useCallback - 简书

React中的函数组件和类组件的取值(快照or最新值)

下面先点击弹框按钮再点击double,alert中的数值,在类组件中始终显示的是最新的。而在函数组件中始终显示的是点击弹框时的数值(快照)而不是double后的数值。

import React, { useState } from "react";
class ClassProfilePage extends React.Component {showMessage = () => {alert('Followed ' + this.props.user);};handleClick = () => {setTimeout(this.showMessage, 3000);};render() {return ;}
}
function FunctionProfilePage(props) {const showMessage = () => {alert('Followed ' + props.user);};const handleClick = () => {setTimeout(showMessage, 3000);};return ();
}
function App() {const [state,setState] = useState(1);return (
state:{state}
// 点击始终显示的是快照值 // 点击始终显示的是最新值
); } const rootElement = document.getElementById("root"); ReactDOM.render(, rootElement);

理解为在类组件中是挂载在this的引用上所以始终拿到的是最新的值,而在函数组件中是最新值。 

闭包例子

for(var i=0;i<10;i++){setTimeout(() => console.log('val:',i)) // 拿到的是最新值
}for(var i=0;i<10;i++){setTimeout(((val) => console.log('val:',val)).bind(null,i)); // 拿到的是快照
}const ref = {current: null}
for(var i=0;i<10;i++){ref.current = i; setTimeout(((val) => console.log('val:',ref.current)).bind(null,ref)); // 拿到的是最新值
}for (var i = 0; i < 10; i++) { // 拿到的是快照let t = i;setTimeout(() => {console.log("t:", t);});
}

修改React例子

可以通过下面修改在类组件中打印快照值。

  showMessage = (message) => {alert('Followed ' + message);};handleClick = () => {const message = this.props.user // 在触发异步函数之前保存快照setTimeout(()=>{this.showMessage(message)}, 3000);};

可以通过下面修改在函数组件中打印最新值(ref存取最新值)。

const ref = useRef("");
useEffect(() => {ref.current = props.user;
});
const showMessage = () => {console.log('ref:',ref)alert("Followed " + props.user +',' + ref.current);
};

相关内容

热门资讯

拥抱兰一,遇见夏天!兰一&Li... 兰多多亲自然乐园游玩地图宁夏贺兰山国家森林公园咨询电话:0951-4114390免责:文章内容、产品...
川汇区地道川菜美食探秘,推荐餐... 川汇区地道川菜美食之旅,带你领略正宗川菜风味,推荐前往当地知名餐厅品尝绝佳风味,品尝麻辣香鲜的火锅、...
青岛正规旅行社哪家好?口碑红黑... 青岛,这座黄海之滨的城市,凭借海滨风光、历史文化和旅游资源,成为游客青睐的目的地。旅行中选择合适的旅...
张吉怀E起游②丨明清巷陌深 洪... 编者按: 张家界的奇峰刺破云海、湘西州的鼓点敲响千年、怀化的山水铺展锦绣诗行……张吉怀,一幅灵动的山...
夏游运城,晚上这样过! 当白天的喧嚣渐渐褪去,夜幕降临,城市的另一番魅力才刚刚苏醒。如今,河东大地不再满足于夜市小吃和灯光秀...
陕西日报刊发丨留坝:享“秦岭十... 炎炎夏日,不少人渴望到山野间寻一份清凉。夏季平均气温仅有22℃的留坝县,成为隐匿在秦岭山中的“宝藏避...
原创 甘... 在短视频平台上,一位名为 “非洲十年” 的用户近来热度居高不下。 他发布的视频,将大众的目光聚焦到了...
酒香浸润烟火处:亿星酒业连锁门... 当清晨的阳光洒满社区的林荫道,当傍晚的大排档升腾起诱人香气,当路边的晚风拂去行人的疲惫,亿星名酒连锁...
喜稻拌饭——温暖偕行 喜稻拌饭起源于山西省,扎根于传统朝鲜族拌饭的深厚底蕴,将朝鲜族料理中对食材新鲜度的严苛把控、酱料调配...
经典名肴——红烧鸡块 编者按:本公众号自2016年创立以来,一直关注人类科学(史)、技术(史)、博物(史)三大领域。当下,...
衣食住行跟我逛︱小时候的味道!... 作为苏州人从小吃到大的美食,除了苏式汤面和生煎馒头,还有甜咸适口的粢饭团。近日,记者了解到,位于苏州...
中伏将至,头伏饺子二伏面,5道... 7月30日即将迎来中伏,老话说:“头伏饺子二伏面”,中伏,天气异常炎热,人体新陈代谢加快,对能量的需...
姑苏早点来丨月泊湾,重温“小辰... 月泊湾·壹号菜市场 前身为三香农贸市场 去年底完成改造焕新 熟悉的烟火气依旧氤氲升腾 📍月泊湾·壹...
原创 唤... 晨光中的谷物交响曲 六点三十分,闹钟在朦胧中响起。厨房里飘来咖啡的香气,阳光透过纱帘在地板上投下斑...
【有一种叫云南的生活】气候凉爽... 入夏以来,秋城昭阳迎来了大批避暑旅居的川渝游客。他们在昭阳的各大公园里欢歌起舞,畅享清凉夏日带来的惬...
2025年火把节全州接待游客8... 激情火把节,最炫民族风。 7月18日晚,2025年凉山彝族火把节开幕式在西昌举行,凉山再次进入一年一...
博物馆奇妙夜:五家大湾区博物馆... 暑假,博物馆又成了热门打卡点,广东省博物馆的预约门票更是一票难求。旅游平台数据显示,7月中上旬,博物...