1
0
miroir de https://github.com/ialley-workshop-open/uni-halo.git synchronisé 2026-06-12 13:19:31 +08:00
Fichiers
uni-halo/tm-vuetify/components/tm-banners/tm-banners.vue
T
2022-12-06 15:08:29 +08:00

259 lignes
7.0 KiB
Vue
Brut Annotations Historique

Ce fichier contient des caractères Unicode ambigus.
Ce fichier contient des caractères Unicode qui peuvent être confondus avec d'autres caractères. Si vous pensez que c'est intentionnel, vous pouvez ignorer cet avertissement. Utilisez le bouton Échappe pour les dévoiler.
<!-- 横幅消息提醒故名思义即悬浮在顶部的消息条只有点关闭才会消失一般用来重要的中断提醒 -->
<!-- 和tm-alerts有点类似但作用不同 -->
<template>
<view :animation="animation" v-if="show" class="tm-banners text-size-n "
:class="[dense===true||dense=='true'?'dense-32':'',black_tmeme?'bk':'',color_tmeme,
outlined||outlined=='true'?'outlined':'','round-'+round,text?'text':'']"
:style="widths"
>
<view class=" flex-start" :class="[dense===true||dense=='true'?'py-16 px-32 ':'py-32 px-32']">
<view class="body-left ">
<tm-icons :black="black_tmeme" :color="(text||outlined)?color_tmeme:iconColor" :dense="true" :name="leftIcon" size="32"></tm-icons>
</view>
<view @click="onclick" @tap="onclick" class="body-center " :class="['text-overflow-'+col]">{{label}}</view>
<view @click.stop="closeview" v-if="close" class="body-right text-align-right">
<tm-icons :black="black_tmeme" :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 {String | Boolean} outlined = [true|false] 默认:false,是否为边框样式
* @property {String} position = [top|bottom] 默认:top,位置
* @property {String | Boolean} text = [true|false] 默认:false,是否为文本模式,即减淡背景颜色。
* @property {String | Array} label = [true|false] 默认:"",当为数组时,自动变成轮播信息。
* @property {String | Boolean} black = [true|false] 默认:false,是否开启暗黑模式
* @property {String} color = [primary|blue|red|green|yellow|orange] 默认:primary,主题颜色名称
* @property {String} icon-color = [primary|blue|red|green|yellow|orange] 默认:primary,图标主题颜色名称
* @property {String} left-icon = [icon-lightbulb] 默认:"icon-lightbulb",左边图标名称
* @property {String | Boolean} ani = [true|false] 默认:false,是否禁用动画,
* @property {String | Boolean} close = [true|false] 默认:false 是否显示关闭图标,
* @property { Number|String} y = [] 默认:0 距离顶部的偏移量。
* @property { Number|String} width = [] 默认:'90%', 宽度,数字,或者百度比。数字的单位是upx
* @property { Number|String} col = [] 默认:1, 多行模式。默认为1行,可选最多3行。
* @property { Number|String} round = [] 默认:2 圆角。
* @property {Function} click 整个组件点击事件
* @example <tm-banners label="瞪村槈李厚厚霖无可奈何需"></tm-banners>
*/
import tmIcons from "@/tm-vuetify/components/tm-icons/tm-icons.vue"
export default {
components:{tmIcons},
name:'tm-banners',
model:{
prop:'value',
event:'input'
},
props: {
// 是否减小边距。
dense: {
type: String | Boolean,
default: true
},
// 是否为边框样式,
outlined: {
type: String | Boolean,
default: false
},
// 是否为文本模式,即减淡背景颜色。
text: {
type: String | Boolean,
default: false
},
// 当为数组时,自动变成轮播信息。
label:{
type:String | Array,
default:""
},
// 是否开启暗黑模式
black: {
type: String | Boolean,
default: null
},
// 主题颜色名称
color: {
type: String,
default: 'primary'
},
iconColor:{
type: String,
default: 'white'
},
// 左边图标名称
leftIcon: {
type: String,
default: 'icon-lightbulb'
},
//是否禁用动画,
ani: {
type: Boolean,
default: false
},
// 是否显示关闭图标
close: {
type: Boolean,
default: true
},
// 距离顶部的偏移量。
y: {
type: Number|String,
default: 16
},
// 距离顶部的偏移量。
position: {
type: String,
default: 'top' //top|bottom
},
// 宽度,数字,或者百度比。数字的单位是upx
width: {
type: Number|String,
default: '90%'
},
// 圆角
round: {
type: Number|String,
default: '3'
},
// 多行模式。默认为1行,可选最多3行。
col:{
type: Number|String,
default: 1
},
// 跟随主题色的改变而改变。
fllowTheme:{
type:Boolean|String,
default:true
},
value: {
type: Boolean|String,
default: true
},
},
data() {
return {
animation: null,
outid: 'alert-88',
};
},
computed:{
show:{
get:function(){
return this.value;
},
set:function(val){
this.$emit('input',val)
this.$emit('update:value',val)
},
},
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;
},
widths:function(){
let topoffset = 0 + uni.upx2px(parseInt(this.y));
if(isNaN(parseInt((this.width)))){
return this.$tm.objToString({
width:'100%',
left:'0px',
top:this.position=='bottom'?'inherit':`${topoffset}px`,
bottom:this.position=='top'?'inherit':`${topoffset}px`
});
}
if(String(this.width).indexOf('%')>-1||String(this.width).indexOf('vw')>-1){
let num = parseFloat(this.width.replace(/(\%|vw|)/g,''));
let blv = this.width.replace(/[\.|a-zA-Z0-9]/g,'');
return this.$tm.objToString({
width:this.width,
left:(100-num)/2 + blv,
top:this.position=='bottom'?'inherit':`${topoffset}px`,
bottom:this.position=='top'?'inherit':`${topoffset}px`
});
}
let sysinfo = uni.getSystemInfoSync();
let wid = uni.upx2px(parseFloat(this.width));
let lf = (sysinfo.windowWidth - wid) / 2;
return this.$tm.objToString({
width:uni.upx2px(parseFloat(this.width))+'px',
left:lf+'px',
top:this.position=='bottom'?'inherit':`${topoffset}px`,
bottom:this.position=='top'?'inherit':`${topoffset}px`
});
}
},
mounted() {
},
methods: {
onclick(e) {
this.$emit('click', 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-banners {
width: calc(100% - 32upx);
left: 32upx;
&.dense-32{
width: calc(100% - 64upx);
}
position: fixed;
z-index: 500;
// color: #fff;
.gs {
width: 50upx;
min-width: 70upx;
}
.body-left,
.body-right {
@extend .gs;
}
.body-center {
width: 100%;
}
}
</style>