Day45:Element-Plus

news2025/1/18 3:30:24

Vue生态中包含了大量优秀的组件库,经过快速的学习,我们就能把这些现成的组件应用到自己的项目中了

1.常见组件库

UI组件库需要基于JS框架来实现,也就是说我们现在学习的是Vue3,也需要选择适配的组件库,在Vue生态中,最为流行的PC端组件库要数饿了么团队开发的element系列,Vue2版本对应Element-Ui,Vue3版本对应Element-Plus,我们当前要学习的便是Element-Plus,只要掌握了一个组件库的使用,其他组件库的使用基本上大同小异,大家无需担心。常见的UI组件库介绍如下:

  • Element-UI出自饿了么前端团队,学习Vue必用的一款 UI 库,采用 Vue 2.0 作为基础框架实现的组件库,一套为开发者、设计师和产品经理准备的基于 Vue 2.0 的组件库,提供了配套设计资源,帮助网站快速成型,Element Plus 支持 Vue3。主要用于PC端。
  • Vant一款有赞出品轻量、可靠的的移动UI组件库,目前支持 Vue2、Vue3、React、微信和支付宝小程序,官网的文档清晰易懂,如果你熟悉vue.js的组件化开发,上手非常容易。
  • Ant Design是一套企业级 UI 设计语言和 React 组件库,提供了一套非常完整的组件化设计规范与组件化编码规范,能大幅提高了部分产品的设计研发效率及质量,由阿里的专业团队负责维护。
  • Ant Design Mobile 可以视作AntD的移动端版本。
  • ...

上面这4个UI组件库对应了两大主流JS框架(Vue React)的PC端和移动端,我们当前的课程重点学习Element-Plus。

2.Element-Plus快速入门

2.1 项目安装

通过命令将Element-Plus安装到项目中:

npm install element-plus --save

vue2
npm i element-ui

确认正确安装完毕:

2.2 全局引入

虽然已经安装了依赖,但是要在项目中使用还需要引入,组件库一般都提供了全局引入和按需引入2种方法,全局引入更加方便,一次引入后可以在项目的任何位置使用,但是全局引入会让项目的体积变大,对于性能而言不是那么友好。

/main.js
import { createApp } from 'vue'
import ElementPlus from 'element-plus'
import 'element-plus/dist/index.css' //记得引入样式文件
import App from './App.vue'

const app = createApp(App)

app.use(ElementPlus) //通过use方法来注册插件
app.mount('#app')

引入完成之后,便可以在项目中使用Element-Plus提供的任意组件了。

2.3 按需引入

如果你只是希望使用Element-Plus的一小部分组件,按需引入往往是更好的方式,没有使用到的组件最终并不会被打包。但需要安装一个插件unplugin-element-plus来自动导入样式。

//App.vue
    <template>
      <el-button>I am ElButton</el-button>
    </template>
  <script>
    import { ElButton } from 'element-plus'
    export default {
      components: { ElButton },
    }
  </script>
// vite.config.js
import { defineConfig } from 'vite'
import ElementPlusPlugin from 'unplugin-element-plus/vite'

export default defineConfig({
  // ...
  plugins: [ElementPlusPlugin()],
})

插件的作用是可以自动引入组件对应的样式:

import { ElButton } from 'element-plus'
//    ↓ ↓ ↓ ↓ ↓ ↓
import { ElButton } from 'element-plus'
import 'element-plus/es/components/button/style/css'

2.4 快速体验

准备完毕后,我们尝试在项目中引入一些组件!进入官网后点选到组件页面,我们可以看到非常多的常用组件:

以最常见的button按钮为例,我们一起体验下组件库提供的按钮的强大之处:

在官方文档中我们确认使用组件前可以直接看到最终的显示效果:

按钮组件中提供了各种形状和颜色的按钮,如果匹配到了你的业务需求,可以找到对应的代码移植到你的项目中(比如我要选中那个success的圆角按钮)

