291 lines
7.6 KiB
Vue
291 lines
7.6 KiB
Vue
<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>
|