|
@@ -1,244 +1,266 @@
|
|
|
-<template>
|
|
|
- <button
|
|
|
- hover-class="fs-hover"
|
|
|
- class="fs-button"
|
|
|
- :class="[
|
|
|
- type,
|
|
|
- size,
|
|
|
- plain ? 'plain' : '',
|
|
|
- radius ? 'radius' : '',
|
|
|
- round ? 'round' : '',
|
|
|
- disabled ? 'disabled' : '',
|
|
|
- block ? 'block' : '',
|
|
|
- full ? 'block full' : '',
|
|
|
- ]"
|
|
|
- :style="[
|
|
|
- { width: width },
|
|
|
- customStyle,
|
|
|
- ]"
|
|
|
- :open-type="openType"
|
|
|
- :form-type="formType"
|
|
|
- @getuserinfo="getuserinfo"
|
|
|
- @contact="contact"
|
|
|
- @getphonenumber="getphonenumber"
|
|
|
- @opensetting="opensetting"
|
|
|
- @error="error"
|
|
|
- @click="handleClick"
|
|
|
- >
|
|
|
- <view class="fs-loader" v-if="loading"></view>
|
|
|
- <template v-else>
|
|
|
- <slot></slot>
|
|
|
- </template>
|
|
|
- </button>
|
|
|
-</template>
|
|
|
-
|
|
|
-<script setup>
|
|
|
- import { computed, useAttrs } from 'vue'
|
|
|
-
|
|
|
- const props = defineProps({
|
|
|
- openType: String,
|
|
|
- formType: String,
|
|
|
- size: {
|
|
|
- type: String,
|
|
|
- validator(value) {
|
|
|
- return ['mini', 'small', 'medium'].includes(value)
|
|
|
- }
|
|
|
- },
|
|
|
- type: {
|
|
|
- type: String,
|
|
|
- default: 'primary',
|
|
|
- validator(value) {
|
|
|
- return ['primary', 'success', 'info', 'warning', 'danger', 'default'].includes(value)
|
|
|
- }
|
|
|
- },
|
|
|
- plain: Boolean,
|
|
|
- radius: Boolean,
|
|
|
- round: Boolean,
|
|
|
- disabled: Boolean,
|
|
|
- full: Boolean,
|
|
|
- block: Boolean,
|
|
|
- link: String,
|
|
|
- linkType: {
|
|
|
- type: String,
|
|
|
- default: 'navigateTo'
|
|
|
- },
|
|
|
- width: String,
|
|
|
- customStyle: {
|
|
|
- type: Object,
|
|
|
- default() {
|
|
|
- return {}
|
|
|
- }
|
|
|
- },
|
|
|
- loading: Boolean
|
|
|
- })
|
|
|
-
|
|
|
- const emits = defineEmits(['click','getuserinfo','contact','getphonenumber','opensetting','error'])
|
|
|
-
|
|
|
- const handleClick = e => {
|
|
|
- if (props.link && !props.disabled) {
|
|
|
- uni[props.linkType]({
|
|
|
- url: props.link
|
|
|
- })
|
|
|
- }
|
|
|
- !props.disabled && emits('click')
|
|
|
- }
|
|
|
- const getuserinfo = (event) => {
|
|
|
- emits('getuserinfo', event.detail)
|
|
|
- }
|
|
|
- const contact = (event) => {
|
|
|
- emits('contact', event.detail)
|
|
|
- }
|
|
|
- const getphonenumber = (event) => {
|
|
|
- emits('getphonenumber', event.detail)
|
|
|
- }
|
|
|
- const opensetting = (event) => {
|
|
|
- emits('opensetting', event.detail)
|
|
|
- }
|
|
|
- const error = (event) => {
|
|
|
- emits('error', event.detail)
|
|
|
- }
|
|
|
-</script>
|
|
|
-
|
|
|
-<style lang="scss" scoped>
|
|
|
-.fs-button {
|
|
|
- font-weight: normal;
|
|
|
- font-size: 14px;
|
|
|
- color: #fff;
|
|
|
- padding: 0 40rpx;
|
|
|
- line-height: 1;
|
|
|
- text-align: center;
|
|
|
- border-radius: 0;
|
|
|
- display: inline-block;
|
|
|
- vertical-align: bottom;
|
|
|
- background-color: #cfcfcf;
|
|
|
- margin: 0;
|
|
|
- border: 0;
|
|
|
- height: 70rpx;
|
|
|
- line-height: 70rpx;
|
|
|
-
|
|
|
- &.primary,
|
|
|
- &.primary.selected,
|
|
|
- &.selected {
|
|
|
- background-color: var(--primary);
|
|
|
- }
|
|
|
- &.success {
|
|
|
- background-color: var(--success);
|
|
|
- }
|
|
|
- &.info {
|
|
|
- background-color: var(--info);
|
|
|
- }
|
|
|
- &.warning {
|
|
|
- background-color: var(--warning);
|
|
|
- }
|
|
|
- &.danger {
|
|
|
- background-color: var(--danger);
|
|
|
- }
|
|
|
-
|
|
|
- &.plain,
|
|
|
- &.plain.selected {
|
|
|
- background-color: transparent;
|
|
|
- box-shadow: inset 0 0 0 1px currentColor;
|
|
|
- color: #999999;
|
|
|
- }
|
|
|
-
|
|
|
- &.medium {
|
|
|
- // width: auto !important;
|
|
|
- height: 60rpx;
|
|
|
- line-height: 60rpx;
|
|
|
- font-size: 13px;
|
|
|
- padding: 0 30rpx;
|
|
|
- }
|
|
|
- &.small {
|
|
|
- width: auto !important;
|
|
|
- height: 50rpx;
|
|
|
- line-height: 50rpx;
|
|
|
- font-size: 12px;
|
|
|
- padding: 0 20rpx;
|
|
|
- }
|
|
|
- &.mini {
|
|
|
- width: auto !important;
|
|
|
- height: 40rpx;
|
|
|
- line-height: 40rpx;
|
|
|
- font-size: 12px;
|
|
|
- padding: 0 20rpx;
|
|
|
- }
|
|
|
- &.block {
|
|
|
- display: block;
|
|
|
- height: 100rpx;
|
|
|
- line-height: 100rpx;
|
|
|
- margin-left: var(--gutter) !important;
|
|
|
- margin-right: var(--gutter) !important;
|
|
|
- font-size: 18px;
|
|
|
- width: auto;
|
|
|
-
|
|
|
- &.radius {
|
|
|
- border-radius: 16rpx;
|
|
|
- }
|
|
|
- }
|
|
|
- &.full {
|
|
|
- margin-left: 0 !important;
|
|
|
- margin-right: 0 !important;
|
|
|
- }
|
|
|
-
|
|
|
- &::after {
|
|
|
- border: none;
|
|
|
- }
|
|
|
-
|
|
|
- &.radius {
|
|
|
- border-radius: 8rpx;
|
|
|
- }
|
|
|
- &.round {
|
|
|
- border-radius: 30px;
|
|
|
- }
|
|
|
-
|
|
|
- &.plain.primary,
|
|
|
- &.plain.selected {
|
|
|
- color: var(--primary);
|
|
|
- }
|
|
|
-
|
|
|
- &.plain.success {
|
|
|
- color: var(--success);
|
|
|
- }
|
|
|
-
|
|
|
- &.plain.warning {
|
|
|
- color: var(--warning);
|
|
|
- }
|
|
|
-
|
|
|
- &.plain.danger {
|
|
|
- color: var(--danger);
|
|
|
- }
|
|
|
-
|
|
|
- &.plain.info {
|
|
|
- color: var(--info);
|
|
|
- }
|
|
|
-
|
|
|
- &.disabled {
|
|
|
- opacity: 0.5;
|
|
|
- }
|
|
|
-}
|
|
|
-
|
|
|
-.fs-hover {
|
|
|
- opacity: 0.5;
|
|
|
-}
|
|
|
-
|
|
|
-.fs-loader {
|
|
|
- display: inline-block;
|
|
|
- width: 40rpx;
|
|
|
- height: 40rpx;
|
|
|
- color: inherit;
|
|
|
- vertical-align: middle;
|
|
|
- border: 4rpx solid currentcolor;
|
|
|
- border-bottom-color: transparent;
|
|
|
- border-radius: 50%;
|
|
|
- animation: 1s loader linear infinite;
|
|
|
- position: relative;
|
|
|
-}
|
|
|
-@keyframes loader {
|
|
|
- 0% {
|
|
|
- transform: rotate(0deg);
|
|
|
- }
|
|
|
- 100% {
|
|
|
- transform: rotate(360deg);
|
|
|
- }
|
|
|
-}
|
|
|
+<template>
|
|
|
+ <button
|
|
|
+ hover-class="fs-hover"
|
|
|
+ class="fs-button"
|
|
|
+ :class="[
|
|
|
+ type,
|
|
|
+ size,
|
|
|
+ plain ? 'plain' : '',
|
|
|
+ radius ? 'radius' : '',
|
|
|
+ round ? 'round' : '',
|
|
|
+ disabled ? 'disabled' : '',
|
|
|
+ block ? 'block' : '',
|
|
|
+ full ? 'block full' : ''
|
|
|
+ ]"
|
|
|
+ :style="[{ width: width }, customStyle]"
|
|
|
+ :open-type="openType"
|
|
|
+ :form-type="formType"
|
|
|
+ @getuserinfo="getuserinfo"
|
|
|
+ @contact="contact"
|
|
|
+ @getphonenumber="getphonenumber"
|
|
|
+ @opensetting="opensetting"
|
|
|
+ @error="error"
|
|
|
+ @click="handleClick"
|
|
|
+ >
|
|
|
+ <view class="fs-loader" v-if="loading"></view>
|
|
|
+ <template v-else>
|
|
|
+ <slot></slot>
|
|
|
+ </template>
|
|
|
+ </button>
|
|
|
+</template>
|
|
|
+
|
|
|
+<script>
|
|
|
+/**
|
|
|
+ * 按钮组件
|
|
|
+ * @description 按钮组件
|
|
|
+ * @property {String} openType 参考小程序
|
|
|
+ * @property {String} formType 参考小程序
|
|
|
+ * @property {String} size = [mini | small | medium] 按钮大小
|
|
|
+ * @property {Boolean} plain 是否镂空
|
|
|
+ * @property {Boolean} radius 是否圆角
|
|
|
+ * @property {Boolean} round 是否半圆
|
|
|
+ * @property {Boolean} loading 加载效果
|
|
|
+ * @property {Boolean} disabled disabled
|
|
|
+ * @property {Boolean} full 通屏按钮
|
|
|
+ * @property {Boolean} block 块状按钮
|
|
|
+ * @property {String} link 跳转地址
|
|
|
+ * @property {String} linkType 跳转类型
|
|
|
+ * @property {String} width 按钮宽度
|
|
|
+ * @property {Object} customStyle 按钮自定义样式
|
|
|
+ * @property {String} type = [primary | danger | warning | info | success | default] 按钮颜色类型
|
|
|
+ */
|
|
|
+export default {
|
|
|
+ name: 'fs-button'
|
|
|
+}
|
|
|
+</script>
|
|
|
+
|
|
|
+<script setup>
|
|
|
+import { computed, useAttrs } from 'vue'
|
|
|
+
|
|
|
+const props = defineProps({
|
|
|
+ openType: String,
|
|
|
+ formType: String,
|
|
|
+ size: {
|
|
|
+ type: String,
|
|
|
+ validator(value) {
|
|
|
+ return ['mini', 'small', 'medium'].includes(value)
|
|
|
+ }
|
|
|
+ },
|
|
|
+ type: {
|
|
|
+ type: String,
|
|
|
+ default: 'primary',
|
|
|
+ validator(value) {
|
|
|
+ return ['primary', 'success', 'info', 'warning', 'danger', 'default'].includes(value)
|
|
|
+ }
|
|
|
+ },
|
|
|
+ plain: Boolean,
|
|
|
+ radius: Boolean,
|
|
|
+ round: Boolean,
|
|
|
+ disabled: Boolean,
|
|
|
+ full: Boolean,
|
|
|
+ block: Boolean,
|
|
|
+ link: String,
|
|
|
+ linkType: {
|
|
|
+ type: String,
|
|
|
+ default: 'navigateTo'
|
|
|
+ },
|
|
|
+ width: String,
|
|
|
+ customStyle: {
|
|
|
+ type: Object,
|
|
|
+ default() {
|
|
|
+ return {}
|
|
|
+ }
|
|
|
+ },
|
|
|
+ loading: Boolean
|
|
|
+})
|
|
|
+
|
|
|
+const emits = defineEmits(['click', 'getuserinfo', 'contact', 'getphonenumber', 'opensetting', 'error'])
|
|
|
+
|
|
|
+const handleClick = e => {
|
|
|
+ if (props.link && !props.disabled) {
|
|
|
+ uni[props.linkType]({
|
|
|
+ url: props.link
|
|
|
+ })
|
|
|
+ }
|
|
|
+ !props.disabled && emits('click')
|
|
|
+}
|
|
|
+const getuserinfo = event => {
|
|
|
+ emits('getuserinfo', event.detail)
|
|
|
+}
|
|
|
+const contact = event => {
|
|
|
+ emits('contact', event.detail)
|
|
|
+}
|
|
|
+const getphonenumber = event => {
|
|
|
+ emits('getphonenumber', event.detail)
|
|
|
+}
|
|
|
+const opensetting = event => {
|
|
|
+ emits('opensetting', event.detail)
|
|
|
+}
|
|
|
+const error = event => {
|
|
|
+ emits('error', event.detail)
|
|
|
+}
|
|
|
+</script>
|
|
|
+
|
|
|
+<style lang="scss" scoped>
|
|
|
+.fs-button {
|
|
|
+ font-weight: normal;
|
|
|
+ font-size: 14px;
|
|
|
+ color: #fff;
|
|
|
+ padding: 0 40rpx;
|
|
|
+ line-height: 1;
|
|
|
+ text-align: center;
|
|
|
+ border-radius: 0;
|
|
|
+ display: inline-block;
|
|
|
+ vertical-align: bottom;
|
|
|
+ background-color: #cfcfcf;
|
|
|
+ margin: 0;
|
|
|
+ border: 0;
|
|
|
+ height: 70rpx;
|
|
|
+ line-height: 70rpx;
|
|
|
+
|
|
|
+ &.primary,
|
|
|
+ &.primary.selected,
|
|
|
+ &.selected {
|
|
|
+ background-color: var(--primary);
|
|
|
+ }
|
|
|
+ &.success {
|
|
|
+ background-color: var(--success);
|
|
|
+ }
|
|
|
+ &.info {
|
|
|
+ background-color: var(--info);
|
|
|
+ }
|
|
|
+ &.warning {
|
|
|
+ background-color: var(--warning);
|
|
|
+ }
|
|
|
+ &.danger {
|
|
|
+ background-color: var(--danger);
|
|
|
+ }
|
|
|
+
|
|
|
+ &.plain,
|
|
|
+ &.plain.selected {
|
|
|
+ background-color: transparent;
|
|
|
+ box-shadow: inset 0 0 0 1px currentColor;
|
|
|
+ color: #999999;
|
|
|
+ }
|
|
|
+
|
|
|
+ &.medium {
|
|
|
+ // width: auto !important;
|
|
|
+ height: 60rpx;
|
|
|
+ line-height: 60rpx;
|
|
|
+ font-size: 13px;
|
|
|
+ padding: 0 30rpx;
|
|
|
+ }
|
|
|
+ &.small {
|
|
|
+ width: auto !important;
|
|
|
+ height: 50rpx;
|
|
|
+ line-height: 50rpx;
|
|
|
+ font-size: 12px;
|
|
|
+ padding: 0 20rpx;
|
|
|
+ }
|
|
|
+ &.mini {
|
|
|
+ width: auto !important;
|
|
|
+ height: 40rpx;
|
|
|
+ line-height: 40rpx;
|
|
|
+ font-size: 12px;
|
|
|
+ padding: 0 20rpx;
|
|
|
+ }
|
|
|
+ &.block {
|
|
|
+ display: block;
|
|
|
+ height: 100rpx;
|
|
|
+ line-height: 100rpx;
|
|
|
+ margin-left: var(--gutter) !important;
|
|
|
+ margin-right: var(--gutter) !important;
|
|
|
+ font-size: 18px;
|
|
|
+ width: auto;
|
|
|
+
|
|
|
+ &.radius {
|
|
|
+ border-radius: 16rpx;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ &.full {
|
|
|
+ margin-left: 0 !important;
|
|
|
+ margin-right: 0 !important;
|
|
|
+ }
|
|
|
+
|
|
|
+ &::after {
|
|
|
+ border: none;
|
|
|
+ }
|
|
|
+
|
|
|
+ &.radius {
|
|
|
+ border-radius: 8rpx;
|
|
|
+ }
|
|
|
+ &.round {
|
|
|
+ border-radius: 30px;
|
|
|
+ }
|
|
|
+
|
|
|
+ &.plain.primary,
|
|
|
+ &.plain.selected {
|
|
|
+ color: var(--primary);
|
|
|
+ }
|
|
|
+
|
|
|
+ &.plain.success {
|
|
|
+ color: var(--success);
|
|
|
+ }
|
|
|
+
|
|
|
+ &.plain.warning {
|
|
|
+ color: var(--warning);
|
|
|
+ }
|
|
|
+
|
|
|
+ &.plain.danger {
|
|
|
+ color: var(--danger);
|
|
|
+ }
|
|
|
+
|
|
|
+ &.plain.info {
|
|
|
+ color: var(--info);
|
|
|
+ }
|
|
|
+
|
|
|
+ &.disabled {
|
|
|
+ opacity: 0.5;
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+.fs-hover {
|
|
|
+ opacity: 0.5;
|
|
|
+}
|
|
|
+
|
|
|
+.fs-loader {
|
|
|
+ display: inline-block;
|
|
|
+ width: 40rpx;
|
|
|
+ height: 40rpx;
|
|
|
+ color: inherit;
|
|
|
+ vertical-align: middle;
|
|
|
+ border: 4rpx solid currentcolor;
|
|
|
+ border-bottom-color: transparent;
|
|
|
+ border-radius: 50%;
|
|
|
+ animation: 1s loader linear infinite;
|
|
|
+ position: relative;
|
|
|
+}
|
|
|
+@keyframes loader {
|
|
|
+ 0% {
|
|
|
+ transform: rotate(0deg);
|
|
|
+ }
|
|
|
+ 100% {
|
|
|
+ transform: rotate(360deg);
|
|
|
+ }
|
|
|
+}
|
|
|
</style>
|