123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177 |
- <template>
- <view
- class="tm-more relative"
- :style="{
- height: downOpen ? 'auto !important' : `${hs + 40}px`,
- paddingBottom: (downOpen && isRemovBar == false) || (show && !isRemovBar) ? '30px' : 0
- }"
- >
- <view class="tm-more-content"><slot></slot></view>
- <view v-if="!downOpen&&show&&showMask" :class="[black_tmeme?'bl':'']" class="tm-more-maskbody absolute"></view>
- <view
- @click="openMore"
- v-if="(!downOpen || isRemovBar == false) && show"
- :class="[bgColor,'text-'+iconColor,black_tmeme?'bk':'']"
- class="tm-more-mask absolute text-align-center text-size-s text-grey flex-center"
-
- >
- <slot name="more" :data="downOpen">
- <view class="fulled-height flex-center">
- <text>{{downOpen?openLabel:label}}</text>
- <view class="tm-more-btn px-24" :class="[downOpen?'on':'']">
- <tm-icons :size="24" :color="iconColor" name="icon-angle-down"></tm-icons>
- </view>
-
- </view>
-
- </slot>
- </view>
- </view>
- </template>
- <script>
- /**
- * 展开更多
- * @property {Number} maxHeight = [] 默认:100,限定多高时展示更多按钮,单位upx
- * @property {Boolean} disabled = [] 默认:false,是否禁用,禁用后无法展开更多
- * @property {Boolean} showMask = [] 默认:false,是否显示内容遮罩。
- * @property {Boolean} open = [] 默认:false,需要open.sync,是否展开更多,可不必填此。此值主要是用来手动控制展开和关闭。
- * @property {Boolean} isRemovBar = [] 默认:false,打开后,是否隐藏展开更多
- * @property {String} icon-color = [] 默认:grey,展开更多的图标颜色。
- * @property {String} bg-color = [] 默认:white,展开更多的背景颜色。
- * @property {String} label = [] 默认:展开阅读更多,更多的提示文字。
- * @property {String} open-label = [] 默认:收缩阅读更多,更多的提示文字。
- * @property {Function} click 点击展开更多时触发。
- * @property {Function} change 展开更多变换时触发。
- */
- import tmIcons from "@/tm-vuetify/components/tm-icons/tm-icons.vue"
- export default {
- components:{tmIcons},
- name: 'tm-more',
- props: {
- // 限定多高时展示更多按钮。
- maxHeight: {
- type: Number,
- default: 100
- },
- disabled: {
- type: Boolean,
- default: false
- },
- black: {
- type: Boolean|String,
- default: null
- },
- // 是否默认打开.可使用open.sync双向绑定。
- open: {
- type: Boolean,
- default: false
- },
- // 打开后,是否隐藏展开更多
- isRemovBar: {
- type: Boolean,
- default: false
- },
- iconColor: {
- type: String,
- default: 'grey'
- },
- // 展开更多 的背景色彩。
- bgColor: {
- type: String,
- default: 'white'
- },
- label:{
- type: String,
- default: '展开阅读更多'
- },
- openLabel:{
- type: String,
- default: '收缩阅读更多'
- },
- showMask:{
- type: Boolean|String,
- default: false
- }
- },
- watch: {
- open: function() {
- this.downOpen = this.open;
- }
- },
- data() {
- return {
- downOpen: false,
- show: true
- };
- },
- mounted() {
- this.$nextTick(function(){
- this.downOpen = this.open;
-
- let t = this;
-
- t.$Querey('.tm-more-content',t).then(syninfo=>{
- if (syninfo[0].height - 40 <= t.hs) {
- t.show = false;
- }
- }).catch(e => {});
-
-
- })
- },
- computed: {
- hs: function() {
- return uni.upx2px(this.maxHeight) || 100;
- },
- black_tmeme: function() {
- if (this.black !== null) return this.black;
- return this.$tm.vx.state().tmVuetify.black;
- }
- },
- methods: {
- openMore() {
- this.$emit('click');
- if (this.disabled) return;
- this.downOpen = !this.downOpen;
- this.$emit('change', this.downOpen);
- this.$emit('update:open', this.downOpen);
- }
- }
- };
- </script>
- <style lang="less" scoped>
- .tm-more {
- overflow: hidden;
-
- .tm-more-content {
- overflow: hidden;
-
- }
- .tm-more-maskbody{
-
- height: calc(100% - 40px);
- bottom: 40px;
- z-index: 10;
- width: 100%;
- background-image: linear-gradient(rgba(255,255,255,0) ,rgba(255,255,255,1));
- &.bl{
- background-image: linear-gradient(rgba(0,0,0,0) 30%,rgba(0,0,0,1)) !important;
- }
- }
- .tm-more-mask {
- bottom: 0;
- width: 100%;
- height: 40px;
- z-index: 10;
- .tm-more-btn{
- &.on{
- transition: all 0.35s;
- transform: rotate(180deg);
- }
- }
- }
- }
- </style>
|