const [currentZoom, setCurrentZoom] = useState<any>('Days') //缩放的状态
gantt.attachEvent('onEmptyClick', ()=>{
console.log(currentZoom);
})
currentZoom为响应式数据,如何让打印结果为最新的
const [currentZoom, setCurrentZoom] = useState<any>('Days') //缩放的状态
gantt.attachEvent('onEmptyClick', ()=>{
console.log(currentZoom);
})
currentZoom为响应式数据,如何让打印结果为最新的
要在闭包中获取最新的 currentZoom
状态,你可以使用 React 的 useRef
钩子来持有一个可变的引用,该引用会随着组件的重新渲染而持续更新。这是因为闭包(如事件处理函数)捕获的是变量在创建时的值,而不是在调用时的值。对于函数组件中的响应式数据,使用 useRef
可以确保你始终访问到最新的状态值。
以下是修改后的代码示例:
### 解决方案
你可以使用 `useRef` 来持有一个对 `currentZoom` 的引用,并在组件更新时更新这个引用。这样,在闭包中就可以通过这个引用来访问最新的 `currentZoom` 值。
import React, { useState, useRef, useEffect } from 'react';
function YourComponent() {
const [currentZoom, setCurrentZoom] = useState('Days'); // 缩放的状态
const currentZoomRef = useRef(currentZoom); // 创建一个对 currentZoom 的引用
useEffect(() => {
currentZoomRef.current = currentZoom; // 在每次 currentZoom 更新时,更新引用
}, [currentZoom]);
gantt.attachEvent('onEmptyClick', () => {
console.log(currentZoomRef.current); // 使用引用访问最新的 currentZoom 值
});
// 其他组件逻辑...
return (
// JSX 渲染...
);
}
### 解释
1. **`useRef` 钩子**:`useRef` 返回一个可变的对象,其 `.current` 属性被初始化为传递给 `useRef()` 的参数(`currentZoom` 的初始值)。这个对象在组件的整个生命周期内保持不变。
2. **`useEffect` 钩子**:`useEffect` 钩子用于在 `currentZoom` 状态改变时更新 `currentZoomRef.current` 的值。通过将 `currentZoom` 包含在 `useEffect` 的依赖数组中,每当 `currentZoom` 更新时,`useEffect` 内的回调函数就会执行。
3. **事件处理函数**:在 `gantt.attachEvent` 的回调函数中,通过 `currentZoomRef.current` 访问最新的 `currentZoom` 值。
const [currentZoom, setCurrentZoom] = useState<string>('Days'); // 缩放的状态
gantt.attachEvent('onEmptyClick', () => {
setCurrentZoom((prevZoom) => {
console.log(prevZoom);
return prevZoom;
});
});
补充
import { useState, useCallback, useEffect } from 'react';
const [currentZoom, setCurrentZoom] = useState<string>('Days'); // 缩放的状态
const handleEmptyClick = useCallback(() => {
setCurrentZoom((prevZoom) => {
console.log(prevZoom);
return prevZoom;
});
}, [currentZoom]);
useEffect(() => {
const eventId = gantt.attachEvent('onEmptyClick', handleEmptyClick);
return () => {
gantt.detachEvent(eventId);
};
}, [handleEmptyClick]);
3 回答1.8k 阅读✓ 已解决
1 回答1.6k 阅读✓ 已解决
4 回答1.6k 阅读✓ 已解决
2 回答2.4k 阅读✓ 已解决
1 回答2.5k 阅读✓ 已解决
2 回答1.3k 阅读✓ 已解决
2 回答1.5k 阅读✓ 已解决
用 useCallback:
或者用 useRef: