reactNative中几个特殊的hooks TouchableWithoutFeedback 和 useWindowDimensions

110 阅读1分钟
# TouchableWithoutFeedback

**是什么 / 用途**

-   这是 RN 的“无视觉反馈”的可点击包装组件。它会捕获触摸事件(`onPress`, `onPressIn`, `onPressOut`, `onLongPress`),但**不会**提供默认的视觉反馈(不像 `TouchableOpacity` 那样改变透明度,也不像 `TouchableHighlight` 那样高亮)。常用于:点击空白区域关闭键盘、在自定义动画/视觉效果下需要完全控制反馈时,或需要“可点但不可见反馈”的场景。

**常见用法**

-   包一层容器并在外部点击时触发行为(例如 `Keyboard.dismiss()`):

<TouchableWithoutFeedback onPress={() => Keyboard.dismiss()}>
  <View style={{flex:1}}>...</View>
</TouchableWithoutFeedback>



useWindowDimensions

**是什么 / 返回值**

-   `useWindowDimensions()` 是一个 hook,返回当前窗口尺寸与缩放信息(`{ width, height, scale, fontScale }`),并在窗口尺寸变化(例如方向切换、split-screen、resize on web)时自动触发组件重渲染。单位是 RN 的逻辑像素(dp)。

**适用场景**

-   响应式布局(改变列数 / 布局方向 / 字体大小以适配屏幕大小)。
-   你需要在 render 中用到最新的 window 宽高并希望自动更新时。

**与 `Dimensions.get('window')` 的对比**

-   `useWindowDimensions` 是推荐方式:它会自动订阅变化并触发 rerender;而 `Dimensions.get` 只读取一次,需要手动监听 `Dimensions.addEventListener` 来响应变化(写起来更繁琐)。
-   在需要频繁读取尺寸的深层子组件上,频繁 rerender 可能有性能影响——可以把尺寸放到顶层 context,再下发(减少重复订阅)

**性能提示**

-   `useWindowDimensions` 会在尺寸变化时导致组件重渲染;如果组件本身很复杂或位于大量列表项中,考虑把尺寸依赖限制在更少的组件或用 `useMemo` / context 共享尺寸值。


示例:根据方向切换布局
const { width, height } = useWindowDimensions();
const isLandscape = width > height;
return isLandscape ? <Landscape /> : <Portrait />;