UNPKG

@uiw/react-native

Version:
268 lines (228 loc) 6.89 kB
Drawer 抽屉 --- 用于在屏幕边缘显示应用导航等内容的面板。 ### 基础示例 ```jsx mdx:preview&background=#bebebe29 import React, { useState } from 'react'; import { View, Text } from 'react-native'; import { Drawer, Button } from '@uiw/react-native'; function Demo() { const [visible, setVisible] = useState(false); return ( <> <Drawer isOpen={visible} onChange={(isOpen) => setVisible(isOpen)} > <View> <Text>左边打开抽屉内容</Text> </View> </Drawer> <Button onPress={() => setVisible(!visible)}>左边打开抽屉</Button> </> ); } export default Demo ``` ### 右边展示 ```jsx mdx:preview&background=#bebebe29 import React, { useState } from 'react'; import { View, Text } from 'react-native'; import { Drawer, Button } from '@uiw/react-native'; function Demo() { const [visible, setVisible] = useState(false); return ( <> <Drawer isOpen={visible} placement="right" onChange={(isOpen) => setVisible(isOpen)} > <View> <Text>右边打开抽屉内容</Text> </View> </Drawer> <Button onPress={() => setVisible(!visible)}>右边打开抽屉</Button> </> ); } export default Demo ``` ### 设置Drawer高度 ```jsx mdx:preview&background=#bebebe29 import React, { useState } from 'react'; import { View, Text, SafeAreaView } from 'react-native'; import { Drawer, Button } from '@uiw/react-native'; function Demo() { const [visible, setVisible] = useState(false); return ( <SafeAreaView style={{height: 200}}> <Drawer isOpen={visible} placement="bottom" drawerHeight={100} onChange={(isOpen) => setVisible(isOpen)} > <View> <Text>下边打开抽屉内容</Text> </View> </Drawer> <Button onPress={() => setVisible(!visible)}>下边打开抽屉</Button> </SafeAreaView> ); } export default Demo ``` ### 修改Drawer宽度 ```jsx mdx:preview&background=#bebebe29 import React, { useState } from 'react'; import { View, Text, SafeAreaView } from 'react-native'; import { Drawer, Button } from '@uiw/react-native'; function Demo() { const [visible, setVisible] = useState(false); return ( <View style={{height: 200}}> <Drawer isOpen={visible} onChange={(isOpen) => setVisible(isOpen)} drawerHeight={10} > <View> <Text>打开抽屉内容</Text> </View> </Drawer> <Button onPress={() => setVisible(!visible)}>打开抽屉</Button> </View> ); } export default Demo ``` ### 禁用点击遮罩层关闭 ```jsx mdx:preview&background=#bebebe29 import React, { useState } from 'react'; import { View, Text, SafeAreaView } from 'react-native'; import { Drawer, Button } from '@uiw/react-native'; function Demo() { const [visible, setVisible] = useState(false); return ( <View style={{height: 200}}> <Drawer isOpen={visible} onChange={(isOpen) => setVisible(isOpen)} drawerHeight={10} maskClosable={false} > <View> <Text>点击遮罩层不允许关闭</Text> </View> </Drawer> <Button onPress={() => setVisible(!visible)}>打开抽屉</Button> </View> ); } export default Demo ``` ### 自定义遮罩层样式 ```jsx mdx:preview&background=#bebebe29 import React, { useState } from 'react'; import { View, Text } from 'react-native'; import { Drawer, Button } from '@uiw/react-native'; function Demo() { const [visible, setVisible] = useState(false); return ( <> <Drawer isOpen={visible} onChange={(isOpen) => setVisible(isOpen)} style={{ backgroundColor:'#fff5', borderRadius: '0px 10px 10px 0px'}} > <View> <Text>左边打开抽屉内容</Text> </View> </Drawer> <Button onPress={() => setVisible(!visible)}>左边打开抽屉</Button> </> ); } export default Demo ``` ### 内容居中 ```jsx mdx:preview&background=#bebebe29 import React, { useState } from 'react'; import { View, Text } from 'react-native'; import { Drawer, Button } from '@uiw/react-native'; function Demo() { const [visible, setVisible] = useState(false); return ( <> <Drawer isOpen={visible} onChange={(isOpen) => setVisible(isOpen)} style={{ justifyContent: 'center', textAlign: 'center' }} > <View> <Text>内容居中</Text> </View> </Drawer> <Button onPress={() => setVisible(!visible)}>内容居中</Button> </> ); } export default Demo ``` ### 抽屉覆盖全屏 - 可查看 [react-native-root-siblings](https://www.npmjs.com/package/react-native-root-siblings) 文档 ```jsx // 在 App.js 文件中 import React from 'react'; import {Provider} from 'react-redux'; import {store} from './models'; import {RootSiblingParent} from 'react-native-root-siblings'; export default () => { return ( <Provider store={store}> <RootSiblingParent> {/* ...你的导航之类的组件 */} </RootSiblingParent> </Provider> ); }; // 在使用组件页面 import { Fragment, useState } from 'react'; import { View, Text, SafeAreaView } from 'react-native'; import { Drawer, Button } from '@uiw/react-native'; import {RootSiblingPortal} from 'react-native-root-siblings'; function Demo() { const [visible, setVisible] = useState(false); return ( <SafeAreaView> <RootSiblingPortal> <Drawer isOpen={visible} onChange={(isOpen) => setVisible(isOpen)} > {/* SafeAreaView 这样做是有必要的,因为手机时间是需要与内容分开的,除非你并不需要 */} <SafeAreaView> <Text>左边打开抽屉内容</Text> </SafeAreaView> </Drawer> </RootSiblingPortal> <Button onPress={() => setVisible(!visible)}>左边打开抽屉</Button> </SafeAreaView> ); } ``` ### props | 参数 | 说明 | 类型 | 默认值 | |------|------|-----|------| | `isOpen` | 是否可见 | Boollean | `false` | | `placement` | 抽屉的方向 | `right`, `left` , `top` `bottom`| `left` | | `drawerWidth` | 抽屉宽度(`placement`为`right`或`left`生效) | Number | `300` | | `drawerHeight` | 抽屉高度(`placement`为`top`或`bottom`生效) | Number | `500` | | `style` | 设置 `Drawer` 样式 | ViewStyle | - | | `maskProps` | 遮罩层样式 | ViewStyle | - | | `maskClosable` | 点击遮罩层是否允许关闭 | Boollean | `true` | | `drawerBackgroundColor` | 指定抽屉背景色 | String | `#fff` | | `onChange` | open 状态切换时调用 | (isOpen: boolean): void | - | | `openDrawer` | 打开函数 | (isOpen: boolean): void | - | | `closeDrawer` | 关闭函数 | (isOpen: boolean): void | - |