使用场景:在需要等待加载内容的位置设置骨架屏。
主要代码:(其中loading控制骨架屏的显示不显示,为false时不显示,为true时显示)
<template>
<div v-show="!loading">
<!-- 第一行 -->
<el-row>
<el-col :span="6" v-for="item in rowArrOne" :key="item.index">
<el-card class="box-card">
<template #header>
<div class="card-header">
<span>{{ item.name }}</span>
<span>{{ item.time }}</span>
</div>
</template>
<div class="text item">{{ item.content }}</div>
</el-card>
</el-col>
</el-row>
<!-- 第二行 -->
<el-row>
<el-col :span="3" v-for="item in rowArrTwo" :key="item.index">
<el-card class="box-card">
<div>
<span>{{ item.title }}</span>
</div>
<div class="text item">{{ item.message }}</div>
</el-card>
</el-col>
</el-row>
<!-- 第三行 -->
<el-row>
<el-col :span="8" v-for="item in rowArrThree" :key="item.index">
<el-card class="box-card">
<template #header>
<div class="card-header">
<span>{{ item.title }}</span>
<span>更多>></span>
</div>
</template>
<div class="text item">
<el-table :data="tableData" border style="width: 100%">
<el-table-column prop="date" label="Date" width="180" />
<el-table-column prop="name" label="Name" width="180" />
<el-table-column prop="address" label="Address" />
</el-table>
</div>
</el-card>
</el-col>
</el-row>
</div>
<!-- 骨架屏 -->
<el-skeleton
:loading="loading"
animated
>
<template #template>
<!-- 第一行 -->
<el-row>
<el-col :span="6" v-for="item in rowArrOne" :key="item.index">
<el-card class="box-card">
<template #header>
<div class="card-header">
<el-skeleton-item variant="text" style="width: 20%" />
<el-skeleton-item variant="text" style="width: 20%" />
</div>
</template>
<el-skeleton />
</el-card>
</el-col>
</el-row>
<!-- 第二行 -->
<el-row>
<el-col :span="3" v-for="item in rowArrTwo" :key="item.index">
<el-card class="box-card">
<div>
<el-skeleton-item variant="text" style="width: 20%" />
</div>
<div class="text item"><el-skeleton-item variant="text" style="width: 40%" /></div>
</el-card>
</el-col>
</el-row>
<!-- 第三行 -->
<el-row>
<el-col :span="8" v-for="item in rowArrThree" :key="item.name">
<el-card class="box-card">
<template #header>
<div class="card-header">
<el-skeleton-item variant="text" style="width: 20%" />
<el-skeleton-item variant="text" style="width: 20%" />
</div>
</template>
<div class="table-flex">
<div class="table-flex_div">
<p v-for="item in tableData" :key="item.index" >
<el-skeleton-item variant="text" width="100%" />
</p>
</div>
<div class="table-flex_div">
<p v-for="item in tableData" :key="item.index" >
<el-skeleton-item variant="text" width="100%" />
</p>
</div>
<div class="table-flex_div">
<p v-for="item in tableData" :key="item.index" >
<el-skeleton-item variant="text" width="100%" />
</p>
</div>
</div>
</el-card>
</el-col>
</el-row>
</template>
</el-skeleton>
</template>
<script>
import { defineComponent, reactive, toRefs } from "vue";
export default defineComponent({
name: 'shouye-gujiaping',
setup() {
const state = reactive({
rowArrOne: [
{ index: '1',name: '第一行第一个',time: '2022-10-27',content: '俄罗斯卫星通讯社华盛顿10月27日电美国国家安全委员会战略沟通协调员约翰柯比表示,美方未看到俄罗斯拟使用“脏弹”的证据。'},
{ index: '2',name: '第一行第二个',time: '2022-10-27',content: '俄罗斯卫星通讯社华盛顿10月27日电美国国家安全委员会战略沟通协调员约翰柯比表示,美方未看到俄罗斯拟使用“脏弹”的证据。'},
{ index: '3',name: '第一行第三个',time: '2022-10-27',content: '俄罗斯卫星通讯社华盛顿10月27日电美国国家安全委员会战略沟通协调员约翰柯比表示,美方未看到俄罗斯拟使用“脏弹”的证据。'},
{ index: '4',name: '第一行第四个',time: '2022-10-27',content: '俄罗斯卫星通讯社华盛顿10月27日电美国国家安全委员会战略沟通协调员约翰柯比表示,美方未看到俄罗斯拟使用“脏弹”的证据。'},
],
rowArrTwo: [
{ index: "1" , title: '图标1', message: '意见反馈' },
{ index: "2" , title: '图标2', message: '意见反馈' },
{ index: "3" , title: '图标3', message: '意见反馈' },
{ index: "4" , title: '图标4', message: '意见反馈' },
{ index: "5" , title: '图标5', message: '意见反馈' },
{ index: "6" , title: '图标6', message: '意见反馈' },
{ index: "7" , title: '图标7', message: '意见反馈' },
{ index: "8" , title: '图标8', message: '意见反馈' },
],
rowArrThree: [
{index: "1" , title: '表格1'},
{index: "2" , title: '表格2'},
{index: "3" , title: '表格3'},
],
tableData: [
{
date: '2016-05-03',
name: 'Tom',
address: '中国',
},
{
date: '2016-05-02',
name: 'Tom',
address: '中国',
},
{
date: '2016-05-04',
name: 'Tom',
address: '中国',
},
{
date: '2016-05-01',
name: 'Tom',
address: '中国',
},
{
date: '2016-05-04',
name: 'Tom',
address: '中国',
}
],
loading: true,
})
return {
...toRefs(state),
}
}
})
</script>
<style scoped>
:deep(.card-header) {
display: flex;
}
:deep(.card-header) span:last-child {
flex: 1;
text-align: right;
}
:deep(.el-card__body) {
text-align: left;
}
:deep(.el-col-6),
:deep(.el-col-3),
:deep(.el-col-8) {
padding: 10px;
}
:deep(.el-col-3) .el-card__body div {
text-align: center;
padding: 6px;
}
:deep(.card-header) {
justify-content: space-between;
}
:deep(.el-skeleton__item.el-skeleton__p.is-first) {
width: 100%;
}
.table-flex {
display: flex;
}
.table-flex .table-flex_div {
width: 30%;
padding: 0 10px;
}
</style>
未设置骨架屏效果截图:
设置上骨架屏效果截图: