u-action-sheet.vue 9.62 KB
Newer Older
潘永坪's avatar
潘永坪 committed
1

潘永坪's avatar
潘永坪 committed
2
<template>
潘永坪's avatar
潘永坪 committed
3 4 5 6 7 8 9 10 11 12 13
	<u-popup
	    :show="show"
	    mode="bottom"
	    @close="closeHandler"
	    :safeAreaInsetBottom="safeAreaInsetBottom"
	    :round="round"
	>
		<view class="u-action-sheet">
			<view
			    class="u-action-sheet__header"
			    v-if="title"
潘永坪's avatar
潘永坪 committed
14
			>
潘永坪's avatar
潘永坪 committed
15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103
				<text class="u-action-sheet__header__title u-line-1">{{title}}</text>
				<view
				    class="u-action-sheet__header__icon-wrap"
				    @tap.stop="cancel"
				>
					<u-icon
					    name="close"
					    size="17"
					    color="#c8c9cc"
					    bold
					></u-icon>
				</view>
			</view>
			<text
			    class="u-action-sheet__description"
				:style="[{
					marginTop: `${title && description ? 0 : '18px'}`
				}]"
			    v-if="description"
			>{{description}}</text>
			<slot>
				<u-line v-if="description"></u-line>
				<view class="u-action-sheet__item-wrap">
					<template v-for="(item, index) in actions">
						<!-- #ifdef MP -->
						<button
						    :key="index"
						    class="u-reset-button"
						    :openType="item.openType"
						    @getuserinfo="onGetUserInfo"
						    @contact="onContact"
						    @getphonenumber="onGetPhoneNumber"
						    @error="onError"
						    @launchapp="onLaunchApp"
						    @opensetting="onOpenSetting"
						    :lang="lang"
						    :session-from="sessionFrom"
						    :send-message-title="sendMessageTitle"
						    :send-message-path="sendMessagePath"
						    :send-message-img="sendMessageImg"
						    :show-message-card="showMessageCard"
						    :app-parameter="appParameter"
						    @tap="selectHandler(index)"
						    :hover-class="!item.disabled && !item.loading ? 'u-action-sheet--hover' : ''"
						>
							<!-- #endif -->
							<view
							    class="u-action-sheet__item-wrap__item"
							    @tap.stop="selectHandler(index)"
							    :hover-class="!item.disabled && !item.loading ? 'u-action-sheet--hover' : ''"
							    :hover-stay-time="150"
							>
								<template v-if="!item.loading">
									<text
									    class="u-action-sheet__item-wrap__item__name"
									    :style="[itemStyle(index)]"
									>{{ item.name }}</text>
									<text
									    v-if="item.subname"
									    class="u-action-sheet__item-wrap__item__subname"
									>{{ item.subname }}</text>
								</template>
								<u-loading-icon
								    v-else
								    custom-class="van-action-sheet__loading"
								    size="18"
								    mode="circle"
								/>
							</view>
							<!-- #ifdef MP -->
						</button>
						<!-- #endif -->
						<u-line v-if="index !== actions.length - 1"></u-line>
					</template>
				</view>
			</slot>
			<u-gap
			    bgColor="#eaeaec"
			    height="6"
			    v-if="cancelText"
			></u-gap>
			<view hover-class="u-action-sheet--hover">
				<text
				    @touchmove.stop.prevent
				    :hover-stay-time="150"
				    v-if="cancelText"
				    class="u-action-sheet__cancel-text"
				    @tap="cancel"
				>{{cancelText}}</text>
潘永坪's avatar
潘永坪 committed
104 105 106 107 108 109
			</view>
		</view>
	</u-popup>
</template>

<script>
潘永坪's avatar
潘永坪 committed
110 111 112
	import openType from '../../libs/mixin/openType'
	import button from '../../libs/mixin/button'
	import props from './props.js';
