[breaking change] Popup: rewrite

This commit is contained in:
陈嘉涵 2018-08-03 14:39:04 +08:00
parent 67862f03dc
commit 63c52edf2d
9 changed files with 265 additions and 190 deletions

View File

@ -1,40 +1,40 @@
Page({ Page({
data: { data: {
showPopup: false, show: {
showLeftPopup: false, middle: false,
showRightPopup: false, top: false,
showTopPopup: false, bottom: false,
showBottomPopup: false right: false,
right2: false
}
},
toggle(type) {
this.setData({
[`show.${type}`]: !this.data.show[type]
});
}, },
togglePopup() { togglePopup() {
this.setData({ this.toggle('middle');
showPopup: !this.data.showPopup
});
},
toggleLeftPopup() {
this.setData({
showLeftPopup: !this.data.showLeftPopup
});
}, },
toggleRightPopup() { toggleRightPopup() {
this.setData({ this.toggle('right');
showRightPopup: !this.data.showRightPopup },
});
toggleRightPopup2() {
this.toggle('right2');
}, },
toggleBottomPopup() { toggleBottomPopup() {
this.setData({ this.toggle('bottom');
showBottomPopup: !this.data.showBottomPopup
});
}, },
toggleTopPopup() { toggleTopPopup() {
this.setData({ this.toggle('top');
showTopPopup: !this.data.showTopPopup setTimeout(() => {
}); this.toggle('top');
}, 2000);
} }
}); });

View File

@ -1,8 +1,8 @@
{ {
"navigationBarTitleText": "Popup 弹出层", "navigationBarTitleText": "Popup 弹出层",
"usingComponents": { "usingComponents": {
"demo-block": "../../components/demo-block/index",
"van-popup": "../../dist/popup/index", "van-popup": "../../dist/popup/index",
"van-button": "../../dist/button/index" "van-button": "../../dist/button/index"
} }
} }

View File

@ -1,84 +1,54 @@
<van-button class="van-button" bind:tap="togglePopup"> <demo-block title="基础用法" padding>
弹出popup <van-button bind:tap="togglePopup">弹出 Popup</van-button>
</van-button> <van-popup
<van-button class="van-button" bind:tap="toggleTopPopup"> show="{{ show.middle }}"
从顶部弹出popup custom-class="center"
</van-button> bind:close="togglePopup"
<van-button class="van-button" bind:tap="toggleBottomPopup"> >
从底部弹出popup 内容
</van-button> </van-popup>
<van-button class="van-button" bind:tap="toggleLeftPopup"> </demo-block>
从左边弹出popup
</van-button>
<van-button class="van-button" bind:tap="toggleRightPopup">
从右边弹出popup
</van-button>
<!-- 中间弹出框 --> <demo-block title="弹出位置" padding>
<van-popup <van-button bind:tap="toggleBottomPopup" custom-class="demo-margin-right">底部弹出</van-button>
show="{{ showPopup }}"
bindclose="togglePopup"
>
<view class="pop-example__container">
<view class="van-buttons">
<button class="van-button" bindtap="togglePopup">
关闭 popup
</button>
</view>
</view>
</van-popup>
<!-- 左侧弹出框 --> <van-popup
<van-popup show="{{ show.bottom }}"
show="{{ showLeftPopup }}" position="bottom"
type="left" custom-class="bottom"
bindclose="toggleLeftPopup" bind:close="toggleBottomPopup"
> >
<view class="pop-example__container pop-example__container--left"> 内容
<view class="van-buttons"> </van-popup>
<button class="van-button" bindtap="toggleLeftPopup">
关闭 popup
</button>
</view>
</view>
</van-popup>
<!-- 右侧弹出框 --> <van-button bind:tap="toggleTopPopup" custom-class="demo-margin-right">顶部弹出</van-button>
<van-popup <van-popup
show="{{ showRightPopup }}" show="{{ show.top }}"
type="right" position="top"
bindclose="toggleRightPopup"
>
<view class="pop-example__container pop-example__container--right">
<view class="van-buttons">
<button class="van-button" catchtap="toggleRightPopup">
关闭 popup
</button>
</view>
</view>
</van-popup>
<!-- 顶部弹出框 -->
<van-popup
show="{{ showTopPopup }}"
overlay="{{ false }}" overlay="{{ false }}"
type="top" custom-class="top"
bindclose="toggleTopPopup" bind:close="toggleTopPopup"
> >
<view class="pop-example--top">内容</view> 内容
</van-popup> </van-popup>
<!-- 底部弹出框 --> <van-button bind:tap="toggleRightPopup">右侧弹出</van-button>
<van-popup <van-popup
show="{{ showBottomPopup }}" show="{{ show.right }}"
type="bottom" position="right"
bindclose="toggleBottomPopup" custom-class="right"
> bind:close="toggleRightPopup"
<view class="pop-example__container pop-example__container--bottom"> >
<view class="van-buttons"> <van-button bind:tap="toggleRightPopup" custom-class="demo-margin-right">关闭弹层</van-button>
<button class="van-button" catchtap="toggleBottomPopup">
关闭 popup <van-button bind:tap="toggleRightPopup2">右侧弹出</van-button>
</button> <van-popup
</view> show="{{ show.right2 }}"
</view> position="right"
</van-popup> custom-class="right"
bind:close="toggleRightPopup2"
>
<van-button bind:tap="toggleRightPopup2">关闭弹层</van-button>
</van-popup>
</van-popup>
</demo-block>

