Vue基础知识81-90

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” 按钮,会将所有选项重置回源列表。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值