/App.vue
   <template>
     <el-button type="success" round>Success</el-button>
   </template>

启动项目后在浏览器中便能看到对应的按钮组件了,是不是非常方便?

3.Element-Plus常见组件

现在我们再来进一步学习一些常见的组件

3.1 布局容器Container

搭建页面的整体结构往往是布局的第一步,Element-Plus提供了快速布局的相关组件,我们选用其中的一个添加到我们的项目中:

我们对3个区域都做一些修改:

Header区域给上一个背景色,修改一下文本描述,在组件库中修改元素样式需要通过浏览器调试工具找到对应元素的类名,比如头部<el-header>对应的类名即是'el-header'。

<template>
  <div class="common-layout">
    <el-container>
      <el-header>Element-Plus常用组件</el-header>
      <el-container>
        <el-aside width="200px">Aside</el-aside>
        <el-main>main</el-main>
      </el-container>
    </el-container>
  </div>
</template>

<script setup></script>

<style scoped>
  .el-header{
    background-color: skyblue;
    text-align: center;
    line-height: 60px;
  }
</style>

Aside区域引入一个菜单列表,用于展示不同的组件,显然这里的菜单列表也会是一个单独的组件,马上就会来介绍。

Main区域用于展示不同的组件,这里显然需要页面的切换,那可以将之前学习的路由引入,菜单组件完成后我们就立刻加入路由!

3.2 菜单Menu

找到菜单组件,侧栏是符合我们需求的样式,提供了2种颜色风格,任选一种即可,找到对应的代码引入到我们的项目中。我们这里不需要二级菜单,所以在引入对应代码的时候可以去掉二级菜单部分。

/Aside.vue
   <template>
     <el-row class="tac">
       <el-col :span="24">
         <h5 class="mb-4">常见组件</h5>
         <el-menu
           default-active="1"
           class="el-menu-vertical-demo"
           >
           <el-menu-item index="1">
             <el-icon><icon-menu /></el-icon>
             <span>Navigator One</span>
           </el-menu-item>
           <el-menu-item index="2" disabled>
             <el-icon><document /></el-icon>
             <span>Navigator Two</span>
           </el-menu-item>
           <el-menu-item index="3">
             <el-icon><setting /></el-icon>
             <span>Navigator Three</span>
           </el-menu-item>
         </el-menu>
       </el-col>
     </el-row>
   </template>

  <script setup>
    import {
      Document,
      Menu as IconMenu,
      Setting,
    } from '@element-plus/icons-vue'

  </script>

Menu组件上有一些特定的API,查阅文档最下方的说明,这需要多多使用才能熟练,我们现在项目的页面应该是这样的:

main区域用来展示不同的具体组件,菜单区域修改一下文本,这里涉及到页面跳转,所以需要将路由引入到项目中。

需要注意的是,menu组件有一个router属性需要手动开启。

在项目中配置好路由和对应组件后,我们的项目页面已经实现了路由跳转功能:

我们可以把刚才已经学习过的Button,Menu组件都放到我们项目中对应的位置。

3.3 表单Form

我们刚才已经搭建好了Form的路由,现在找到Element-Plus中Form组件,然后将它引入到我们的项目中,Form组件是一个比较复杂的组件,里面又包含了大量其他的基本组件,同样在文档下方提供了API的具体用法,我们现在做一个基本了解,后面通过逐步的实际使用来加深理解记忆。

修改组件库内部组件样式

修改组件库内部组件样式,必须使用样式穿透语法

::v-deep .el-input__inner { /* 样式穿透 */
  background-color: pink;
}

Element-Plus中还提供了大量的常用组件,基于这些提供的组件我们还需要根据实际业务需求进行二次封装,要熟练使用它们需要经过大量的实际项目练习

4.购物车案例改造

之前的Pinia购物车太丑了!我们使用Element-Plus给它美化一下吧!在项目中快速安装和引入Element-Plus。

