UNPKG

press-pix

Version:
169 lines (132 loc) 4.16 kB
# Safe Area 工具使用指南 ## 📦 提供的工具 ### 1. React Hooks(推荐) #### `useSafeAreaStyle()` - 获取样式对象 最简单的使用方式,适合大多数场景。 ```tsx import { useSafeAreaStyle } from 'src/local-logic/utils/use-safe-area'; function MyComponent() { // ✨ 只需一行代码!自动处理异步、状态更新 const safeAreaStyle = useSafeAreaStyle(); return ( <div style={safeAreaStyle}> 内容会自动应用安全区域的 padding </div> ); } ``` **可选参数:** ```tsx // 只设置左边距 const leftOnly = useSafeAreaStyle({ right: false }); // 只设置右边距 const rightOnly = useSafeAreaStyle({ left: false }); // 与其他样式合并 <div style={{ ...safeAreaStyle, backgroundColor: 'red' }}> ``` #### `useSafeArea()` - 获取详细信息 如果需要显示具体数值或做更复杂的处理。 ```tsx import { useSafeArea } from 'src/local-logic/utils/use-safe-area'; function MyComponent() { const safeArea = useSafeArea(); return ( <div> <div>Left: {safeArea.left}px</div> <div>Right: {safeArea.right}px</div> <div>Padding Left: {safeArea.paddingLeft}px</div> <div>Padding Right: {safeArea.paddingRight}px</div> </div> ); } ``` ### 2. 工具函数(Class 组件或特殊场景) #### `getSafeAreaStyle()` - 获取样式对象 ```tsx import { getSafeAreaStyle } from 'src/local-logic/utils/safe-area'; class MyComponent extends Component { state = { safeAreaStyle: { paddingLeft: '0px', paddingRight: '0px' } }; async componentDidMount() { // ⚠️ 需要等待数据准备完成 const { tryGetSafeAreaInfo } = await import('src/local-logic/utils/safe-area'); await tryGetSafeAreaInfo(); // 然后更新状态 this.setState({ safeAreaStyle: getSafeAreaStyle() }); } render() { return ( <div style={this.state.safeAreaStyle}> 内容 </div> ); } } ``` #### `getSafeAreaInfo()` - 获取详细信息 ```tsx import { getSafeAreaInfo } from 'src/local-logic/utils/safe-area'; const safeArea = getSafeAreaInfo(); // 返回:{ left, top, right, bottom, paddingLeft, paddingTop, paddingRight, paddingBottom } ``` ## 🎯 使用建议 ### ✅ 推荐做法 1. **函数组件 → 使用 Hooks** ```tsx function MyPage() { const safeAreaStyle = useSafeAreaStyle(); return <div style={safeAreaStyle}>...</div>; } ``` 2. **Class 组件 → 使用 Hooks(通过包装)** ```tsx // 创建一个 HOC function withSafeArea(Component) { return function(props) { const safeAreaStyle = useSafeAreaStyle(); return <Component {...props} safeAreaStyle={safeAreaStyle} />; }; } @withSafeArea class MyPage extends Component { render() { return <div style={this.props.safeAreaStyle}>...</div>; } } ``` 3. **Class 组件 → 直接使用工具函数** ```tsx class MyPage extends Component { state = { safeAreaStyle: {} }; async componentDidMount() { const { tryGetSafeAreaInfo, getSafeAreaStyle } = await import('src/local-logic/utils/safe-area'); await tryGetSafeAreaInfo(); this.setState({ safeAreaStyle: getSafeAreaStyle() }); } render() { return <div style={this.state.safeAreaStyle}>...</div>; } } ``` ### ❌ 不推荐做法 ```tsx // ❌ 不要在 render 中直接调用(会使用旧数据) render() { return <div style={getSafeAreaStyle()}>...</div>; } // ❌ 不要忘记等待数据准备 componentDidMount() { // 缺少 await tryGetSafeAreaInfo() this.setState({ safeAreaStyle: getSafeAreaStyle() }); // 可能获取到旧数据 } ``` ## 📝 完整示例 查看 [test.tsx](../app/views/test.tsx) 中的 `SafeAreaDemo` 组件,了解完整的使用示例。 ## 🔧 技术细节 - **最小 padding**: 44px(即使设备返回 0,也会使用 44px) - **数据获取**: 模块加载时自动初始化,通常在页面渲染前完成 - **超时时间**: 最多等待 3 秒获取数据 - **状态管理**: Hooks 自动管理状态,无需手动处理