潘永坪's avatar
潘永坪 committed
113
	/**
潘永坪's avatar
潘永坪 committed
114
	 * ActionSheet 操作菜单
潘永坪's avatar
潘永坪 committed
115 116
	 * @description 本组件用于从底部弹出一个操作菜单,供用户选择并返回结果。本组件功能类似于uni的uni.showActionSheetAPI,配置更加灵活,所有平台都表现一致。
	 * @tutorial https://www.uviewui.com/components/actionSheet.html
潘永坪's avatar
潘永坪 committed
117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144
	 * 
	 * @property {Boolean}			show				操作菜单是否展示 (默认 false )
	 * @property {String}			title				操作菜单标题
	 * @property {String}			description			选项上方的描述信息
	 * @property {Array<Object>}	actions				按钮的文字数组,见官方文档示例
	 * @property {String}			cancelText			取消按钮的提示文字,不为空时显示按钮
	 * @property {Boolean}			closeOnClickAction	点击某个菜单项时是否关闭弹窗 (默认 true )
	 * @property {Boolean}			safeAreaInsetBottom	处理底部安全区 (默认 true )
	 * @property {String}			openType			小程序的打开方式 (contact | launchApp | getUserInfo | openSetting |getPhoneNumber |error )
	 * @property {Boolean}			closeOnClickOverlay	点击遮罩是否允许关闭  (默认 true )
	 * @property {Number|String}	round				圆角值,默认无圆角  (默认 0 )
	 * @property {String}			lang				指定返回用户信息的语言,zh_CN 简体中文,zh_TW 繁体中文,en 英文
	 * @property {String}			sessionFrom			会话来源,openType="contact"时有效
	 * @property {String}			sendMessageTitle	会话内消息卡片标题,openType="contact"时有效
	 * @property {String}			sendMessagePath		会话内消息卡片点击跳转小程序路径,openType="contact"时有效
	 * @property {String}			sendMessageImg		会话内消息卡片图片,openType="contact"时有效
	 * @property {Boolean}			showMessageCard		是否显示会话内消息卡片,设置此参数为 true,用户进入客服会话会在右下角显示"可能要发送的小程序"提示,用户点击后可以快速发送小程序消息,openType="contact"时有效 (默认 false )
	 * @property {String}			appParameter		打开 APP 时,向 APP 传递的参数,openType=launchApp 时有效
	 * 
	 * @event {Function} select			点击ActionSheet列表项时触发 
	 * @event {Function} close			点击取消按钮时触发
	 * @event {Function} getuserinfo	用户点击该按钮时,会返回获取到的用户信息,回调的 detail 数据与 wx.getUserInfo 返回的一致,openType="getUserInfo"时有效
	 * @event {Function} contact		客服消息回调,openType="contact"时有效
	 * @event {Function} getphonenumber	获取用户手机号回调,openType="getPhoneNumber"时有效
	 * @event {Function} error			当使用开放能力时,发生错误的回调,openType="error"时有效
	 * @event {Function} launchapp		打开 APP 成功的回调,openType="launchApp"时有效
	 * @event {Function} opensetting	在打开授权设置页后回调,openType="openSetting"时有效
	 * @example <u-action-sheet :actions="list" :title="title" :show="show"></u-action-sheet>
潘永坪's avatar
潘永坪 committed
145 146 147
	 */
	export default {
		name: "u-action-sheet",
潘永坪's avatar
潘永坪 committed
148 149 150 151 152
		// 一些props参数和methods方法,通过mixin混入,因为其他文件也会用到
		mixins: [openType, button, uni.$u.mixin, props],
		data() {
			return {

潘永坪's avatar
潘永坪 committed
153 154 155 156 157 158 159
			}
		},
		computed: {
			// 操作项目的样式
			itemStyle() {
				return (index) => {
					let style = {};
潘永坪's avatar
潘永坪 committed
160 161
					if (this.actions[index].color) style.color = this.actions[index].color
					if (this.actions[index].fontSize) style.fontSize = uni.$u.addUnit(this.actions[index].fontSize)
潘永坪's avatar
潘永坪 committed
162
					// 选项被禁用的样式
潘永坪's avatar
潘永坪 committed
163
					if (this.actions[index].disabled) style.color = '#c0c4cc'
潘永坪's avatar
潘永坪 committed
164 165 166 167 168
					return style;
				}
			},
		},
		methods: {
潘永坪's avatar
潘永坪 committed
169 170 171 172 173 174
			closeHandler() {
				// 允许点击遮罩关闭时,才发出close事件
				if(this.closeOnClickOverlay) {
					this.$emit('close')
				}
			},
潘永坪's avatar
潘永坪 committed
175
			// 点击取消按钮
潘永坪's avatar
潘永坪 committed
176 177
			cancel() {
				this.$emit('close')
潘永坪's avatar
潘永坪 committed
178
			},
潘永坪's avatar
潘永坪 committed
179 180 181 182 183 184 185 186
			selectHandler(index) {
				const item = this.actions[index]
				if (item && !item.disabled && !item.loading) {
					this.$emit('select', item)
					if (this.closeOnClickAction) {
						this.$emit('close')
					}
				}
潘永坪's avatar
潘永坪 committed
187 188 189 190 191 192
			},
		}
	}
