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

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

<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>