@ray-js/smart-ui
Version:
轻量、可靠的智能小程序 UI 组件库
410 lines (348 loc) • 14.4 kB
Markdown
---
category: 导航
---
# NavBar 导航栏
### 介绍
为页面提供导航功能,常用于页面顶部。
### 引入
```jsx
import { NavBar } from '@ray-js/smart-ui';
```
## 代码演示
### 首页
首页的文本样式默认左对齐并加粗,点击左侧文本时触发事件;background `v2.7.0` 属性可以设置 nav-bar 的背景色。
通过 `slot="left"` 可在左侧区域插入自定义内容(如图标),插入的内容使用 `margin-left: auto` 可在不脱离文档流的情况下在左侧容器内居右排列 `v2.12.0`。
```jsx
import { showToast } from '@ray-js/ray';
import { Icon, NavBar } from '@ray-js/smart-ui';
import React from 'react';
export default function Demo() {
const onClickLeftText = React.useCallback(event => {
showToast({ title: '点击左侧文本', icon: 'none' });
}, []);
return (
<>
<NavBar leftText="Home" leftTextType="home" onClickLeftText={onClickLeftText} />
<NavBar
background="#E4EDFF"
customClass="demo-nav-bar"
leftText="HomeHomeHomeHomeHome"
leftTextType="home"
onClickLeftText={onClickLeftText}
/>
<NavBar
background="#E4EDFF"
customClass="demo-nav-bar"
leftText="HomeHomeHomeHomeHome"
leftTextType="home"
onClickLeftText={onClickLeftText}
slot={{
left: (
<Icon
style={{ marginLeft: 'auto', paddingLeft: '16px' }}
name="https://images.tuyacn.com/content-platform/hestia/1729664215ebd89f13e54.png"
size="24px"
/>
),
}}
/>
</>
);
}
```
### 二级页面-单图标
当中间标题内容比较长,且两侧内容较少时可以设置 `v2.7.3` `sideWidth` 为 `min`。
```jsx
import { showToast } from '@ray-js/ray';
import { NavBar } from '@ray-js/smart-ui';
import React from 'react';
import iconMore from '@tuya-miniapp/icons/dist/svg/More';
export default function Demo() {
const onClickLeft = React.useCallback(event => {
showToast({ title: '点击返回', icon: 'none' });
}, []);
const onClickTitle = React.useCallback(event => {
showToast({ title: '点击中央文本', icon: 'none' });
}, []);
const onClickRight = React.useCallback(event => {
showToast({ title: '点击右侧', icon: 'none' });
}, []);
return (
<NavBar
title="ScheduleScheduleScheduleSchedule"
leftArrow
rightIcon={iconMore}
sideWidth="min"
rightIconSize="24px"
onClickRight={onClickRight}
onClickLeft={onClickLeft}
onClickTitle={onClickTitle}
/>
);
}
```
### 二级页面-常见场景
展示二级页面的常见使用场景,包括使用插槽自定义右侧内容、左右文本按钮等。
```jsx
import { showToast } from '@ray-js/ray';
import { Icon, NavBar } from '@ray-js/smart-ui';
import React from 'react';
import iconMore from '@tuya-miniapp/icons/dist/svg/More';
import iconHouse from '@tuya-miniapp/icons/dist/svg/House';
export default function Demo() {
const onClickLeft = React.useCallback(event => {
showToast({ title: '点击返回', icon: 'none' });
}, []);
const onClickTitle = React.useCallback(event => {
showToast({ title: '点击中央文本', icon: 'none' });
}, []);
const onClickRight = React.useCallback(event => {
showToast({ title: '点击右侧', icon: 'none' });
}, []);
const onClickRightText = React.useCallback(event => {
showToast({ title: '点击右侧文本', icon: 'none' });
}, []);
const onClickLeftText = React.useCallback(event => {
showToast({ title: '点击左侧文本', icon: 'none' });
}, []);
return (
<>
<NavBar
title="ScheduleScheduleScheduleSchedule"
leftArrow
rightIcon={iconMore}
rightIconSize="24px"
sideWidth="mid"
onClickRight={onClickRight}
onClickLeft={onClickLeft}
onClickTitle={onClickTitle}
slot={{
right: <Icon size="24px" customStyle={{ marginRight: '16px' }} name={iconHouse} />,
}}
/>
<NavBar
title="ScheduleScheduleScheduleSchedule"
rightText="Confirm"
leftText="Cancel"
sideWidth="mid"
customClass="demo-nav-bar"
rightTextColor="#F04C4C"
onClickRightText={onClickRightText}
onClickLeftText={onClickLeftText}
onClickTitle={onClickTitle}
/>
<NavBar
title="ScheduleScheduleScheduleSchedule"
leftArrow
rightText="Confirm"
sideWidth="mid"
customClass="demo-nav-bar"
rightTextColor="#F04C4C"
onClickRightText={onClickRightText}
onClickLeft={onClickLeft}
onClickTitle={onClickTitle}
/>
</>
);
}
```
### 二级页面-短标题
当两侧操作内容较多时可以设置 `sideWidth` `v2.7.3` 为 `max`,减小中间标题区域的大小。
```jsx
import { showToast } from '@ray-js/ray';
import { NavBar } from '@ray-js/smart-ui';
import React from 'react';
export default function Demo() {
const onClickLeft = React.useCallback(event => {
showToast({ title: '点击返回', icon: 'none' });
}, []);
const onClickTitle = React.useCallback(event => {
showToast({ title: '点击中央文本', icon: 'none' });
}, []);
const onClickRightText = React.useCallback(event => {
showToast({ title: '点击右侧文本', icon: 'none' });
}, []);
const onClickLeftText = React.useCallback(event => {
showToast({ title: '点击左侧文本', icon: 'none' });
}, []);
return (
<>
<NavBar
title="ScheduleSchedule"
leftArrow
sideWidth="max"
onClickLeft={onClickLeft}
onClickTitle={onClickTitle}
/>
<NavBar
title="ScheduleSchedule"
leftText="Abbrechen"
rightText="Speichern"
customClass="demo-nav-bar"
rightTextColor="#F04C4C"
sideWidth="max"
onClickLeftText={onClickLeftText}
onClickTitle={onClickTitle}
onClickRightText={onClickRightText}
/>
<NavBar
title="ScheduleSchedule"
leftArrow
rightText="Speichern"
rightTextColor="#F04C4C"
sideWidth="max"
customClass="demo-nav-bar"
onClickLeft={onClickLeft}
onClickTitle={onClickTitle}
onClickRightText={onClickRightText}
/>
</>
);
}
```
### 自定义宽度
`sideWidth` 也支持传如 `100`、`'100px'`、`'100rpx'` 去自定义两边的宽度。
```jsx
import { showToast } from '@ray-js/ray';
import { NavBar } from '@ray-js/smart-ui';
import React from 'react';
import iconMore from '@tuya-miniapp/icons/dist/svg/More';
export default function Demo() {
const onClickLeft = React.useCallback(event => {
showToast({ title: '点击返回', icon: 'none' });
}, []);
const onClickTitle = React.useCallback(event => {
showToast({ title: '点击中央文本', icon: 'none' });
}, []);
const onClickRight = React.useCallback(event => {
showToast({ title: '点击右侧', icon: 'none' });
}, []);
return (
<NavBar
title="ScheduleScheduleScheduleSchedule"
leftArrow
sideWidth="100px"
rightIcon={iconMore}
rightIconSize="24px"
onClickRight={onClickRight}
onClickLeft={onClickLeft}
onClickTitle={onClickTitle}
/>
);
}
```
### 左标题
部分二级页面标题位于左侧,或同时附带 icon。
```jsx
import { showToast } from '@ray-js/ray';
import { NavBar } from '@ray-js/smart-ui';
import React from 'react';
export default function Demo() {
const onClickLeft = React.useCallback(event => {
showToast({ title: '点击返回', icon: 'none' });
}, []);
const onClickLeftIcon = React.useCallback(event => {
showToast({ title: '点击左侧图标', icon: 'none' });
}, []);
const onClickLeftText = React.useCallback(event => {
showToast({ title: '点击左侧文本', icon: 'none' });
}, []);
const onClickRight = React.useCallback(event => {
showToast({ title: '点击右侧', icon: 'none' });
}, []);
return (
<NavBar
leftText="Home"
leftTextType="title"
leftIcon="https://images.tuyacn.com/content-platform/hestia/1729664215ebd89f13e54.png"
onClickLeft={onClickLeft}
onClickLeftIcon={onClickLeftIcon}
onClickLeftText={onClickLeftText}
onClickRight={onClickRight}
/>
);
}
```
## API
### Props
| 参数 | 说明 | 类型 | 默认值 |
| ------------------- | ---------------------------------- | --------- | ------- |
| border | 是否显示下边框 | _boolean_ | `true` `v2.0.0` `false` `v2.7.0` |
| customStyle | 根节点自定义样式 | _React.CSSProperties_ | - |
| fixed | 是否固定在顶部 | _boolean_ | `false` |
| leftArrow | 是否显示左侧箭头 | _boolean_ | `false` |
| leftArrowAriaLabel `v2.13.0` | 左侧返回箭头的无障碍读屏文案 | _string_ | - |
| leftText | 左侧文案 | _string_ | `''` |
| leftTextType `v2.0.0` | 左侧文本的样式类型,范围为 `home`、`title`、`back` | _string_ | `back` |
| leftIcon `v2.0.0` | 左侧 Icon | _string_ | `''` |
| leftIconAriaLabel `v2.13.0` | 左侧图标按钮的无障碍读屏文案 | _string_ | - |
| leftIconSize `v2.0.0` | 左侧 Icon 大小,默认为 32 | _string \| number_ | `32` |
| round `v2.1.0` | 是否显示圆角 | _boolean_ | `false` |
| placeholder | 固定在顶部时是否开启占位 | _boolean_ | `false` |
| rightText | 右侧文案 | _string_ | `''` |
| safeAreaInsetTop | 是否留出顶部安全距离(状态栏高度) | _boolean_ | `true` |
| title | 标题 | _string_ | `''` |
| zIndex | 元素 z-index | _number_ | `1` |
| rightTextColor `v2.7.0` | 右侧文案的颜色 | _string_ | - |
| rightIcon `v2.7.0` | 右侧图标 | _string_ | - |
| rightIconAriaLabel `v2.13.0` | 右侧图标按钮的无障碍读屏文案 | _string_ | - |
| rightIconColor `v2.7.0` | 右侧图标颜色 | _string_ | - |
| rightIconSize `v2.7.0` | 右侧图标大小 | _number_ | `32px` |
| leftIconColor `v2.7.0` | 左侧图标颜色 (非返回 icon) | _string_ | - |
| background `v2.7.0` | 整体背景色 | _string_ | - |
| sideWidth `v2.7.3` | 两边控制栏的宽度, 提供 `min`、`mid`、`max`三档内置值;也可以传具体宽度值 | _string\/number\/`min`\/`mid`\/`max`_ | `mid` `v2.7.3` `max` `v2.9.0` |
### Slot
| 名称 | 说明 |
| ----- | ------------------ |
| left | 自定义左侧区域内容 |
| right | 自定义右侧区域内容 |
| title | 自定义标题 |
### Events
| 事件名 | 说明 | 参数 |
| ---------------- | ------------------ | ---- |
| onClickLeft | 点击左侧返回 icon 时触发 | - |
| onClickRight | 点击右侧按钮时触发 | - |
| onClickTitle `v2.0.0` | 点击中央标题时触发 | - |
| onClickLeftIcon `v2.0.0` | 点击左侧 icon 时触发(非返回 icon) | - |
| onClickLeftText `v2.0.0` | 点击左侧文本时触发 | - |
| onClickRightIcon `v2.7.0` | 点击右侧图标时触发 | - |
| onClickRightText `v2.7.0` | 点击右侧文本时触发 | - |
### 外部样式类
| 类名 | 说明 |
| ------------ | ------------ |
| customClass | 根节点样式类 |
| titleClass | 标题样式类 |
| leftIconClass `v2.0.0` | 左侧图标样式类 |
| rightTextClass `v2.1.0` | 右侧文字样式类 |
| rightIconClass `v2.7.0` | 右侧图标样式类 |
| leftTextClass `v2.7.0` | 左侧文字样式类 |
### 样式变量
组件提供了下列 CSS 变量,可用于自定义样式,使用方法请参考 [ConfigProvider 组件](/material/smartui?comId=config-provider)。
| 名称 | 默认值 | 描述 |
| ----------------------------- | -------------------------------------- | ---- |
| --nav-bar-height | _var(--app-device-navbar-height, 46px)_ | 导航栏高度 |
| --nav-bar-round-min-height `v2.1.0` | _56px_ | 导航栏圆角存在时的最小高度 |
| --nav-bar-round-border-radius `v2.1.0` | _16px 16px 0px 0px_ | 是否显示导航栏圆角 |
| --nav-bar-background-color | _var(--app-B2, #ffffff)_ | 导航栏背景色 |
| --nav-bar-arrow-color | _var(--app-B2-N1, rgba(0, 0, 0, 1))_ | 导航栏箭头颜色 |
| --nav-bar-icon-size `@deprecated v2.7.0` | _32px_ | 导航栏图标大小 |
| --nav-bar-icon-color | _var(--app-B2-N1, rgba(0, 0, 0, 1))_ | 导航栏图标颜色 |
| --nav-bar-icon-margin `@deprecated v2.7.0` | _0_ | 导航栏图标外边距 |
| --nav-bar-text-font-size `v2.1.0` | _16px_ `v2.1.0` _17px_ `v2.7.3` | 导航栏侧边文字大小 |
| --nav-bar-text-font-weight `v2.7.0` | _600_ `v2.7.0` _normal_ `v2.7.3` | 导航栏侧边文字字体字重 |
| --nav-bar-text-color | _var(--app-B2-N2, rgba(0, 0, 0, 1))_ | 导航栏文字颜色 |
| --nav-bar-title-font-size | _17px_ | 导航栏标题文字大小 |
| --nav-bar-title-font-weight | _600_ | 导航栏标题字重 |
| --nav-bar-title-text-color | _var(--app-B2-N1, rgba(0, 0, 0, 1))_ | 导航栏标题文字颜色 |
| --nav-bar-home-font-size | _22px_ | 导航栏首页文字大小 |
| --nav-bar-home-font-weight | _600_ | 导航栏首页字重 |
| --nav-bar-home-text-color | _var(--app-B2-N1, rgba(0, 0, 0, 1))_ | 导航栏首页文字颜色 |
| --nav-bar-right-text-color `v2.5.1` | _var(--app-B2-N1, rgba(0, 0, 0, 1))_ | 导航栏右侧文字颜色 |
| --nav-bar-title-max-width `v2.6.0` | _56%_ `v2.6.0` _calc(100% - 98px - 16px)_ `v2.7.0` | 导航栏标题的宽度 |
| --nav-bar-side-width `v2.7.0` | _98px_ `v2.7.0` _80px_ `v2.7.3` | 两边默认宽度 |
| --nav-bar-text-padding `v2.7.0` | _20px_ `v2.7.0` _16px_ `v2.7.3` | 两边文字内边距 |
| --nav-bar-icon-padding `v2.7.0` | _16px_ | 两边图标内边距 |
| --nav-bar-title-margin `v2.7.0` | _16px_ | 标题外边距 |
| --nav-bar-home-max-width `v2.7.0` | _calc(100% - 98px - 16px)_ | 小程序首页时左侧标题最大宽度 |
| --nav-bar-side-width-min `v2.7.3` | _40px_ | 侧边min时宽度 |
| --nav-bar-side-width-max `v2.7.3` | _105px_ | 侧边max时宽度 |