4.1 引入路由

同样的,我们也引入路由,让商品列表和购物车作为2个单独的页面显示。

router/index
import { createRouter, createWebHistory } from 'vue-router'
import ProductionList from '../components/ProductionList.vue'
import ShoppingCart from '../components/ShoppingCart.vue'
const router = createRouter({
  history: createWebHistory(),
  routes: [
    {
      path: '',
    },
    {
      path: '/list',
      name: 'list',
      component: ProductionList,
    },
    {
      path: '/cart',
      name: 'cart',
      component: ShoppingCart,
    },
  ],
})
export default router

在首页中,可以引入2个Button组件设置2个路由页面的跳转,那么引入Element-Plus中的button组件吧!

<template>
  <h1>Pinia-购物车</h1>
  <div class="btn">
    <router-link to="/list" style="margin-right: 10px"
      ><el-button type="primary" round>商品列表</el-button></router-link
                                                         >
    <router-link to="/cart"
      ><el-button type="primary" round>购物车</el-button></router-link
                                                        >
  </div>
  <router-view></router-view>
</template>

<script setup></script>

<style scoped>
  h1 {
    text-align: center;
  }
  a {
    text-decoration: none;
  }
  .btn{
    text-align: center;
  }
</style>

现在我们的页面通过点击按钮实现正确的跳转了。

4.2 商品列表优化

现在进入商品列表页来做一些美化,列表展示我们一般会联想到表格,去到Element-Plus表格组件中找到一个你喜欢的风格,然后引入它,就选择这个吧,当然你需要对每列的内容做一些调整,第三列中我们需要加入按钮,记得给按钮绑定对应的事件(具体事件参考文档说明 这里我们使用cell-click事件)。

<template>
  <el-table :data="store1.lists" stripe style="width: 100%">
    <el-table-column prop="title" label="商品名称" width="500" align="center" />
    <el-table-column prop="price" label="商品价格" width="500" align="center" />
    <el-table-column width="500" align="center">
      <template #default="scope">
        <el-button @click.prevent="store2.addProduct(scope.row)">加入购物车</el-button>
      </template>
 </el-table-column>
   </el-table>
   </template>

<script setup>
 import { useProductStore } from '../store/product.js'
  import { useShopCartStore } from '../store/shopCart'
  const store1 = useProductStore()
  store1.getProductLists()
  const store2 = useShopCartStore()
</script>

<style></style>

修改完毕后,商品列表页面好看了许多,按钮功能也能正常实现!

但体验还是不够好,点选加入购物车的时候,最好能给一些提示,例如“添加成功”这样的消息提示,Element-Plus同样提供了这样的组件,这里我们选用Message 消息提示组件。

<template>
  <el-table :data="store1.lists" stripe style="width: 100%">
    <el-table-column prop="title" label="商品名称" width="500" align="center" />
    <el-table-column prop="price" label="商品价格" width="500" align="center" />
    <el-table-column width="500" align="center">
      <template #default="scope">
        <el-button @click.prevent="add(scope)">加入购物车</el-button>
      </template>
                   </el-table-column>
                     </el-table>
                     </template>

                     <script setup>
                     import { ElMessage } from 'element-plus'
        import { useProductStore } from '../store/product.js'
        import { useShopCartStore } from '../store/shopCart'
        const store1 = useProductStore()
        store1.getProductLists()
        const store2 = useShopCartStore()
        const add = (scope) => {
          ElMessage({
            message: '成功添加至购物车',
            type: 'success',
            onClose: () => {
              store2.addProduct(scope.row) //提示消息关闭后 添加商品到购物车
            },
          })
        }
      </script>

好了,现在我们的商品列表页是不是看起来美观了许多?

4.3 购物车优化

购物车中仍然是列表展示,所以可以继续使用表格组件。

