- useState的值在每个rernder中都是独立存在的。而useRef.current则更像是相对于render函数的一个全局变量,每次他会保持render的最新状态。
- useState值的更新会触发组件重新渲染,而useRef的current不会出发重渲染。
- useRef()钩不仅用于DOM引用。“ ref”对象是通用
容器
,其当前属性是可变的,并且可以保存任何值,类似于类的实例属性。- 变量是决定视图图层渲染的变量,请使用
useState
,其他用途
useRef
- useRef特性:可变的ref对象,持久化
React项目中,通常使用useState的钩子函数更新state,
但是在useEffect中 使用useState更新state不会立马更新到state,而是等useEffect
执行完毕?
以后才会统一处理更新(写多个useEffect也没用),如果要在useEffect中立即拿到更新后的state值,可以
使用useRef
这个钩子函数。
const [filterData, setFilterData] = useState<any>([]);
const [total, setTotal] = useState<number>(0);
let studentGuid = useRef<string | null>(window.sessionStorage.getItem("sGuid"));
const [studentInfo, setstudentInfo] = useState<StudentInfo>({});
const [currentPath, setCurrentPath] = useState<string | null>(window.sessionStorage.getItem("current_path"));
const [isHideInfo, setIsHideInfo] = useState<boolean>(false);
const { urls } = props;
const intl = useIntl();
useEffect(() => {
window.addEventListener('SwitchStudent', (evt: Event): void => {
const e = evt as CustomEvent;
if (e == null) {
console.log('Invalid event type!');
return;
}
const { param } = e.detail;
if (param) {
window.sessionStorage.setItem("sGuid", param);
studentGuid = param;
}
}, false);
window.addEventListener('Clear', (evt: Event): void => {
const e = evt as CustomEvent;
if (e == null) {
console.log('Invalid event type!');
return;
}
studentGuid ="" ;
}, false);
window.addEventListener('SwitchCurrentPath', (evt: Event): void => {
const e = evt as CustomEvent;
if (e == null) {
console.log('Invalid event type!');
return;
}
const { param } = e.detail;
if (param) {
window.sessionStorage.setItem("current_path", param);
setCurrentPath(param);
}
}, false);
window.addEventListener('UpdateStudentInfo', (evt: Event): void => {
const e = evt as CustomEvent;
if (e == null) {
console.log('Invalid event type!');
return;
}
if (!studentGuid) { //HERE
return;
}
queryStudentInfoByGuid(studentGuid).then((result) => {
setStudentInfo(result);
});
}, false);
queryStudentCard();
queryHideInfo();
}, []);
在此副作用函数中,
如果不是
使用useRef,
而是
在SwitchStudent事件监听器中使用useState对studentGuid更新,
那么
在UpdateStudentInfo事件监听器中拿到的studentGuid将会始终是null,也就不会执行后面的 queryStudentInfoByGuid()。
版权声明:本文为weixin_45595683原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。