81. Vue 3 和 ElementUI 实现分页表格的动态数据加载
在处理大量数据时,分页表格是一种常见的解决方案。以下是一个实现分页表格动态数据加载的示例:
html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Dynamic Data Loading in Pagination Table with Vue 3 and ElementUI</title>
<link rel="stylesheet" href="https://unpkg.com/element-plus@2.3.9/dist/index.css">
<script src="https://unpkg.com/vue@3/dist/vue.global.js"></script>
<script src="https://unpkg.com/element-plus@2.3.9/dist/index.full.js"></script>
</head>
<body>
<div id="app">
<el-table :data="tableData">
<el-table-column prop="name" label="Name"></el-table-column>
<el-table-column prop="age" label="Age"></el-table-column>
</el-table>
<el-pagination
@size-change="handleSizeChange"
@current-change="handleCurrentChange"
:current-page="currentPage"
:page-sizes="[10, 20, 30]"
:page-size="pageSize"
layout="total, sizes, prev, pager, next, jumper"
:total="total">
</el-pagination>
</div>
<script>
const { createApp, ref } = Vue;
const app = createApp({
setup() {
const tableData = ref([]);
const currentPage = ref(1);
const pageSize = ref(10);
const total = ref(100);
const loadData = () => {
// 模拟异步加载数据
setTimeout(() => {
const start = (currentPage.value - 1) * pageSize.value;
const end = start + pageSize.value;
tableData.value = Array.from({ length: pageSize.value }, (_, i) => ({
name: `User ${start + i + 1}`,
age: Math.floor(Math.random() * 50) + 18
}));
}, 500);
};
const handleSizeChange = (newSize) => {
pageSize.value = newSize;
loadData();
};
const handleCurrentChange = (newPage) => {
currentPage.value = newPage;
loadData();
};
loadData();
return {
tableData,
currentPage,
pageSize,
total,
handleSizeChange,
handleCurrentChange
};
}
});
app.use(ElementPlus);
app.mount('#app');
</script>
</body>
</html>
代码解析:
tableData
存储当前页的表格数据。currentPage
存储当前页码,pageSize
存储每页显示的数据条数,total
存储数据的总条数。loadData
方法模拟异步加载数据,根据当前页码和每页数据条数生成相应的数据。handleSizeChange
方法在每页数据条数改变时调用,更新pageSize
并重新加载数据。handleCurrentChange
方法在页码改变时调用,更新currentPage
并重新加载数据。- 在模板中,使用
el-table
展示表格数据,el-pagination
实现分页功能,并绑定相应的事件和属性。
代码效果:页面上会显示一个表格和分页组件。用户可以切换页码和每页显示的数据条数,表格会动态加载相应的数据。
82. Vue 3 和 ElementUI 实现下拉菜单的动态选项生成
下拉菜单的选项有时需要根据不同的条件动态生成。以下是一个示例:
html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Dynamic Option Generation in Dropdown Menu with Vue 3 and ElementUI</title>
<link rel="stylesheet" href="https://unpkg.com/element-plus@2.3.9/dist/index.css">
<script src="https://unpkg.com/vue@3/dist/vue.global.js"></script>
<script src="https://unpkg.com/element-plus@2.3.9/dist/index.full.js"></script>
</head>
<body>
<div id="app">
<el-select v-model="selectedOption" placeholder="Select an option">
<el-option v-for="option in dropdownOptions" :key="option.value" :label="option.label" :value="option.value">
</el-option>
</el-select>
<el-button @click="generateOptions">Generate Options</el-button>
</div>
<script>
const { createApp, ref } = Vue;
const app = createApp({
setup() {
const selectedOption = ref('');
const dropdownOptions = ref([]);
const generateOptions = () => {
const newOptions = [];
for (let i = 1; i <= 5; i++) {
newOptions.push({ value: `option${i}`, label: `Option ${i}` });
}
dropdownOptions.value = newOptions;
};
return {
selectedOption,
dropdownOptions,
generateOptions
};
}
});
app.use(ElementPlus);
app.mount('#app');
</script>
</body>
</html>
代码解析:
selectedOption
存储用户选择的选项值。dropdownOptions
存储下拉菜单的选项数据。generateOptions
方法用于动态生成选项数据,将生成的选项数组赋值给dropdownOptions
。- 在模板中,使用
el-select
组件创建下拉菜单,通过v-for
指令遍历dropdownOptions
生成选项。点击 “Generate Options” 按钮会调用generateOptions
方法。
代码效果:页面上会显示一个下拉菜单和一个按钮。初始时下拉菜单没有选项,点击按钮后,会动态生成 5 个选项供用户选择。
83. Vue 3 和 ElementUI 实现对话框的动态显示与隐藏
对话框常用于显示重要信息或进行用户交互。以下是一个实现对话框动态显示与隐藏的示例:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Dynamic Dialog Display and Hide with Vue 3 and ElementUI</title>
<link rel="stylesheet" href="https://unpkg.com/element-plus@2.3.9/dist/index.css">
<script src="https://unpkg.com/vue@3/dist/vue.global.js"></script>
<script src="https://unpkg.com/element-plus@2.3.9/dist/index.full.js"></script>
</head>
<body>
<div id="app">
<el-button @click="showDialog = true">Open Dialog</el-button>
<el-dialog
:visible.sync="showDialog"
title="Sample Dialog">
<template #content>
<p>This is the content of the dialog.</p>
</template>
<template #footer>
<el-button @click="showDialog = false">Close</el-button>
</template>
</el-dialog>
</div>
<script>
const { createApp, ref } = Vue;
const app = createApp({
setup() {
const showDialog = ref(false);
return {
showDialog
};
}
});
app.use(ElementPlus);
app.mount('#app');
</script>
</body>
</html>
代码解析:
showDialog
是一个响应式的布尔值,用于控制对话框的显示与隐藏。初始值为false
,表示对话框默认隐藏。- 当点击 “Open Dialog” 按钮时,将
showDialog
的值设为true
,对话框显示。 - 在对话框的页脚部分,点击 “Close” 按钮,将
showDialog
的值设为false
,对话框隐藏。 :visible.sync
是一个语法糖,它会自动处理visible
属性的双向绑定,使得对话框的显示状态能随着showDialog
的值动态变化。
代码效果:页面上会显示一个按钮,点击该按钮会弹出一个对话框,对话框包含一段文本内容和一个关闭按钮。点击关闭按钮,对话框会消失。
84. Vue 3 和 ElementUI 实现标签页的动态添加与删除
html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Dynamic Tab Addition and Deletion with Vue 3 and ElementUI</title>
<link rel="stylesheet" href="https://unpkg.com/element-plus@2.3.9/dist/index.css">
<script src="https://unpkg.com/vue@3/dist/vue.global.js"></script>
<script src="https://unpkg.com/element-plus@2.3.9/dist/index.full.js"></script>
</head>
<body>
<div id="app">
<el-tabs v-model="activeTab" type="card">
<el-tab-pane v-for="(tab, index) in tabs" :key="index" :label="tab.label" :name="tab.name">
<template #content>
<p>This is the content of {{ tab.label }}</p>
</template>
<template #extra>
<el-button icon="Delete" @click="removeTab(index)"></el-button>
</template>
</el-tab-pane>
</el-tabs>
<el-button @click="addTab">Add Tab</el-button>
</div>
<script>
const { createApp, ref } = Vue;
const app = createApp({
setup() {
const activeTab = ref('tab1');
const tabs = ref([
{ label: 'Tab 1', name: 'tab1' },
{ label: 'Tab 2', name: 'tab2' }
]);
const addTab = () => {
const newTabIndex = tabs.value.length + 1;
tabs.value.push({ label: `Tab ${newTabIndex}`, name: `tab${newTabIndex}` });
activeTab.value = `tab${newTabIndex}`;
};
const removeTab = (index) => {
tabs.value.splice(index, 1);
if (tabs.value.length > 0) {
activeTab.value = tabs.value[0].name;
}
};
return {
activeTab,
tabs,
addTab,
removeTab
};
}
});
app.use(ElementPlus);
app.mount('#app');
</script>
</body>
</html>
代码解析:
activeTab
存储当前激活的标签页的名称。tabs
是一个数组,存储所有标签页的信息,每个元素包含label
(标签页标题)和name
(标签页名称)。addTab
方法用于添加新的标签页,它会在tabs
数组中添加一个新元素,并将activeTab
设置为新标签页的名称。removeTab
方法用于删除指定索引的标签页,通过splice
方法从tabs
数组中移除该元素。如果删除后还有标签页,则将activeTab
设置为第一个标签页的名称。- 在模板中,使用
v-for
指令遍历tabs
数组,动态生成标签页。每个标签页的额外区域包含一个删除按钮,点击该按钮会调用removeTab
方法。
代码效果:页面上会显示几个初始的标签页和一个 “Add Tab” 按钮。点击 “Add Tab” 按钮会添加一个新的标签页并切换到该标签页;点击标签页上的删除按钮,会删除对应的标签页。
85. Vue 3 和 ElementUI 实现日期选择器的范围选择
html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Date Range Selection with Vue 3 and ElementUI</title>
<link rel="stylesheet" href="https://unpkg.com/element-plus@2.3.9/dist/index.css">
<script src="https://unpkg.com/vue@3/dist/vue.global.js"></script>
<script src="https://unpkg.com/element-plus@2.3.9/dist/index.full.js"></script>
</head>
<body>
<div id="app">
<el-date-picker
v-model="dateRange"
type="daterange"
range-separator="To"
start-placeholder="Start Date"
end-placeholder="End Date">
</el-date-picker>
<el-button @click="showSelectedRange">Show Selected Range</el-button>
</div>
<script>
const { createApp, ref } = Vue;
const app = createApp({
setup() {
const dateRange = ref([]);
const showSelectedRange = () => {
if (dateRange.value.length === 2) {
const startDate = new Date(dateRange.value[0]).toLocaleDateString();
const endDate = new Date(dateRange.value[1]).toLocaleDateString();
ElementPlus.ElMessage.info(`Selected range: ${startDate} to ${endDate}`);
} else {
ElementPlus.ElMessage.warning('Please select a valid date range.');
}
};
return {
dateRange,
showSelectedRange
};
}
});
app.use(ElementPlus);
app.mount('#app');
</script>
</body>
</html>
代码解析:
dateRange
是一个数组,用于存储用户选择的日期范围。当用户选择日期范围时,数组的第一个元素是开始日期,第二个元素是结束日期。type="daterange"
表示日期选择器支持范围选择。showSelectedRange
方法用于显示用户选择的日期范围。它会检查dateRange
数组的长度是否为 2,如果是,则将日期转换为本地日期字符串并显示消息;否则,显示警告消息。
代码效果:页面上会显示一个日期选择器和一个按钮。用户可以在日期选择器中选择一个日期范围,点击 “Show Selected Range” 按钮,会弹出消息框显示所选的日期范围;如果没有选择有效的日期范围,会弹出警告消息。
86. Vue 3 和 ElementUI 实现进度条的动态颜色变化
html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Dynamic Color Change of Progress Bar with Vue 3 and ElementUI</title>
<link rel="stylesheet" href="https://unpkg.com/element-plus@2.3.9/dist/index.css">
<script src="https://unpkg.com/vue@3/dist/vue.global.js"></script>
<script src="https://unpkg.com/element-plus@2.3.9/dist/index.full.js"></script>
</head>
<body>
<div id="app">
<el-progress :percentage="progress" :color="getProgressColor"></el-progress>
<el-button @click="increaseProgress">Increase Progress</el-button>
</div>
<script>
const { createApp, ref, computed } = Vue;
const app = createApp({
setup() {
const progress = ref(0);
const getProgressColor = computed(() => {
if (progress.value < 30) {
return '#F56C6C'; // 红色
} else if (progress.value < 70) {
return '#E6A23C'; // 黄色
} else {
return '#67C23A'; // 绿色
}
});
const increaseProgress = () => {
if (progress.value < 100) {
progress.value += 10;
}
};
return {
progress,
getProgressColor,
increaseProgress
};
}
});
app.use(ElementPlus);
app.mount('#app');
</script>
</body>
</html>
代码解析:
progress
存储进度条的百分比值,初始值为 0。getProgressColor
是一个计算属性,根据progress
的值返回不同的颜色。当进度小于 30% 时,返回红色;当进度在 30% 到 70% 之间时,返回黄色;当进度大于等于 70% 时,返回绿色。increaseProgress
方法用于增加进度条的百分比值,每次增加 10%,直到达到 100%。
代码效果:页面上会显示一个进度条和一个按钮。点击按钮,进度条的百分比值会增加,同时进度条的颜色会根据当前百分比动态变化。
87. Vue 3 和 ElementUI 实现树形结构的动态节点添加
html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Dynamic Node Addition in Tree Structure with Vue 3 and ElementUI</title>
<link rel="stylesheet" href="https://unpkg.com/element-plus@2.3.9/dist/index.css">
<script src="https://unpkg.com/vue@3/dist/vue.global.js"></script>
<script src="https://unpkg.com/element-plus@2.3.9/dist/index.full.js"></script>
</head>
<body>
<div id="app">
<el-tree
:data="treeData"
:props="defaultProps"
ref="treeRef">
</el-tree>
<el-button @click="addNode">Add Node</el-button>
</div>
<script>
const { createApp, ref } = Vue;
const app = createApp({
setup() {
const treeRef = ref(null);
const treeData = ref([
{
label: 'Parent Node',
children: [
{ label: 'Child Node 1' },
{ label: 'Child Node 2' }
]
}
]);
const defaultProps = {
children: 'children',
label: 'label'
};
const addNode = () => {
const newNode = { label: 'New Node' };
if (treeData.value.length > 0) {
if (!treeData.value[0].children) {
treeData.value[0].children = [];
}
treeData.value[0].children.push(newNode);
}
};
return {
treeRef,
treeData,
defaultProps,
addNode
};
}
});
app.use(ElementPlus);
app.mount('#app');
</script>
</body>
</html>
代码解析:
treeData
存储树形结构的数据,初始包含一个父节点和两个子节点。defaultProps
定义了树形结构数据的属性映射,指定children
和label
属性。addNode
方法用于添加新节点。它会创建一个新节点对象,然后将其添加到第一个父节点的children
数组中。如果父节点没有children
数组,则先创建该数组。- 在模板中,使用
el-tree
组件展示树形结构,并通过ref
引用该组件。
代码效果:页面上会显示一个树形结构和一个按钮。点击按钮,会在第一个父节点下添加一个新的子节点。
88. Vue 3 和 ElementUI 实现评分组件的动态更新
html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Dynamic Update of Rating Component with Vue 3 and ElementUI</title>
<link rel="stylesheet" href="https://unpkg.com/element-plus@2.3.9/dist/index.css">
<script src="https://unpkg.com/vue@3/dist/vue.global.js"></script>
<script src="https://unpkg.com/element-plus@2.3.9/dist/index.full.js"></script>
</head>
<body>
<div id="app">
<el-rate v-model="rating"></el-rate>
<el-button @click="increaseRating">Increase Rating</el-button>
<el-button @click="decreaseRating">Decrease Rating</el-button>
</div>
<script>
const { createApp, ref } = Vue;
const app = createApp({
setup() {
const rating = ref(3);
const increaseRating = () => {
if (rating.value < 5) {
rating.value++;
}
};
const decreaseRating = () => {
if (rating.value > 0) {
rating.value--;
}
};
return {
rating,
increaseRating,
decreaseRating
};
}
});
app.use(ElementPlus);
app.mount('#app');
</script>
</body>
</html>
代码解析:
rating
存储评分组件的当前评分值,初始值为 3。increaseRating
方法用于增加评分值,每次增加 1,但评分值最大为 5。decreaseRating
方法用于降低评分值,每次降低 1,但评分值最小为 0。- 在模板中,使用
el-rate
组件展示评分,通过v-model
绑定rating
,实现评分值的双向绑定。
代码效果:页面上会显示一个评分组件和两个按钮。点击 “Increase Rating” 按钮,评分值会增加;点击 “Decrease Rating” 按钮,评分值会降低。
89. Vue 3 和 ElementUI 实现步骤条的动态切换
html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Dynamic Step Switching in Step Bar with Vue 3 and ElementUI</title>
<link rel="stylesheet" href="https://unpkg.com/element-plus@2.3.9/dist/index.css">
<script src="https://unpkg.com/vue@3/dist/vue.global.js"></script>
<script src="https://unpkg.com/element-plus@2.3.9/dist/index.full.js"></script>
</head>
<body>
<div id="app">
<el-steps :active="activeStep" finish-status="success">
<el-step title="Step 1"></el-step>
<el-step title="Step 2"></el-step>
<el-step title="Step 3"></el-step>
</el-steps>
<el-button @click="prevStep">Previous Step</el-button>
<el-button @click="nextStep">Next Step</el-button>
</div>
<script>
const { createApp, ref } = Vue;
const app = createApp({
setup() {
const activeStep = ref(0);
const prevStep = () => {
if (activeStep.value > 0) {
activeStep.value--;
}
};
const nextStep = () => {
if (activeStep.value < 2) {
activeStep.value++;
}
};
return {
activeStep,
prevStep,
nextStep
};
}
});
app.use(ElementPlus);
app.mount('#app');
</script>
</body>
</html>
代码解析:
activeStep
存储当前激活的步骤索引,初始值为 0,表示第一步。prevStep
方法用于切换到上一步,只有当当前步骤不是第一步时才会执行。nextStep
方法用于切换到下一步,只有当当前步骤不是最后一步时才会执行。- 在模板中,使用
el-steps
组件展示步骤条,通过:active
绑定activeStep
,实现步骤的动态切换。
代码效果:页面上会显示一个步骤条和两个按钮。点击 “Previous Step” 按钮,步骤条会切换到上一步;点击 “Next Step” 按钮,步骤条会切换到下一步。
90. Vue 3 和 ElementUI 实现穿梭框的动态数据交换
html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Dynamic Data Exchange in Transfer with Vue 3 and ElementUI</title>
<link rel="stylesheet" href="https://unpkg.com/element-plus@2.3.9/dist/index.css">
<script src="https://unpkg.com/vue@3/dist/vue.global.js"></script>
<script src="https://unpkg.com/element-plus@2.3.9/dist/index.full.js"></script>
</head>
<body>
<div id="app">
<el-transfer
v-model="value"
:data="transferData"
:titles="['Source', 'Target']">
</el-transfer>
<el-button @click="resetTransfer">Reset</el-button>
</div>
<script>
const { createApp, ref } = Vue;
const app = createApp({
setup() {
const value = ref([]);
const transferData = ref([
{ key: 1, label: 'Option 1' },
{ key: 2, label: 'Option 2' },
{ key: 3, label: 'Option 3' },
{ key: 4, label: 'Option 4' }
]);
const resetTransfer = () => {
value.value = [];
};
return {
value,
transferData,
resetTransfer
};
}
});
app.use(ElementPlus);
app.mount('#app');
</script>
</body>
</html>
代码解析:
value
存储穿梭框中从源列表转移到目标列表的数据的key
值数组。transferData
存储穿梭框的所有选项数据,每个元素包含key
和label
属性。resetTransfer
方法用于重置穿梭框,将value
数组清空,即把所有选项放回源列表。- 在模板中,使用
el-transfer
组件展示穿梭框,通过v-model
绑定value
,实现数据的双向绑定。
代码效果:页面上会显示一个穿梭框和一个按钮。用户可以通过穿梭框的操作将选项从源列表转移到目标列表,点击 “Reset” 按钮,会将所有选项重置回源列表。