然后优化一下 底部总价和结算按钮的布局,点击结算按钮时,给一个确认框的提示,这里可以用到Element-Plus中Message Box消息弹出框和刚才用过的Message 消息提示组件。

vue

<template>
  <div class="cart">
    <p v-show="!store.lists.length">
      <i>请添加一些商品到购物车</i>
    </p>
    <el-table
      :data="store.lists"
      stripe
      style="width: 100%"
      v-show="store.lists.length > 0"
      >
      <el-table-column
        prop="title"
        label="商品名称"
        width="500"
        align="center"
        />
      <el-table-column
        prop="price"
        label="商品价格"
        width="500"
        align="center"
        />
      <el-table-column
        prop="number"
        label="商品数量"
        width="500"
        align="center"
        />
    </el-table>
    <div class="bot">
      <p>商品总价:{{ store.sum }}</p>
      <p>
        <el-button @click="getResult" :disabled="!store.lists.length"
          >结算</el-button
               >
      </p>
    </div>
  </div>
</template>

<script setup>
  import { ElMessageBox, ElMessage } from 'element-plus'
  import { useShopCartStore } from '../store/shopCart'
  const store = useShopCartStore()
  const getResult = () => {
    ElMessageBox.confirm('确认要结算购物车吗?', {
      confirmButtonText: '确认',
      cancelButtonText: '取消',
      type: 'warning',
    })
      .then(() => {
        ElMessage({
          type: 'success',
          message: '正在结算中',
          onClose: async () => {
            await store.getResult()
            if (store.result === '成功') {
              ElMessage({
                type: 'success',
                message: '结算成功',
              })
            } else {
              ElMessage({
                type: 'error',
                message: '结算失败',
              })
            }
          },
        })
      })
      .catch(() => {
        ElMessage({
          type: 'info',
          message: '退出结算',
        })
      })
  }
</script>

<style scoped>
  .bot {
    display: flex;
    justify-content: space-between;
    padding: 0 15%;
  }
</style>

经过进一步优化,购物车组件的交互和展示效果也完成了,结算按钮增加了消息提示更加符合用户习惯。

经过我们的优化,现在的购物车案例已经看起来非常不错了,各种样式和交互效果都给加上了,这就是组件库给我们带来的便捷之处。

5.组件引入的注意点

1、常见组件

1、布局容器 Container

2、菜单Menu

Menu组件上有一些特定的API,查阅文档最下方的说明;

main区域用来展示不同的具体组件,菜单区域修改一下文本,这里涉及到页面跳转,所以需要将路由引入到项目中。需要注意的是,menu组件有一个router属性需要手动开启。

3、表单Form

2、使用说明

1、二次封装

Element-Plus中还提供了大量的常用组件,基于这些提供的组件我们还需要根据实际业务需求进行二次封装,封装要求参考官方文档;

2、样式穿透

找到组件的类名:再浏览器中审查元素,查找类名

在 vue 文件中,为了防止组件间样式相互影响,我们给 style 标签添加了样式隔离 scoped 属性,但有时后我们需要对组件库内部组件的样式进行二次修改,因此必须使用样式穿透语法来实现;

:: v-deep .组件的样式类名

3、组件的事件绑定

(1)vue2 中给一个组件绑定事件,组件会同意默认绑定的都是自定义事件,需要给事件添加修饰符 native,才会当作原生事件

(2)vue3 中给组件绑定事件:vue3 对应组件会检视这个事件的名称,如果名称是一个原生事件,那么会将其作为一个原生事件处理,否则视为自定义事件

4、添加路由

(1)通过添加事件:然后编程式导航

(2)用 <router -link> 标签进行包裹,通过该标签的 to 属性进行添加

<router-link to="/list" style="margin-right: 10px">
  <el-button type="primary" round>商品列表</el-button>
</router-link>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1016074.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C++QT day6

