180 lines
3.5 KiB
Vue
180 lines
3.5 KiB
Vue
<template>
|
||
<button
|
||
:class="[
|
||
'cl-button',
|
||
type && `cl-button--${type}`,
|
||
size && `cl-button--${size}`,
|
||
{
|
||
'is-round': round,
|
||
'is-loading': loading,
|
||
'is-plain': plain,
|
||
'is-fill': fill,
|
||
'is-disabled': disabled,
|
||
'is-border': border,
|
||
'is-bold': bold,
|
||
'is-custom': custom,
|
||
},
|
||
]"
|
||
:style="[
|
||
baseStyle,
|
||
{
|
||
color,
|
||
},
|
||
]"
|
||
:size="size"
|
||
:disabled="disabled || loading"
|
||
:form-type="formType"
|
||
:open-type="openType"
|
||
:hover-class="hoverClass"
|
||
:hover-start-time="hoverStartTime"
|
||
:hover-stay-time="hoverStayTime"
|
||
:app-parameter="appParameter"
|
||
:hover-stop-propagation="hoverStopPropagation"
|
||
:lang="lang"
|
||
:session-form="sessionForm"
|
||
:send-message-title="sendMessageTitle"
|
||
:send-message-path="sendMessagePath"
|
||
:send-message-img="sendMessageImg"
|
||
:show-message-card="showMessageCard"
|
||
@getphonenumber="getPhoneNumber"
|
||
@getuserinfo="getUserInfo"
|
||
@error="error"
|
||
@opensetting="openSetting"
|
||
@launchapp="launchApp"
|
||
@click="click"
|
||
>
|
||
<!-- 加载框 -->
|
||
<cl-loading :size="32" :color="loadingColor" :theme="loadingTheme" v-if="loading" />
|
||
|
||
<!-- 图标 -->
|
||
<view class="cl-button__icon" v-if="icon">
|
||
<image :src="icon" mode="aspectFit" v-if="isImg" />
|
||
<text :class="[icon]" v-else></text>
|
||
</view>
|
||
|
||
<!-- 本文 -->
|
||
<view class="cl-button__text" :style="{ color }">
|
||
<slot></slot>
|
||
</view>
|
||
</button>
|
||
</template>
|
||
|
||
<script lang="ts">
|
||
import { computed, defineComponent } from "vue";
|
||
import { type PropType } from "vue";
|
||
import { useTap } from "../../hooks";
|
||
import { useStyle } from "../../hooks/style";
|
||
|
||
export default defineComponent({
|
||
name: "cl-button",
|
||
|
||
props: {
|
||
// 按钮大小
|
||
size: String as PropType<"large" | "default" | "small">,
|
||
// 按钮类型
|
||
type: {
|
||
type: String as PropType<
|
||
"default" | "primary" | "success" | "danger" | "warning" | "info"
|
||
>,
|
||
default: "default",
|
||
},
|
||
// 是否朴素
|
||
plain: Boolean,
|
||
// 是否禁用
|
||
disabled: Boolean,
|
||
// 是否加载
|
||
loading: Boolean,
|
||
// 加载图标主题
|
||
loadingTheme: String,
|
||
// 加载图标颜色
|
||
loadingColor: String,
|
||
// 是否圆角
|
||
round: Boolean,
|
||
// 是否带有边框
|
||
border: {
|
||
type: Boolean,
|
||
default: true,
|
||
},
|
||
// 图标
|
||
icon: String,
|
||
// 水平填充
|
||
fill: Boolean,
|
||
// 字体颜色
|
||
color: String,
|
||
// 是否粗字体
|
||
bold: Boolean,
|
||
// 是否自定义
|
||
custom: Boolean,
|
||
// 以下查看 uniapp 文档:https://uniapp.dcloud.net.cn/component/button.html
|
||
formType: String,
|
||
openType: String,
|
||
hoverClass: {
|
||
type: String,
|
||
default: "button-hover",
|
||
},
|
||
hoverStartTime: {
|
||
type: Number,
|
||
default: 20,
|
||
},
|
||
hoverStayTime: {
|
||
type: Number,
|
||
default: 70,
|
||
},
|
||
appParameter: String,
|
||
hoverStopPropagation: Boolean,
|
||
lang: {
|
||
type: String,
|
||
default: "en",
|
||
},
|
||
sessionForm: String,
|
||
sendMessageTitle: String,
|
||
sendMessagePath: String,
|
||
sendMessageImg: String,
|
||
showMessageCard: Boolean,
|
||
},
|
||
|
||
setup(props, { emit }) {
|
||
const { tap } = useTap(emit);
|
||
|
||
// 是否图片
|
||
const isImg = computed(() => props.icon?.includes("/"));
|
||
|
||
// 事件
|
||
function getPhoneNumber(e: any) {
|
||
emit("getphonenumber", e);
|
||
}
|
||
|
||
function getUserInfo(e: any) {
|
||
emit("getuserinfo", e);
|
||
}
|
||
|
||
function error(e: any) {
|
||
emit("error", e);
|
||
}
|
||
|
||
function openSetting(e: any) {
|
||
emit("opensetting", e);
|
||
}
|
||
|
||
function launchApp(e: any) {
|
||
emit("launchapp", e);
|
||
}
|
||
|
||
function click(e: Event) {
|
||
tap(e);
|
||
}
|
||
|
||
return {
|
||
getPhoneNumber,
|
||
getUserInfo,
|
||
error,
|
||
openSetting,
|
||
launchApp,
|
||
click,
|
||
isImg,
|
||
...useStyle(),
|
||
};
|
||
},
|
||
});
|
||
</script>
|