react-native - React Native onLayout 与 React Hooks
问题描述
我想在每次渲染时测量React Native View的大小,并将其保存到 state。如果元素布局没有改变效果不应该运行。
使用基于类的组件很容易,可以使用onLayout 。但是我在使用 React Hooks 的功能组件中该怎么做?
我读过useLayoutEffect。如果这是要走的路,你有一个如何使用它的例子吗?
我制作了这个名为 useDimensions 的自定义钩子。这是我已经走了多远:
const useDimensions = () => {
const ref = useRef(null);
const [dimensions, setDimensions] = useState({});
useLayoutEffect(
() => {
setDimensions(/* Get size of element here? How? */);
},
[ref.current],
);
return [ref, dimensions];
};
我使用钩子并将 ref 添加到我想要测量其尺寸的视图中。
const [ref, dimensions] = useDimensions();
return (
<View ref={ref}>
...
</View>
);
我试过调试ref.current
,但没有发现任何有用的东西。我还在效果挂钩中尝试了measure() :
ref.current.measure((size) => {
setDimensions(size); // size is always 0
});
解决方案
如果你想要一个更独立的版本,这里是 React Native 的自定义钩子版本:
const useComponentSize = () => {
const [size, setSize] = useState(null);
const onLayout = useCallback(event => {
const { width, height } = event.nativeEvent.layout;
setSize({ width, height });
}, []);
return [size, onLayout];
};
const Component = () => {
const [size, onLayout] = useComponentSize();
return <View onLayout={onLayout} />;
};
推荐阅读
- java - 如何将 SpringBoot 配置外部文件覆盖到类路径文件?
- node.js - 从“.cer”文件中读取 Node.js 中 RSA/ECB/OAEPWithSHA-256AndMGF1Padding 的公钥
- javascript - 我试图在javascript中比较两个变量
- java-8 - Java 8 从 ArrayList 错误中获取不同的元素
- node.js - Windows:使用 nodejs 创建的文件夹 - Windows 说位置不可用
- assembly - 在nasm中乘然后除
- python - dict 到 xlsx 的转换打印不正确
- c# - 当我撞到一个物体时,我的统一重置不起作用
- json - 如何让heroku返回我的错误响应?
- google-cloud-platform - GCP Cloud Logging 中不显示 GKE 应用程序日志(pod/容器/部署)