1> 将之前定义的栈类和队列类都实现成模板类 栈&#xff1a; #include <iostream> #define MAX 128 using namespace std; template<typename T> class Stack_s { private:T *pnew T[MAX];//栈的数组int top;//记录栈顶的变量 public://构造函数Stack_s(int t…

数据结构--平衡二叉树

目录 平衡二叉树定义 平衡二叉树的插入 调整最小不平衡子树 LL型 RR型 LR型​编辑 RL型​编辑 练习 查找效率分析​编辑 回顾知识点 平衡二叉树的删除 例1 ​编辑 例2​编辑 例3 例4​编辑 ​编辑 平衡二叉树的删除回顾​编辑 定义插入操作插入新结点后如何调…

SoundSource 5 for Mac:专业音频控制器,让您的Mac听觉体验更出色

对于使用 Mac 的用户而言&#xff0c;拥有一个强大的音频控制工具是非常重要的。SoundSource 5 for Mac 是 Rogue Amoeba 公司开发的一款专业的音频控制器&#xff0c;它提供了丰富的功能和优秀的性能&#xff0c;让您能够轻松管理并优化Mac上的音频设置。 首先&#xff0c;So…

腾讯mini项目-【指标监控服务重构】2023-08-12

今日已办 Watermill Handler 将 4 个阶段的逻辑处理定义为 Handler 测试发现&#xff0c;添加的 handler 会被覆盖掉&#xff0c;故考虑添加为 middleware 且 4 个阶段的处理逻辑针对不同 topic 是相同的。 参考https://watermill.io/docs/messages-router/实现不同topic&am…

DS相关题目

DS相关题目 题目一&#xff1a;消失的数字 拿到这道题目之后&#xff0c;首先可以想到的一个解题方法就是&#xff0c;我们可以先排序&#xff0c;排完序之后&#xff0c;这个数组其实就是一个有序的数组了&#xff0c;那只用比较数组中的每一个元素和他对应的下标是不是相等的…

Day46-50:统计图表项目总结

建项 项目需求写法——可视化报表 可视化报表项目效果 开源表格样式库阿帕奇 绘制echarte图标的流程 在视图中放置一个容器&#xff0c;这个容器需要有一个固定的宽高获取容器&#xff0c;调用init方法&#xff0c;初始化echarts实例 let container document.querySelec…

stm32----ADC模数转换

一、ADC介绍 ADC&#xff0c;即模数转换器&#xff0c;它可以将模拟信号转化为数字信号。在stm32种一般有3个ADC&#xff0c;每个ADC有18个通道。 12位ADC是一种逐次逼近型模拟数字转换器&#xff0c;它有多达18个通道&#xff0c;可测量16个外部和两个内部信号源。各个通道的A…

jquery设置图片可手动拖拽

JQuery是一款流行的JavaScript框架&#xff0c;可以轻松实现网页交互效果。而其中一种常见效果是图片手动拖拽。以下是设置图片手动拖拽的JQuery代码。 $(document).ready(function() { var isDragging false; var mousePos { x: 0, y: 0 }; var elemPos { x: 0, y: 0 }; v…

Apache Spark 在爱奇艺的应用实践

01 Apache Spark 在爱奇艺的现状 Apache Spark 是爱奇艺大数据平台主要使用的离线计算框架&#xff0c;并支持部分流计算任务&#xff0c;用于数据处理、数据同步、数据查询分析等场景&#xff1a; 数据处理&#xff1a;在数据开发平台中支持开发者提交 Spark Jar 包任务或Spar…

elasticsearch2-es和kibana的安装

个人名片&#xff1a; 博主&#xff1a;酒徒ᝰ. 个人简介&#xff1a;沉醉在酒中&#xff0c;借着一股酒劲&#xff0c;去拼搏一个未来。 本篇励志&#xff1a;三人行&#xff0c;必有我师焉。 本项目基于B站黑马程序员Java《SpringCloud微服务技术栈》&#xff0c;SpringCloud…

