125 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			Vue
		
	
	
	
	
	
			
		
		
	
	
			125 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			Vue
		
	
	
	
	
	
| <template>
 | |
|   <div class="Summary8">
 | |
|     <div class="summary5-item" v-for="(item, index) in arr" :key="index">
 | |
|       <div class="left">
 | |
|         <DonutChart :ratio="item.ratio"></DonutChart>
 | |
|       </div>
 | |
|       <div class="right">
 | |
|         <h2>{{ item[keys] }}</h2>
 | |
|         <p>{{ item[value] }}</p>
 | |
|       </div>
 | |
|     </div>
 | |
|   </div>
 | |
| </template>
 | |
| 
 | |
| <script>
 | |
|   import DonutChart from './DonutChart'
 | |
|   export default {
 | |
|     name: 'Summary8',
 | |
| 
 | |
|     components: {
 | |
|       DonutChart
 | |
|     },
 | |
| 
 | |
|     props: {
 | |
|       data: {
 | |
|         type: Array,
 | |
|         default: () => []
 | |
|       },
 | |
| 
 | |
|       keys: {
 | |
|         type: String,
 | |
|         default: 'key'
 | |
|       },
 | |
| 
 | |
|       value: {
 | |
|         type: String,
 | |
|         default: 'value'
 | |
|       }
 | |
|     },
 | |
| 
 | |
|     watch: {
 | |
|       data: {
 | |
|         handler (v) {
 | |
|           if (!v.length) return []
 | |
| 
 | |
|           let sum = 0
 | |
|           v.forEach(x => {
 | |
|             sum = x[this.value] + sum
 | |
|           })
 | |
| 
 | |
|           this.arr = v.map(v => {
 | |
|             return {
 | |
|               ...v,
 | |
|               ratio: Number((v[this.value] / sum).toFixed(2)) * 100
 | |
|             }
 | |
|           })
 | |
|         },
 | |
|         immediate: true,
 | |
|         deep: true
 | |
|       }
 | |
|     },
 | |
| 
 | |
|     data () {
 | |
|       return {
 | |
|         arr: []
 | |
|       }
 | |
|     },
 | |
| 
 | |
|     methods: {
 | |
|     }
 | |
|   }
 | |
| </script>
 | |
| 
 | |
| <style lang="scss" scoped>
 | |
|   .Summary8 {
 | |
|     display: flex;
 | |
|     flex-wrap: wrap;
 | |
|     justify-content: space-between;
 | |
|     align-items: center;
 | |
|     width: 100%;
 | |
|     height: 100%;
 | |
| 
 | |
|     div {
 | |
|       box-sizing: border-box;
 | |
|     }
 | |
| 
 | |
|     .summary5-item {
 | |
|       display: flex;
 | |
|       position: relative;
 | |
|       align-items: center;
 | |
| 
 | |
|       .right {
 | |
|         min-width: 90px;
 | |
|       }
 | |
| 
 | |
|       .left {
 | |
|         display: flex;
 | |
|         position: relative;
 | |
|         align-items: center;
 | |
|         justify-content: center;
 | |
|         margin-right: 20px;
 | |
|         width: 90px;
 | |
|         height: 90px;
 | |
|       }
 | |
| 
 | |
|       h2 {
 | |
|         margin-bottom: 12px;
 | |
|         color: #fff;
 | |
|         font-size: 16px;
 | |
|         font-weight: normal;
 | |
|       }
 | |
| 
 | |
|       p {
 | |
|         font-size: 26px;
 | |
|         font-weight: bold;
 | |
|         color: #CEE1FF;
 | |
|         text-shadow: 0px 2px 4px rgba(117, 9, 9, 0.1);
 | |
|         background: linear-gradient(180deg, #FFF6C7 0%, #FF9A02 100%);
 | |
|         -webkit-background-clip: text;
 | |
|         -webkit-text-fill-color: transparent;
 | |
|       }
 | |
|     }
 | |
|   }
 | |
| </style>
 |