1
0
mirror of https://github.com/ialley-workshop-open/uni-halo.git synced 2026-06-11 12:49:30 +08:00
Files
uni-halo/tm-vuetify/components/tm-alerts/tm-alerts.vue
T
2022-12-06 15:08:29 +08:00

291 lines
7.6 KiB
Vue
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<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>