reactjs - 仅当在 React 中触发回调时才从状态返回值
问题描述
我正在使用react-resizable库来调整表中列的大小。
使用库的 API,我可以在开始onSortStart
和onSortStop
完成元素大小调整时调用。
当我登录触发的回调时,我只在调整大小开始时看到一个日志,在调整大小停止时看到一次 - 到目前为止一切都很好。
但我想要的是能够返回一个布尔标志,当调整大小开始时为真,当调整大小停止时为假。
问题是每次useStateful
重新创建/渲染我的自定义挂钩时,状态都会发生变化。所以我得到了数百个变量的更新版本isResizing
。
我怎样才能让isResizing
启动时返回一次,停止时返回一次?
这是我的代码:
const ResizableColumn = (props: ResizableColumnProps): ReactElement => {
const { onResizeStart, onResizeStop } = useStateful();
const {
onResize, width, className, children, style,
} = props;
if (!width) {
return <th className={className} style={style}>{children}</th>;
}
return (
<Resizable
width={width}
height={0}
onResize={onResize}
minConstraints={[150, 150]}
draggableOpts={{ enableUserSelectHack: false }}
onResizeStart={onResizeStart}
onResizeStop={onResizeStop}
>
<th className={className} style={style}>{children}</th>
</Resizable>
);
};
export default ResizableColumn;
使用有状态的:
const useStateful = (): any => {
const [isResizing, setIsResizing] = useState(false);
const onResizeStart = (): void => {
console.log('%c Resizing Started!', 'color: green;'); // logs once - perfect
setIsResizing(true);
};
const onResizeStop = (): void => {
console.log('%c Resizing Stopped!', 'color: green;'); // logs once - perfect
setIsResizing(false);
};
console.log('%c isResizing', 'color: green;', isResizing); // logs hundreds of times with different values
return { isResizing, onResizeStart, onResizeStop };
};
export default useStateful;
我也尝试过使用useRef
,但同样的事情发生了:
const useStateful = (): any => {
const isResizing = useRef<boolean>();
const onResizeStart = (): void => {
console.log('%c Resizing Started!', 'color: green;'); // logs once - perfect
isResizing.current = true;
};
const onResizeStop = (): void => {
console.log('%c Resizing Stopped!', 'color: green;'); // logs once - perfect
isResizing.current = false;
};
console.log('%c isResizing', 'color: green;', isResizing.current); // logs hundreds of times with different values
return { isResizing, onResizeStart, onResizeStop };
};
export default useStateful;
解决方案
Ciao,我看了你的代码很长时间,我唯一注意到的是,在你的自定义钩子上useStateful
,与你使用自定义钩子的行相比,你返回的元素数量不同。我在这里做了一个小例子。
自定义钩子在概念上与您的相同:
const useStateful = () => {
const [isResizing, setIsResizing] = useState(false);
const onResizeStart = () => {
setIsResizing(true);
console.log("onResizeStart");
};
const onResizeStop = () => {
setIsResizing(false);
console.log("onResizeStop");
};
console.log(isResizing);
return [isResizing, onResizeStart, onResizeStop];
};
但是,当我使用这个钩子时,我写道:
const [isResizing, onResizeStart, onResizeStop] = useStateful();
而已。我知道我的示例可能不是您想要的,但是重新创建您的环境有点棘手。
推荐阅读
- python - Python中如何保证回调函数的及时性?
- amazon-web-services - Cloudformation - 构建堆栈时 Rds 失败
- c# - 如何使用 Lambda 从 SQS 中提取 S3 事件信息
- python - 将应用程序与 pyinstaller 捆绑后,无法使用 openpyxl 在 Excel 中保留或/和加载图像
- angular - 打字稿中具有两种可能类型的函数参数
- python - 为什么 'dict(Count(list)) 在 windows 的 python 中不起作用?
- firebase - 我可以在 Firebase 上管理多少个客户端应用?
- c# - 构造函数上的 WPF FileNotFoundException
- r - 是否可以在 R 的 cppFunction 中动态加载文件?
- dask - 找不到 Dask PicklingError 函数