View File

@ -1,21 +1,32 @@
.pop-example--top { :host {
width: 100vw; font-size: 16px;
padding: 15px; }
background: rgba(0, 0, 0, 0.7);
color: #fff; .center {
font-size: 12px; width: 60%;
padding: 20px;
text-align: center; text-align: center;
box-sizing: border-box;
} }
.pop-example__container { .top {
overflow: hidden; color: #fff;
background: #fff; width: 100%;
padding: 20px;
border-radius: 0;
line-height: 20px;
background-color: rgba(0, 0, 0, 0.8)!important;
} }
.pop-example__container--bottom { .bottom {
width: 100vw; width: 100%;
padding: 20px;
line-height: 100px;
background-color: #fff;
} }
.pop-example__container--left, .pop-example__container--right { .right {
height: 100vh; width: 100%;
height: 100%;
padding: 20px;
} }

View File

@ -3,62 +3,65 @@
### 使用指南 ### 使用指南
在 index.json 中引入组件 在 index.json 中引入组件
```json ```json
{ "usingComponents": {
"usingComponents": {
"van-popup": "path/to/vant-weapp/dist/popup/index" "van-popup": "path/to/vant-weapp/dist/popup/index"
}
} }
``` ```
### 代码演示 ### 代码演示
可以在页面任意位置上使用 van-popup 标签。通过 show 可以控制弹窗是否展示
```html
<van-popup show="{{ show }}"></van-popup>
```
#### popup 动画
popup 额外支持了 上下左右 四种动画方式,通过增加 type 属性即可控制。使用方式如下
```html
<!-- 从底部弹出的弹层 -->
<van-popup type="bottom" show="{{ show }}"></van-popup>
<!-- 从顶部弹出的弹层 --> #### 基础用法
<van-popup type="top" show="{{ show }}"></van-popup> `popup`默认从中间弹出
<!-- 从左侧弹出的弹层 -->
<van-popup type="left" show="{{ show }}"></van-popup>
<!-- 从右侧弹出的弹层 -->
<van-popup type="right" show="{{ show }}"></van-popup>
```
#### 控制显示,隐藏
```html ```html
<van-popup show="{{ isShow }}" bindclose="togglePopup"></van-popup> <van-popup show="{{ show }}" bind:close="onClose">内容</van-popup>
``` ```
```js ```javascript
data: { Page({
isShow: false data: {
}, show: false
togglePopup() { },
this.setData({
isShow: !this.data.isShow onClose() {
}); this.setData({ show: false });
} }
});
``` ```
### 具体参数和事件 #### 弹出位置
#### 参数说明 通过`position`属性设置 Popup 弹出位置
| 参数 | 说明 | 类型 | 默认值 | 必须 |
|-----------|-----------|-----------|-------------|-------------| ```html
| show | 是否显示弹出层 | Boolean | false | | <van-popup
| overlay | 是否显示遮罩层 | Boolean | true | | show="{{ show }}"
| closeOnClickOverlay | 遮罩层点击时,是否触发关闭事件 | Boolean | true | | position="top"
| type | 弹出层动画方式, 可选`center`, `left`, `right`, `top`, `bottom` | String | center | | overlay="{{ false }}"
bind:close="onClose"
>
内容
</van-popup>
```
### API
| 参数 | 说明 | 类型 | 默认值 |
|-----------|-----------|-----------|-------------|
| show | 当前组件是否显示 | `Boolean` | `false` |
| overlay | 是否显示背景蒙层 | `Boolean` | `true` |
| position | 可选值为 `top` `bottom` `right` `left` | `String` | - |
| overlay-style | 自定义蒙层样式 | `Object` | `` |
| close-on-click-overlay | 点击蒙层是否关闭 Popup | `Boolean` | `true` |
### Event
#### 事件说明
| 事件名 | 说明 | 参数 | | 事件名 | 说明 | 参数 |
|-----------|-----------|-----------| |-----------|-----------|-----------|
| click-overlay | 遮罩层点击触发 | | | click-overlay | 点击蒙层时触发 | - |
| close | 遮罩层关闭时触发 | | | close | 蒙层关闭时触发 | - |
### 外部样式类
| 类名 | 说明 |
|-----------|-----------|
| custom-class | 根节点样式类 |
| overlay-class | 蒙层样式类 |

