gaoluyang
3 天以前 92230c9a97dc9ce9df3313d11d26999c04bb6b26
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
<template>
    <view>
        <view v-if="copyContent.length > 0" class="ranking">
            <view class="ranking-item" v-for="(content,index) in copyContent" :key="index" :style="{padding:progressPadding+'rpx'}">
                <view class="name">{{content.name}}</view>
                <view class="progress" >
                    <text :style="{background:content.background,width:content.width + '%',height:progressWidth+'rpx'}"></text>
                </view>
                <view class="num">{{content.num}}</view>
            </view>
        </view>
    </view>
</template>
 
<script>
    export default{
        name:'ranking-list',
        props:{
            content:{
                type: Array,
                default() {
                    return []
                }
            },
            isPC:{
                type:Boolean,
                default:false
            },
            isRank:{
                type:Boolean,
                default:false
            }
        },
        data(){
            return{
                progressWidth:24,
                progressPadding:10,
                maxNumber:0,
                culCount:0,
                copyContent:[]
            }
        },
        watch:{
            content(newV){
                this.init()
            }
        },
        methods:{
            init(){
                this.copyContent = this.deepClone(this.content)
                if(this.copyContent && this.copyContent.length >0){
                    if(this.isRank){
                        this.copyContent = this.copyContent.sort((a,b) => b.num - a.num);
                        this.maxNumber = this.copyContent[0].num;
                    }else{
                        this.maxNumber = Math.max.apply(Math,this.copyContent.map(item => { return item.num }));
                    }
                    this.copyContent.map((item,index) =>{
                        item.width = this.computeWidth(this.maxNumber,item.num);
                    });
                }
            },
            computeWidth(max,current){
                let num = (current / max) * 100;
                return num.toFixed(2);
            },
            deepClone(obj) {
              var cloneObj = new obj.constructor()
              if(obj === null) return obj
              if(obj instanceof Date) return new Date(obj)
              if(obj instanceof RegExp) return new RegExp(obj)
              if (typeof obj !== 'object') return obj
              for (var i in obj) {
                if (obj.hasOwnProperty(i)) {
                  cloneObj[i] = this.deepClone(obj[i])
                }
              }
              return cloneObj
            }
        },
        mounted() {
            if(this.isPC){
                this.progressWidth = 40;
                this.progressPadding = 30;
            }
            this.init();
        }
    }
</script>
 
<style scoped lang="scss">
    .ranking-item{
        display: flex;
        margin-bottom: 13rpx;
        align-content: center;
        height: 50rpx;
        
        .name{
            padding-right: 10rpx;
            color: #868688;
            font-size: 20rpx;
            flex: 1;
            white-space: nowrap;
                overflow: hidden;
                text-overflow: ellipsis;
        }
        .progress{
            flex:5;
            text-align: left;
            padding-right: 10rpx;
            
            text{
                display: inline-block;
                border-radius: 30rpx;
                vertical-align:top;
            }
            
        }
        .num{
            font-size: 26rpx;
            color: #3EB2F5;
            flex: 1;
        }
    }
</style>