feat(NavBar): add safe-area-inset-top prop

This commit is contained in:
chenjiahan 2020-11-08 16:14:40 +08:00 committed by neverland
parent f07d8e6709
commit be25a478df
6 changed files with 79 additions and 38 deletions

View File

@ -63,6 +63,7 @@ export default {
| fixed | Whether to fixed top | _boolean_ | `false` |
| placeholder `v2.5.9` | Whether to generage a placeholder element when fixed | _boolean_ | `false` |
| z-index | Z-index | _number \| string_ | `1` |
| safe-area-inset-top `v2.10.13` | Whether to enable top safe area adaptation | _boolean_ | `false` |
### Slots

View File

@ -64,7 +64,8 @@ export default {
| border | 是否显示下边框 | _boolean_ | `true` |
| fixed | 是否固定在顶部 | _boolean_ | `false` |
| placeholder `v2.5.9` | 固定在顶部时,是否在标签位置生成一个等高的占位元素 | _boolean_ | `false` |
| z-index | 元素 z-index | _number \| string_ | `1` |
| z-index | 导航栏 z-index | _number \| string_ | `1` |
| safe-area-inset-top `v2.10.13` | 是否开启顶部安全区适配 | _boolean_ | `false` |
### Slots

View File

@ -16,6 +16,7 @@ export default createComponent({
rightText: String,
leftArrow: Boolean,
placeholder: Boolean,
safeAreaInsetTop: Boolean,
border: {
type: Boolean,
default: true,
@ -65,17 +66,31 @@ export default createComponent({
<div
ref="navBar"
style={{ zIndex: this.zIndex }}
class={[bem({ fixed: this.fixed }), { [BORDER_BOTTOM]: this.border }]}
class={[
bem({
fixed: this.fixed,
'safe-area-inset-top': this.safeAreaInsetTop,
}),
{
[BORDER_BOTTOM]: this.border,
},
]}
>
{this.hasLeft() && <div class={bem('left')} onClick={this.onClickLeft}>
<div class={bem('content')}>
{this.hasLeft() && (
<div class={bem('left')} onClick={this.onClickLeft}>
{this.genLeft()}
</div>}
</div>
)}
<div class={[bem('title'), 'van-ellipsis']}>
{this.slots('title') || this.title}
</div>
{this.hasRight() && <div class={bem('right')} onClick={this.onClickRight}>
{this.hasRight() && (
<div class={bem('right')} onClick={this.onClickRight}>
{this.genRight()}
</div>}
</div>
)}
</div>
</div>
);
},

View File

@ -1,25 +1,12 @@
@import '../style/var';
.van-nav-bar {
position: relative;
z-index: @nav-bar-z-index;
display: flex;
align-items: center;
height: @nav-bar-height;
line-height: 1.5;
text-align: center;
background-color: @nav-bar-background-color;
user-select: none;
.van-icon {
color: @nav-bar-icon-color;
}
&__arrow {
margin-right: @padding-base;
font-size: @nav-bar-arrow-size;
}
&--fixed {
position: fixed;
top: 0;
@ -27,6 +14,27 @@
width: 100%;
}
&--safe-area-inset-top {
padding-top: constant(safe-area-inset-bottom);
padding-top: env(safe-area-inset-bottom);
}
.van-icon {
color: @nav-bar-icon-color;
}
&__content {
position: relative;
display: flex;
align-items: center;
height: @nav-bar-height;
}
&__arrow {
margin-right: @padding-base;
font-size: @nav-bar-arrow-size;
}
&__title {
max-width: 60%;
margin: 0 auto;

View File

@ -1,23 +1,29 @@
// Jest Snapshot v1, https://goo.gl/fbAQLP
exports[`placeholder prop 1`] = `
<div class="van-nav-bar__placeholder" style="height: 50px;">
<div class="van-nav-bar van-nav-bar--fixed van-hairline--bottom">
<div class="van-nav-bar__title van-ellipsis"></div>
</div>
</div>
`;
exports[`render left & right slot 1`] = `
exports[`should allow render left/right slot 1`] = `
<div class="van-nav-bar van-hairline--bottom">
<div class="van-nav-bar__content">
<div class="van-nav-bar__left">Custom Left</div>
<div class="van-nav-bar__title van-ellipsis"></div>
<div class="van-nav-bar__right">Custom Right</div>
</div>
`;
exports[`render title slot 1`] = `
<div class="van-nav-bar van-hairline--bottom">
<div class="van-nav-bar__title van-ellipsis">Custom Title</div>
</div>
`;
exports[`should allow render title slot 1`] = `
<div class="van-nav-bar van-hairline--bottom">
<div class="van-nav-bar__content">
<div class="van-nav-bar__title van-ellipsis">Custom Title</div>
</div>
</div>
`;
exports[`should render placeholder element when enabling placeholder prop 1`] = `
<div class="van-nav-bar__placeholder" style="height: 50px;">
<div class="van-nav-bar van-nav-bar--fixed van-hairline--bottom">
<div class="van-nav-bar__content">
<div class="van-nav-bar__title van-ellipsis"></div>
</div>
</div>
</div>
`;

View File

@ -1,7 +1,7 @@
import NavBar from '..';
import { mount, mockGetBoundingClientRect } from '../../../test';
test('render left & right slot', () => {
test('should allow render left/right slot', () => {
const wrapper = mount(NavBar, {
scopedSlots: {
left: () => 'Custom Left',
@ -12,7 +12,7 @@ test('render left & right slot', () => {
expect(wrapper).toMatchSnapshot();
});
test('render title slot', () => {
test('should allow render title slot', () => {
const wrapper = mount(NavBar, {
scopedSlots: {
title: () => 'Custom Title',
@ -22,7 +22,7 @@ test('render title slot', () => {
expect(wrapper).toMatchSnapshot();
});
test('placeholder prop', () => {
test('should render placeholder element when enabling placeholder prop', () => {
const restore = mockGetBoundingClientRect({ height: 50 });
const wrapper = mount(NavBar, {
@ -37,7 +37,7 @@ test('placeholder prop', () => {
restore();
});
test('click-left event', () => {
test('should emit click-left event when clicking left text', () => {
const wrapper = mount(NavBar, {
propsData: {
leftText: 'left',
@ -48,7 +48,7 @@ test('click-left event', () => {
expect(wrapper.emitted('click-left')).toBeTruthy();
});
test('click-right event', () => {
test('should emit click-right event when clicking right text', () => {
const wrapper = mount(NavBar, {
propsData: {
rightText: 'right',
@ -58,3 +58,13 @@ test('click-right event', () => {
wrapper.find('.van-nav-bar__right').trigger('click');
expect(wrapper.emitted('click-right')).toBeTruthy();
});
test('should add safe-area-inset-top classname when using safe-area-inset-top prop', () => {
const wrapper = mount(NavBar, {
propsData: {
safeAreaInsetTop: true,
},
});
expect(wrapper.contains('.van-nav-bar--safe-area-inset-top')).toBeTruthy();
});