View File

@ -1,35 +1,33 @@
Component({ Component({
properties: { externalClasses: [
show: { 'custom-class',
type: Boolean, 'overlay-class'
value: false ],
},
properties: {
show: Boolean,
overlayStyle: String,
overlay: { overlay: {
type: Boolean, type: Boolean,
value: true value: true
}, },
closeOnClickOverlay: { closeOnClickOverlay: {
type: Boolean, type: Boolean,
value: true value: true
}, },
position: {
// 弹出方向
type: {
type: String, type: String,
value: 'center' value: 'center'
} }
}, },
methods: { methods: {
handleMaskClick() { onClickOverlay() {
this.triggerEvent('click-overlay', {}); this.triggerEvent('click-overlay');
if (!this.data.closeOnClickOverlay) { if (this.data.closeOnClickOverlay) {
return; this.triggerEvent('close');
} }
this.triggerEvent('close', {});
} }
} }
}); });

View File

@ -1,6 +1,3 @@
{ {
"component": true, "component": true
"usingComponents": {
"pop-manager": "../common/pop-manager/index"
}
} }

95
packages/popup/index.pcss Normal file
View File

@ -0,0 +1,95 @@
@import '../common/index.pcss';
.van-popup {
top: 50%;
left: 50%;
z-index: 11;
max-height: 100%;
overflow-y: auto;
box-sizing: border-box;
background-color: $white;
-webkit-overflow-scrolling: touch;
transform: translate3d(-50%, -50%, 0);
&,
&__overlay {
display: none;
position: fixed;
animation: van-fade-in .3s ease;
}
&__overlay {
width: 100%;
height: 100%;
top: 0;
left: 0;
z-index: 10;
background-color: rgba(0, 0, 0, 0.7);
}
&--top {
width: 100%;
top: 0;
right: auto;
bottom: auto;
left: 50%;
transform: translate3d(-50%, 0, 0);
animation-name: van-popup-top;
}
&--right {
top: 50%;
right: 0;
bottom: auto;
left: auto;
transform: translate3d(0, -50%, 0);
animation-name: van-popup-right;
}
&--bottom {
width: 100%;
top: auto;
bottom: 0;
right: auto;
left: 50%;
transform: translate3d(-50%, 0, 0);
animation-name: van-popup-bottom;
}
&--left {
top: 50%;
right: auto;
bottom: auto;
left: 0;
transform: translate3d(0, -50%, 0);
animation-name: van-popup-left;
}
&--show {
display: block;
}
}
@keyframes van-popup-top {
from {
transform: translate3d(-50%, -100%, 0);
}
}
@keyframes van-popup-bottom {
from {
transform: translate3d(-50%, 100%, 0);
}
}
@keyframes van-popup-left {
from {
transform: translate3d(-100%, -50%, 0);
}
}
@keyframes van-popup-right {
from {
transform: translate3d(100%, -50%, 0);
}
}

View File

@ -1,8 +1,9 @@
<pop-manager <view
show="{{ show }}" wx:if="{{ overlay }}"
type="{{ type }}" class="overlay-class van-popup__overlay {{ show ? 'van-popup--show' : '' }}"
show-overlay="{{ overlay }}" style="{{ overlayStyle }}"
bindclickmask="handleMaskClick" bind:tap="onClickOverlay"
> />
<slot></slot> <view class="custom-class van-popup {{ position ? 'van-popup--' + position : '' }} {{ show ? 'van-popup--show' : '' }}">
</pop-manager> <slot />
</view>