press-pix
Version:
基于 PixUI 的 Press 组件库
169 lines (132 loc) • 4.16 kB
Markdown
最简单的使用方式,适合大多数场景。
```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' }}>
```
如果需要显示具体数值或做更复杂的处理。
```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>
);
}
```
```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>
);
}
}
```
```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 自动管理状态,无需手动处理