第 113 场 LeetCode 双周赛题解

A 使数组成为递增数组的最少右移次数 数据范围小直接模拟… class Solution { public:int minimumRightShifts(vector<int> &nums) {for (int op 0; op < nums.size(); op) {if (is_sorted(nums.begin(), nums.end()))//nums是否已经有序return op;rotate(nums.b…

zerotier-client

title: “zerotier-client” createTime: 2022-10-10T11:50:5108:00 updateTime: 2022-10-10T11:50:5108:00 draft: false author: “zcb” tags: [“zerotier-plant”,“zerotier-client”,“zerotier”] categories: [“zerotier”] description: “测试的” 1.windows 1.1…

【深度学习】Pytorch 系列教程(十二):PyTorch数据结构:4、数据集(Dataset)

目录 一、前言 二、实验环境 三、PyTorch数据结构 0、分类 1、张量&#xff08;Tensor&#xff09; 2、张量操作&#xff08;Tensor Operations&#xff09; 3、变量&#xff08;Variable&#xff09; 4、数据集&#xff08;Dataset&#xff09; 随机洗牌 一、前言 Ch…

【Windows】搭建 FTP 服务器

如果需要开发ftp文件上传下载等功能&#xff0c;就需要搭建个ftp服务器&#xff0c;方便调试。 FTP服务 FTP是文件传输协议&#xff08;File Transfer Protocol&#xff09;的简称&#xff0c;该协议属于应用层协议&#xff08;端口号通常为21&#xff09;&#xff0c;用于In…

【入门篇】ClickHouse最优秀的开源列式存储数据库

文章目录 一、什么是ClickHouse&#xff1f;OLAP场景的关键特征列式数据库更适合OLAP场景的原因输入/输出CPU 1.1 ClickHouse的定义与发展历程1.2 ClickHouse的版本介绍 二、ClickHouse的主要特性2.1 高性能的列式存储2.2 实时的分析查询2.3 高度可扩展性2.4 数据压缩2.5 SQL支…

骨传导耳机有害处吗、骨传导耳机真的不好用吗?

骨传导耳机没有害处。 骨传导耳机是通过将声音传递到颅骨&#xff0c;再由颅骨传递到内耳&#xff0c;从而达到听声音的效果&#xff0c;与传统的耳机不同。 因此&#xff0c;骨传导耳机不会直接对人的身体健康、耳朵产生压力和损伤&#xff0c;也不会影响耳道和中耳的正常功能…

在ios系统上实现更改IP地址

在当今的互联网环境中&#xff0c;我们经常需要更改手机的IP地址来避免一些限制或保护我们的隐私。然而&#xff0c;在iOS系统上&#xff0c;更改IP地址并不像在其他平台上那么容易。因此&#xff0c;本文将分享一种简单的方法&#xff0c;帮助您在iOS系统上免费更改手机的IP地…

浅谈C++|构造.析构函数篇

一对象的初始化和处理 1.1构造函数和析构函数 C拥有构造函数和析构函数&#xff0c;这两个函数将会被编译器自动调用&#xff0c;完成对象初始化和清理工作。对象的初始化和清理工作是编译器强制要我们做的事情&#xff0c;因此如果我们不提供构造和析构&#xff0c;编译器提供…

vue学习之组件化开发

1. vue创建 基于vue2的项目 vue create vue-cli-learning 选择 “Manually select features” 取消勾选“Linter / Formatter” 选择“2.x” 选择“In package.json” 输入“N” 回车

elasticsearch索引同步

通常项目中使用elasticsearch需要完成索引同步&#xff0c;索引同步的方法很多&#xff1a; #1、针对实时性非常高的场景需要满足数据的及时同步&#xff0c;可以同步调用&#xff0c;或使用Canal去实现。 1&#xff09;同步调用即在向MySQL写数据后远程调用搜索服务的接口写…