You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

291 lines
7.6 KiB
Vue

1 year ago
<template>
<!-- 提示框 -->
<view :animation="animation" v-if="show" @click="onclick" @tap="onclick" class="tm-alerts text-size-n "
:class="[color_tmeme,(outlined||outlined=='true')?'outlined':'','round-'+round,black_tmeme?'bk':'',
text=='true'||text?'text':'',
`mx-${margin[0]} my-${margin[1]} shadow-${color_tmeme}-${shadow}`
]"
>
<view class=" flex-start" :class="[dense===true||dense=='true'?'py-16 px-32':'py-32 px-32']">
<view v-if="leftIcon&&leftIcon!='true'" class="body-left ">
<tm-icons :color="(text||outlined)?color_tmeme:iconColor" :dense="true" :name="leftIcon" size="32"></tm-icons>
</view>
<view v-if="valueType===true" @click.stop="openUrl(label)" class="body-center text-overflow">{{label[rangKey]?label[rangKey]:label}}</view>
<view v-if="valueType===false" class="tm--alerts--id body-center" :style="{height:sliderwidth.height}">
<swiper v-if="sliderwidth.width" :vertical="vertical" :style="{height:sliderwidth.height,width:sliderwidth.width}" :interval="interval_vs" circular autoplay :duration="duration_vs" >
<swiper-item @click.stop="openUrl(item)" v-for="(item,index) in label" :key="index" class="body-center text-overflow" style="line-height: 50upx;" :style="{height:sliderwidth.height}">
{{item[rangKey]?item[rangKey]:item}}
</swiper-item>
</swiper>
</view>
<view v-if="url && !close" class="body-right text-align-right">
<tm-icons :color="(text||outlined)?color_tmeme:iconColor" :dense="true" :name="rightIcon" size="28"></tm-icons>
</view>
<view v-if="close" class="body-right text-align-right">
<tm-icons @click="closeview" :color="(text||outlined)?color_tmeme:iconColor" :dense="true" name="icon-times" size="28"></tm-icons>
</view>
</view>
</view>
</template>
<script>
/**
* 消息提示框
* @property {String | Boolean} dense = [true|false] 默认true是否减小边距
* @property {Array} margin = [] 默认[32,24]边距
* @property {String|Number} shadow = [] 默认6投影
* @property {String|Number} round = [] 默认4圆角
* @property {String|Number} duration = [] 默认500轮播速度
* @property {String|Number} interval = [] 默认1500轮播间隙
* @property {String | Boolean} outlined = [true|false] 默认false是否为边框样式
* @property {String | Boolean} text = [true|false] 默认false是否为文本模式即减淡背景颜色
* @property {String | Array} label = [true|false] 默认""当为数组时自动变成轮播信息
* @property {String | Boolean} black = [true|false] 默认false是否开启暗黑模式
* @property {String} color = [] 默认primary主题颜色名称
* @property {String} icon-color = [] 默认white图标的主题颜色名称
* @property {Boolean} url = [true|false] 默认false是否显示打开链接图标
* @property {String} left-icon = [] 默认"icon-lightbulb"左边图标名称
* @property {String} right-icon = [] 默认"icon-angle-right"右边图标名称
* @property {String} rang-key = [] 默认"text"当label娄数组时需要提供此值
* @property {String | Boolean} ani = [true|false] 默认false是否禁用动画
* @property {String | Boolean} vertical = [true|false] 默认false是否是纵向
* @property {String | Boolean} close = [true|false] 默认false 是否显示关闭图标
* @property {Function} click 整个组件点击事件
* @example <tm-alerts label="9"></tm-alerts>
*/
import tmIcons from "@/tm-vuetify/components/tm-icons/tm-icons.vue"
export default {
components:{tmIcons},
name:"tm-alerts",
model:{
prop:'value',
event:'input'
},
props: {
// 是否减小边距。
dense: {
type: String | Boolean,
default: true
},
// 是否为边框样式,
outlined: {
type: String | Boolean,
default: false
},
// 边距。
margin: {
type: Array,
default: ()=>{
return [32,24];
}
},
shadow: {
type: String|Number,
default: 4
},
round: {
type: String|Number,
default: 3
},
// 是否为文本模式,即减淡背景颜色。
text: {
type: String | Boolean,
default: false
},
// 当为数组时,自动变成轮播信息。
label:{
type:String | Array,
default:""
},
// 当label娄数组时需要提供此值。
rangKey:{
type:String,
default:"text"
},
// 是否开启暗黑模式
black: {
type: String | Boolean,
default: null
},
// 主题颜色名称
color: {
type: String,
default: 'primary'
},
// 图标主题颜色名称
iconColor: {
type: String,
default: 'white'
},
// 是否显示为打开链接的消息提醒。
url: {
type: Boolean,
default: false
},
// 左边图标名称
leftIcon: {
type: String,
default: 'icon-lightbulb'
},
// 右边图标名称
rightIcon: {
type: String,
default: 'icon-angle-right'
},
//是否禁用动画,
ani: {
type: Boolean,
default: false
},
// 是否显示关闭图标
close: {
type: Boolean,
default: false
},
// 跟随主题色的改变而改变。
fllowTheme:{
type:Boolean|String,
default:true
},
duration:{
type:Number,
default:1000
},
vertical:{
type:Boolean,
default:false
},
//间隔单位ms
interval:{
type:Number,
default:1500
},
value: {
type: Boolean|String,
default: true
},
},
data() {
return {
animation: null,
outid: 'alert-88',
sliderwidth:{height:0,width:0},
};
},
computed:{
// valueType:true,//默认是string.
valueType:function(){
if(Array.isArray(this.label)){
return false;
}
return true;
},
black_tmeme: function() {
if (this.black !== null) return this.black;
return this.$tm.vx.state().tmVuetify.black;
},
color_tmeme:function(){
if(this.$tm.vx.state().tmVuetify.color!==null&&this.$tm.vx.state().tmVuetify.color && this.fllowTheme){
return this.$tm.vx.state().tmVuetify.color;
}
return this.color;
},
duration_vs:function () {
return this.duration;
},
interval_vs:function () {
return this.interval;
},
show:{
get:function(){
return this.value;
},
set:function(val){
this.$emit('input',val)
this.$emit('update:value',val)
},
},
},
mounted() {
let t= this;
this.$Querey('.tm--alerts--id',this,50).then(res=>{
let wh = res[0];
t.sliderwidth = {
height:uni.upx2px(50)+'px',width:(wh.width||0)+'px'
}
}).catch(e=>{})
},
methods: {
onclick(e) {
this.$emit('click', e);
},
openUrl(e) {
this.$emit('click', e);
if(typeof e !== 'object' || !e['url']) return;
let urls = getCurrentPages();
let url = e.url;
if (urls.length >= 5) {
uni.redirectTo({
url:url,
fail: e => {
console.error(e);
}
});
} else {
uni.navigateTo({
url: url,
fail: e => {
console.error(e);
}
});
}
},
closeview(e) {
let t = this;
var animation = uni.createAnimation({
duration: 500,
timingFunction: 'ease'
});
this.animation = animation;
animation
.scale(0.7, 0.7)
.opacity(0)
.step();
this.outid = setTimeout(() => {
t.show = false;
t.animation = null;
}, 500);
}
}
};
</script>
<style lang="scss" scoped>
.tm-alerts {
.gs {
width: 50upx;
min-width: 70upx;
}
.body-left,
.body-right {
@extend .gs;
}
.body-center {
width: 100%;
}
}
</style>