</script>

<style lang="scss" scoped>
潘永坪's avatar
潘永坪 committed
193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211
	@import "../../libs/css/components.scss";
	$u-action-sheet-reset-button-width:100% !default;
	$u-action-sheet-title-font-size: 16px !default;
	$u-action-sheet-title-padding: 12px 30px !default;
	$u-action-sheet-title-color: $u-main-color !default;
	$u-action-sheet-header-icon-wrap-right:15px !default;
	$u-action-sheet-header-icon-wrap-top:15px !default;
	$u-action-sheet-description-font-size:13px !default;
	$u-action-sheet-description-color:14px !default;
	$u-action-sheet-description-margin: 18px 15px !default;
	$u-action-sheet-item-wrap-item-padding:15px !default;
	$u-action-sheet-item-wrap-name-font-size:16px !default;
	$u-action-sheet-item-wrap-subname-font-size:13px !default;
	$u-action-sheet-item-wrap-subname-color: #c0c4cc !default;
	$u-action-sheet-item-wrap-subname-margin-top:10px !default;
	$u-action-sheet-cancel-text-font-size:16px !default;
	$u-action-sheet-cancel-text-color:$u-content-color !default;
	$u-action-sheet-cancel-text-font-size:15px !default;
	$u-action-sheet-cancel-text-hover-background-color:rgb(242, 243, 245) !default;
潘永坪's avatar
潘永坪 committed
212

潘永坪's avatar
潘永坪 committed
213 214
	.u-reset-button {
		width: $u-action-sheet-reset-button-width;
潘永坪's avatar
潘永坪 committed
215 216
	}

潘永坪's avatar
潘永坪 committed
217 218 219 220 221 222 223 224 225 226 227
	.u-action-sheet {
		text-align: center;
		&__header {
			position: relative;
			padding: $u-action-sheet-title-padding;
			&__title {
				font-size: $u-action-sheet-title-font-size;
				color: $u-action-sheet-title-color;
				font-weight: bold;
				text-align: center;
			}
潘永坪's avatar
潘永坪 committed
228

潘永坪's avatar
潘永坪 committed
229 230 231 232 233 234 235 236 237 238 239 240 241 242 243
			&__icon-wrap {
				position: absolute;
				right: $u-action-sheet-header-icon-wrap-right;
				top: $u-action-sheet-header-icon-wrap-top;
			}
		}

		&__description {
			font-size: $u-action-sheet-description-font-size;
			color: $u-tips-color;
			margin: $u-action-sheet-description-margin;
			text-align: center;
		}

		&__item-wrap {
潘永坪's avatar
潘永坪 committed
244

潘永坪's avatar
潘永坪 committed
245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276
			&__item {
				padding: $u-action-sheet-item-wrap-item-padding;
				@include flex;
				align-items: center;
				justify-content: center;
				flex-direction: column;

				&__name {
					font-size: $u-action-sheet-item-wrap-name-font-size;
					color: $u-main-color;
					text-align: center;
				}

				&__subname {
					font-size: $u-action-sheet-item-wrap-subname-font-size;
					color: $u-action-sheet-item-wrap-subname-color;
					margin-top: $u-action-sheet-item-wrap-subname-margin-top;
					text-align: center;
				}
			}
		}

		&__cancel-text {
			font-size: $u-action-sheet-cancel-text-font-size;
			color: $u-action-sheet-cancel-text-color;
			text-align: center;
			padding: $u-action-sheet-cancel-text-font-size;
		}

		&--hover {
			background-color: $u-action-sheet-cancel-text-hover-background-color;
		}
潘永坪's avatar
潘永坪 committed
277 278
	}
</style>