Element Plus 基本使用

一、概述

1.1介绍

Element Plus 基本使用

element-ui 是基于vue 开发的一套ui组件库,提供丰富的网页开发组件,可用快速开发网站,降低前端开发成本
版本 element目前有两个版本

  • element-ui:基于vue2
  • element-plus: 基于vue3

官网地址

https://element-plus.org/zh-CN/

element-plus 基本使用

1.安装
npm install element-plus
2.	在vue项目main.js引入element-plus组件,以及css文件
3.	在官方文档中找到需要的样式组件复制代码对应的.vue中使用。

具体部署请看快速开始 

1.2网页基础布局

icon组件

安装

pnpm install @element-plus/icons-vue

在main.ts中进行全局挂载

官网图标地址

https://element-plus.org/zh-CN/component/icon.html#

Container 布局容器

<div class="common-layout">
    <el-container>
      <el-aside width="200px">Aside</el-aside>
      <el-main>Main</el-main>
    </el-container>
  </div>

我们将这个布局抽离为两个组件,分别为一个header组件和一个aside组件,接下来开始抽离。

模板组件分离

header组件
<!-- eslint-disable @typescript-eslint/no-unused-vars -->
<!-- eslint-disable @typescript-eslint/no-unused-vars -->
<template>
<div>
    <el-header style="display: flex; font-size: 16px;">
    <!-- 左侧部分,包含侧边栏展开/折叠图标 -->
      <div style="display: inline-flex; flex: 1; align-items: center; justify-content: left;">
        <!-- 展开图标(非折叠状态时显示) -->
        <el-icon v-show="!showIcon.isCollapse" @click="collapseAside" style="color: #303133;">
          <Fold />
        </el-icon>
        <!-- 折叠图标(折叠状态时显示) -->
        <el-icon v-show="showIcon.isCollapse" @click="collapseAside" style="color: #303133;">
          <Expand />
        </el-icon>
      </div>

      <!-- 右侧工具栏区域 -->
      <div class="toolbar">
        <!-- 用户头像 -->
        <div class="block" style="margin-right: 10px;">
          <el-avatar :size="40" :src="Avatar" />
        </div>
        <!-- 用户名文本 -->
        <span>管理员</span>
        
        <!-- 下拉菜单,包含更多操作选项 -->
        <el-dropdown trigger="click">
          <!-- 设置图标 -->
          <el-icon style="margin-left: 18px; margin-top: 1px; color: #303133;">
            <setting />
          </el-icon>
          
          <!-- 下拉菜单内容模板 -->
          <template #dropdown>
            <el-dropdown-menu>
              <el-dropdown-item>View</el-dropdown-item>
              <el-dropdown-item>Add</el-dropdown-item>
              <el-dropdown-item @click="LogOut">退出登录</el-dropdown-item>
            </el-dropdown-menu>
          </template>
        </el-dropdown>
      </div>
    </el-header>
</div>
</template>
<script setup lang="ts">
import Avatar from '@/assets/touxiang.jpg'
import { ref } from 'vue'
// eslint-disable-next-line vue/no-dupe-keys, @typescript-eslint/no-unused-vars
const isCollapse = ref(true)
// 获取父组件传递过来的数据 
const showIcon = defineProps({
    isCollapse: Boolean
})

// 获取父组件自定义的事件
const emit = defineEmits(['changeAside'])

// 自定义按钮点击事件,侧边栏的收缩按钮
const collapseAside = () => {
    emit('changeAside')
}

// 登出按钮
const LogOut = ()=>{
  
}

</script>

<style>
.el-header {
    width: 100%;
    background-color: #fff;
    color: var(--el-text-color-primary);
    box-shadow: var(--el-box-shadow);
}

.toolbar {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    height: 100%;
    right: 20px;
    text-align: right;
}

.el-dropdown-menu__item {
    width: 120px;
}

.icon-color {
    color: white;
}
</style>
aside组件
<script setup>
import { Monitor } from '@element-plus/icons-vue';
import { ref } from 'vue'

const settings = defineProps({
  collapse: Boolean,
  width: String
})

const iconColor = ref('color:#F8FAFB')
</script>

<template>
  <el-aside :width="settings.width">
    <el-scrollbar>
      <el-menu :default-openeds="['1', '3']" 
      :collapse="settings.collapse" active-text-color="#ffd04b"
        background-color="#304156" text-color="#FFFFFF" router="true">

      <el-menu-item index="1">
      <el-icon><Monitor /></el-icon>
      <template #title>仪表板</template>
      </el-menu-item>
     
      <el-sub-menu index="2">
          <template #title>
            <el-icon>
              <Menu />
            </el-icon><span>文章管理</span>
          </template>
          <el-menu-item index="/admin/articles">文章管理列表</el-menu-item>
        </el-sub-menu>

        <el-sub-menu index="3">
          <template #title>
            <el-icon>
              <Message />
            </el-icon><span>评论管理</span>
          </template>
          <el-menu-item index="/admin/comments">评论管理列表</el-menu-item>
        </el-sub-menu>

        <el-sub-menu index="4">
          <template #title>
            <el-icon>
              <Files />
            </el-icon><span>模块管理</span>
          </template>
          <el-menu-item index="/admin/blocks">模块管理列表</el-menu-item>
        </el-sub-menu>

    </el-menu>
    </el-scrollbar>
  </el-aside>
</template>

<style scoped>
.el-aside {
  height: 100vh;
  overflow: hidden;
  box-shadow: var(--el-box-shadow-lighter);
}

.el-scrollbar {
  height: 100vh;
  overflow: hidden;
  background-color: #304156;
}

.el-menu {

  border-right: none;
}</style>
动态路由
import { createRouter, createWebHistory } from 'vue-router'
import HomeView from '@/views/HomeView.vue'

const router = createRouter({
  history: createWebHistory(import.meta.env.BASE_URL),
  routes: [
    {
      path: '/',
      name: '仪表盘',
      component: HomeView
    },
    {
      path: '/article',
      name: '文章管理',
      component: HomeView,
      children: [
        {
          path: '/id',
          name: '文章管理列表',
          component: () => (
            '../views/A.vue'
          )
        }
      ]
   },
   {
    path: '/comment',
    name: '评论管理',
    component: HomeView,
    children: [
      {
        path: '/id',
        name: '评论管理列表',
        component: () => (
          '../views/B.vue'
        )
      }
    ],
    
 },
  ]
})

export default router

侧边栏代码改进

<template>
  <el-aside :width="settings.width">
    <el-scrollbar>
      <el-menu :default-openeds="['1', '3']" 
      :collapse="settings.collapse" active-text-color="#ffd04b"
        background-color="#304156" text-color="#FFFFFF" router="true">
    <template v-for="menu in this.$router.options.routes" :key="menu">
    <!-- 当前菜单项没有子菜单时 -->
    <el-menu-item v-if="!menu.children" :index="menu.path">
      <el-icon><component :is="menu.icon" ></component> </el-icon>
      <span>{{menu.name}}</span>
    </el-menu-item>
    
    <!-- 当前菜单项有子菜单时 -->
    <el-sub-menu v-else-if="menu.children" :index="menu.path">
      <template #title>
        <el-icon><component :is="menu.icon" ></component> </el-icon>
        <span>{{menu.name}}</span>
      </template>
      
      <!-- 循环遍历子菜单项 -->
      <el-menu-item v-for="child in menu.children" :key="child" :index="child.path">{{child.name}}</el-menu-item>
    </el-sub-menu>
  </template>
  1. Element Plus Icon组件:如果你正在使用 Element Plus UI 库,你可以直接使用其提供的 Icon 组件来显示图标。你可以在路由配置中使用该组件作为路由菜单的一部分,例如在meta字段中定义图标名称,然后在导航菜单的组件中动态渲染它。
  2. SVG图标:你可以使用 SVG 格式的图标,并在你的 Vue 组件中直接引入它们。这种方法允许你在路由配置中指定不同的 SVG 文件,并在导航菜单中显示它们。
  3. @iconify/vue:这是一个流行的图标库,提供了多种图标集的支持。你可以通过这个库来在你的 Vue 项目中使用图标,包括在路由中。你可以选择适合你项目的图标集,并在路由配置中指定相应的图标类名。

整合

<script setup>
import { ref } from 'vue'

// 组件注册
import Header from '@/components/Header.vue'

import Aside from '@/components/Aside.vue'

const asideSettings = ref({
    isCollapse:true,
    width:'200'
})

// 给子组件绑定事件,通过子组件emit从而改变父组件的值
const changeAside = ()=>{
   asideSettings.value.isCollapse = !asideSettings.value.isCollapse
   if(asideSettings.value.isCollapse){
    asideSettings.value.width = "64"
   }else{
    asideSettings.value.width = "200"
   }
}

</script>
<template>
  <el-container style="min-height: 100vh;min-width: 100vw;overflow: hidden;">
    <Aside :collapse="asideSettings.isCollapse" :width="asideSettings.width"></Aside>
    <el-container style="height: 100vh;width:100%;display: flex;flex-direction: column;">
      <Header :isCollapse="asideSettings.isCollapse"  @changeAside="changeAside"></Header>
      <el-main>
        <div v-if="$route.path === '/'">
          <el-card>
            <h1>文本内容</h1>
          </el-card>
        </div>
        <router-view v-else></router-view>
        
      </el-main>
    </el-container>
  </el-container>
</template>

<style scoped>

body{
  background-color: #eee;
  max-width: 100vw;
  overflow: hidden;
}

.el-main {
  width: 100%;
  padding: 0;
  height: 100vh;
  overflow-x: hidden;
}

</style>

二、Element Plus 基本样式

2.1按钮

<template>
        <h3>按钮</h3>
        <el-button>默认按钮</el-button>
        <el-button type="primary">主要按钮</el-button>
        <el-button type="success">成功按钮</el-button>
        <el-button type="info">信息按钮</el-button>
        <el-button type="warning">警告按钮</el-button>
        <el-button type="danger">危险按钮</el-button>

        <hr>
        <h3>按钮属性</h3>
        <el-button plain>朴素按钮</el-button>
        <el-button round>圆角按钮</el-button>
        <el-button circle>圆</el-button>
        <el-button disabled>禁用按钮</el-button>
        <el-button loading>加载中</el-button>

        <hr>
        <h3>尺寸</h3>
        <el-button size="large">大型按钮</el-button>
        <el-button>默认按钮</el-button>
        <el-button size="small">小型按钮</el-button>
    </template>

2.2图标

<template>
        
        <h3>图标</h3>
        <el-icon><Plus /></el-icon>
        <el-icon><Edit /></el-icon>
        <el-icon><Delete /></el-icon>
        <el-icon class="is-loading"><Loading /></el-icon>

        <hr>
        <h3>属性</h3>
        <el-icon size="30" color="red"><Search /></el-icon>

        <hr>
        <h3>按钮</h3>
        <el-button type="primary">
            <el-icon><Search /></el-icon>
            <span> 搜索 </span>
        </el-button>

        <el-button type="primary">
            <el-icon><Search /></el-icon>
        </el-button>

        <el-button type="primary" circle>
            <el-icon><Search /></el-icon>
        </el-button>

        <hr>
        <h3>按钮组</h3>
        <el-button-group>
            <el-button type="primary">
                <el-icon><Plus /></el-icon>
            </el-button>

            <el-button type="primary">
                <el-icon><Edit /></el-icon>
            </el-button>

            <el-button type="primary">
                <el-icon><Delete /></el-icon>
            </el-button>
        </el-button-group>

    </template>

2.3提示框

<script setup lang="ts">
 import { ElMessage, ElMessageBox, ElNotification } from 'element-plus'

// 消息
const openMsg = () => {
    ElMessage({
        type: 'success', // success | warning | info | error
        message: 'hello world',
        showClose: true
    })
}

// 确认框
const openConfirm = () => {
    ElMessageBox.confirm('确认删除?', '标题', {
        type: 'warning',
        confirmButtonText: '确认',
        cancelButtonText: '取消'
    }).then(() => {
        console.log('确认')
    }).catch(() => {
        console.log('取消')
    })
}

// 通知
const openNotifiy = () => {
    ElNotification({
        title: '标题',
        message: '烟雨平生',
        duration: 1500 // 展示时间 [单位:毫秒]
    })
}

// 通知2
const openNotifiy2 = () => {
    ElNotification({
        type: 'success', // success | warning | info | error
        title: '标题',
        message: 'hello world',
        duration: 1500,
        position: 'bottom-right'
    })
}
</script>
<template>
<div>
    <el-button @click="openMsg">消息</el-button>
    <el-button @click="openConfirm">确认框</el-button>
    <el-button @click="openNotifiy">通知</el-button>
    <el-button @click="openNotifiy2">通知2</el-button>
</div>
</template>

2.4导航

详情请见导航

2.5标签页

标签页详情请见标签页

<script setup lang="ts">
import { ref, reactive } from 'vue'

        //默认选中的标签名称
        const selectedName = ref("2")

        //选中标签触发的回调
        const tabClick = (tab, event) => {
            console.log("tab", tab.props, "event", event)
        }

        const tab = reactive({
            arr: [
                { name: "1", title: '烟雨', content: '内容1' },
                { name: "2", title: '烟雨平生', content: '内容2' },
                { name: "3", title: 'com', content: '内容3' },
            ]
        })

        //添加
        const tabAdd = () => {
            let index = tab.arr.length
            index++

            tab.arr.push({
                name: index,
                title: '新选项卡' + index,
                content: '内容' + index
            })
        }

        //移除
        const tabRemove = (name) => {
            console.log("name:", name)

            const index = tab.arr.findIndex((value) => {
                return value.name === name
            })

            tab.arr.splice(index, 1) //移除元素
        }

</script>
<template>
<div>
    <h3>标签页</h3>
        <el-tabs v-model="selectedName" @tab-click="tabClick">
            <el-tab-pane label="烟雨" name="1">内容1</el-tab-pane>
            <el-tab-pane label="烟雨平生" name="2">内容2</el-tab-pane>
            <el-tab-pane label="com" name="3">内容3</el-tab-pane>
        </el-tabs>

        <h3>卡片风格</h3>
        <el-tabs v-model="selectedName" @tab-click="tabClick" type="card">
            <el-tab-pane label="烟雨" name="a">内容1</el-tab-pane>
            <el-tab-pane label="烟雨平生" name="b">内容2</el-tab-pane>
            <el-tab-pane label="com" name="c">内容3</el-tab-pane>
        </el-tabs>

        <h3>带有边框的卡片风格</h3>
        <el-tabs v-model="selectedName" @tab-click="tabClick" type="border-card">
            <el-tab-pane label="烟雨" name="A">内容1</el-tab-pane>
            <el-tab-pane label="烟雨平生" name="B">内容2</el-tab-pane>
            <el-tab-pane label="com" name="C">内容3</el-tab-pane>
        </el-tabs>

        <h3>动态添加</h3>
        <el-button @click="tabAdd">添加</el-button>

        <el-tabs v-model="selectedName" @tab-remove="tabRemove" closable type="card">
            <el-tab-pane v-for="(value, key) in tab.arr" :key="value.name" :label="value.title" :name="value.name">
                {{ value.content }}
            </el-tab-pane>
        </el-tabs>

</div>
</template>

2.6输入框

详情请见输入框 

<script setup lang="ts">
import { ref } from 'vue'
        
        const name = ref('')
        const password = ref('')
        const content = ref('烟雨平生')
        const url = ref('com')
        const url2 = ref('code')
        const email = ref('123456')

        //const selected = ref('')
        const selected = ref('2') //选中的下拉框
</script>
<template>
 <div style="width: 300px;">
            <!-- clearable 可一键清空 -->
            <h3>输入框</h3>
            <el-input v-model="name" clearable placeholder="请输入用户名" />

            <!-- show-password 可切换显示隐藏密码 -->
            <h3>密码框</h3>
            <el-input v-model="password" show-password placeholder="请输入密码" />

            <h3>文本域</h3>
            <el-input type="textarea" v-model="content" rows="2" />

            <h3>输入内容长度限制 - 输入框</h3>
            <el-input v-model="name" maxlength="10" show-word-limit />

            <h3>输入内容长度限制 - 文本域</h3>
            <el-input type="textarea" v-model="content" maxlength="20" rows="3" show-word-limit />

            <h3>尺寸</h3>
            大 <el-input size="large" />
            默认 <el-input />
            小 <el-input size="small" />

            <h3>前置</h3>
            <el-input v-model="url">
                <template #prepend>https://</template>
            </el-input>

            <h3>后置</h3>
            <el-input v-model="email">
                <template #append>@qq.com</template>
            </el-input>

            <h3>前置后置</h3>
            <el-input v-model="url2">
                <template #prepend>https://</template>
                <template #append>.com</template>
            </el-input>

            <h3>前置后置扩展 - 搜索</h3>
            <el-input placeholder="请输入课程名称">
                <template #prepend>
                    <el-select v-model="selected" placeholder="请选择" style="width: 100px;">
                        <el-option label="前端" value="1" />
                        <el-option label="后端" value="2" />
                        <el-option label="服务端" value="3" />
                    </el-select>
                </template>
                <template #append>
                    <el-button>
                        <el-icon><Search /></el-icon>
                    </el-button>
                </template>
            </el-input>
        </div>
</template>

 2.7单选框、复选框

详情请见单选框

多选框

2.8下拉框 

详情请见下拉选择器

<script setup lang="ts">
 import { ref,reactive } from 'vue'
        
        const selected = ref('2')
        const selected2 = ref('')
        const selected3 = ref('C')
        const selected4 = ref(['1','3'])

        const data = reactive({
            options: [
                { value: 'A', label: '前端', },
                { value: 'B', label: '后端', },
                { value: 'C', label: '服务端', }
            ]
        })

        //回调
        const selectChange = (val) => {
            console.log("selectChange:", val)
        }
</script>
<template>
  <div style="width: 300px;">
            <h3>下拉框</h3>
            <el-select v-model="selected" placeholder="请选择">
                <el-option value="1" label="前端" />
                <el-option value="2" label="后端" />
                <el-option value="3" label="服务端" />
            </el-select>

            <h3>下拉框 - 事件绑定</h3>
            <el-select v-model="selected2" @change="selectChange" placeholder="请选择">
                <el-option value="a" label="前端" />
                <el-option value="b" label="后端" />
                <el-option value="c" label="服务端" />
            </el-select>

            <h3>动态下拉框</h3>
            <el-select v-model="selected3" placeholder="请选择">
                <el-option v-for="item in data.options" 
                :value="item.value" 
                :label="item.label"
                :key="item.value" />
            </el-select>

            <h3>多选 - multiple</h3>
            <el-select v-model="selected4" multiple @change="selectChange" placeholder="请选择">
                <el-option value="1" label="前端" />
                <el-option value="2" label="后端" />
                <el-option value="3" label="服务端" />
            </el-select>
        </div>
</template>

 2.9日期选择器

详情请见日期选择器

2.10表单

2.11对话框

详情请见对话框

 <script setup>
        import { ref } from 'vue'

        const data = ref({
            name: '',
            radio: '',
            checkbox: [],
            date: '',
            select: '',
            multipleSelect: [],
            textarea: ''
        })

        const add = () => {
            console.log(data.value)
        }

        const reset = () => {
            data.value = {
                name: '',
                radio: '',
                checkbox: [],
                date: '',
                select: '',
                multipleSelect: [],
                textarea: ''
            }
        }

        //对话框
        const dialog = ref(false)

        const dialogClose = () => {
            console.log("关闭")
        }
    </script>

    <template>
        <el-button @click="dialog = true">打开</el-button>

        <!-- draggable 允许拖拽 -->
        <el-dialog v-model="dialog" width="500" title="标题" draggable @close="dialogClose">
            <el-form label-width="80">
                <el-form-item label="文本框">
                    <el-input v-model="data.name" placeholder="请填写名称" />
                </el-form-item>

                <el-form-item label="单选框">
                    <el-radio-group v-model="data.radio">
                        <el-radio value="1">前端</el-radio>
                        <el-radio value="2">后端</el-radio>
                        <el-radio value="3">服务端</el-radio>
                    </el-radio-group>
                </el-form-item>

                <el-form-item label="复选框">
                    <el-checkbox-group v-model="data.checkbox">
                        <el-checkbox value="a">前端</el-checkbox>
                        <el-checkbox value="b">后端</el-checkbox>
                        <el-checkbox value="c">服务端</el-checkbox>
                    </el-checkbox-group>
                </el-form-item>

                <el-form-item label="日期时间">
                    <el-date-picker v-model="data.date" type="datetime" value-format="YYYY-MM-DD HH:mm:ss" />
                </el-form-item>

                <el-form-item label="下拉框">
                    <el-select v-model="data.select" placeholder="请选择">
                        <el-option value="A" label="前端" />
                        <el-option value="B" label="后端" />
                        <el-option value="C" label="服务端" />
                    </el-select>
                </el-form-item>

                <el-form-item label="多选框">
                    <el-select v-model="data.multipleSelect" multiple placeholder="请选择">
                        <el-option value="AA" label="前端" />
                        <el-option value="BB" label="后端" />
                        <el-option value="CC" label="服务端" />
                    </el-select>
                </el-form-item>

                <el-form-item label="文本域">
                    <el-input type="textarea" v-model="data.textarea" rows="2" placeholder="请填写内容" />
                </el-form-item>

                <el-form-item>
                    <el-button type="primary" @click="add">添加</el-button>
                    <el-button @click="reset">重置</el-button>
                </el-form-item>
            </el-form>
        </el-dialog>
    </template>


 2.12表格

详情请见表格

 三、实战进阶

3.1设置布局

栅格布局:通过基础的24分栏,迅速便捷创建布局,

el-row 代表行,里面嵌套el-col
el-col  代表列,总分为24列
属性
gutter列间隔
span占据的列数

<script setup>
import { ref } from 'vue' 
</script>

<template>
 
<div>
    <h3>这是A页面的栅格</h3>
    <el-row  :gutter="10">
      <el-col :span="12">
          <div style="background: green">第一列</div>
      </el-col>
      <el-col :span="12">
          <div style="background: orange">第二列</div>
      </el-col>
    </el-row>
    <br>
     <el-row  :gutter="10">
      <el-col :span="8">
        <div style="background: green">第一列</div>
      </el-col>
      <el-col :span="8">
        <div style="background: orange">第二列</div>
      </el-col>
       <el-col :span="8">
        <div style="background: blueviolet">第三列</div>
      </el-col>
     </el-row>

      <br>
     <el-row  :gutter="10">
      <el-col :span="4">
        <div style="background: green">第一列</div>
      </el-col>
      <el-col :span="5">
        <div style="background: orange">第二列</div>
      </el-col>
       <el-col :span="8">
        <div style="background: blueviolet">第三列</div>
      </el-col>
     </el-row>
</div>
</template>

<style scoped></style>

 3.2表单:校验规则

表单包含输入框,单选框,下拉选择,多选框等用户输入的组件。使用表单可以收集,验证和提交数据。
表单项常用组件:

el-input: 输入框
el-select: 下拉框
el-checkbox-group 多选框
el-radio-group:单选框

表单:校验规则

表单组件允许你校验用户的宿儒是否符合规范,来帮助你找到和纠正错误
使用流程

1.定义校验规则
2el-form指定“rules” 属性传入定义的校验规则
3.el-form-item指定“prop”属性与校验规则名称对应

<script setup lang="ts">
import { reactive ,ref} from 'vue';
import { ElForm, FormInstance , FormRules} from 'element-plus';
// 导入 ElForm 组件的实例类型

interface FormModel {
  name: string;
  age: string;
  sex: string;
}

const form = reactive<FormModel>({
  name: 'BO',
  age: '',
  sex: ''
});

const formRules = {
  name: [
    { required: true, message: '请输入姓名', trigger: 'blur' },
    { min: 2, max: 5, message: '长度在 3 到 5 个字符', trigger: 'blur' }
  ],
  age: [
    { required: true, message: '请输入年龄', trigger: 'blur' }
  ],
  sex: [
    { required: true, message: '请选择性别', trigger: 'change' }
  ]
};

const formRef = ref<FormInstance>()
// 定义表单引用并赋予正确类型
const resetForm = (formEl: FormInstance | undefined) => {
  if (!formEl) return
  formEl.resetFields()
}
const submitForm = async (formEl: FormInstance | undefined) => {
  if (!formEl) return
  await formEl.validate((valid, fields) => {
    if (valid) {
      
      console.log('submit!')
      console.log(form)
      formEl.resetFields()
    } else {
      console.log('error submit!', fields)
    }
  })
}
</script>
<template>
<div>
    <H3>这是B界面</H3>
    <el-form :model="form" :rules = "formRules" ref ="formRef">
        <el-form-item label="姓名" prop="name">
          <el-input v-model="form.name" />
        </el-form-item>
        <el-form-item label="年龄" prop="age">
          <el-input v-model="form.age"/>
        </el-form-item>
        <el-form-item label="性别" prop="sex">
          <el-select v-model="form.sex" placeholder="请选择性别">
            <el-option label="男" value="男" />
            <el-option label="女" value="女" />
          </el-select>
        </el-form-item>
        <el-form-item>
          <el-button type="primary" @click="submitForm(formRef)">提交</el-button>
          <el-button  @click="resetForm(formRef)">重置</el-button>
        </el-form-item>
      </el-form>
</div>
</template>

3.3表格

边框,宽度,固定列

表格属性:
border:是否带有纵向边框
data:表格使用的数据,自动渲染
列属性:
prop: 键名,对应数据中的字段
label:列名
width:列宽度
fixed:列是否固定在左侧或者右侧, true 表示固定在左侧
fixed= "right"

卡片

悬浮展示数据,类似于卡片效果。

详情请见卡片

<script setup lang="ts">
import { ref, reactive } from 'vue';
const tableData = [
  {
    date: '2016-05-03',
    name: 'Tom',
    address: 'No. 189, Grove St, Los Angeles',
  },
  {
    date: '2016-05-02',
    name: 'Tom',
    address: 'No. 189, Grove St, Los Angeles',
  },
  {
    date: '2016-05-04',
    name: 'Tom',
    address: 'No. 189, Grove St, Los Angeles',
  },
  {
    date: '2016-05-01',
    name: 'Tom',
    address: 'No. 189, Grove St, Los Angeles',
  },
]

</script>
<template>
<div>
    <el-card class="box-card">
    <template #header>
      <div class="card-header">
        <span>用户列表</span>
      </div>
    </template>
    <el-button type="primary">新增数据</el-button>

    <div style="margin:0 10px">
    <el-table :data="tableData" style="width: 100%">
    <el-table-column prop="date" label="日期" width="180" align = 'center' />
    <el-table-column prop="name" label="姓名" width="180" align = 'center'/>
    <el-table-column prop="address" label="地址" align = 'center'/>
   </el-table>
    </div>
   
    </el-card>
</div>
</template>

弹窗

<script setup lang="ts">
import { computed,  ref, reactive, watch } from 'vue';
import { ElMessage, ElMessageBox } from 'element-plus'
const dialogFormVisible = ref(false)

const GlobalIndex = ref(-1)

const name = ref('')
interface User {
  name: string;
  city: string;
  age: number;

}

const tableData = reactive<Array<User>>([
  {
    date: '2016-05-03',
    name: 'Tom1',
    address: 'No. 189, Grove St, Los Angeles',
  },
  {
    date: '2016-05-02',
    name: 'Tom2',
    address: 'No. 189, Grove St, Los Angeles',
  },
  {
    date: '2016-05-04',
    name: 'Tom3',
    address: 'No. 189, Grove St, Los Angeles',
  },
  {
    date: '2016-05-01',
    name: 'Tom4',
    address: 'No. 189, Grove St, Los Angeles',
  },
])
const now =  reactive(new Date());
let form = reactive({
  date: now.toISOString().substring(0, 10),
  name: '',
  address: '',
})

const handeAdd = () => {
    form = reactive({
      date: now.toISOString().substring(0, 10),
      name: '',
      address: '',
    })
    dialogFormVisible.value = true
}
const save = () => {
  if(GlobalIndex.value >=0){
    console.log(GlobalIndex.value)
   tableData[GlobalIndex.value] = form
   GlobalIndex.value = -1
  }
  else{
    tableData.push(form)
  }
  dialogFormVisible.value = false
}

const handleEdit = (row,index) => {
  const newobj = Object.assign({}, row)
  form = reactive(newobj)
  GlobalIndex.value = index
  dialogFormVisible.value = true
}

const handleDelete = (index: number) => {
  ElMessageBox.confirm('是否删除该条数据?', '提示', {
    confirmButtonText: '确定',
    cancelButtonText: '取消',
    type: 'warning'
  }).then(() => {
    tableData.splice(index, 1); // 删除指定索引的数据
    ElMessage({
      type: 'success',
      message: '删除成功!'
    });
  }).catch(() => {
    ElMessage({
      type: 'info',
      message: '已取消删除'
    });
  });
};

// 搜索关键字状态管理
const searchValue = ref('');

// 定义计算属性,根据搜索关键字过滤表格数据
const filterTableData = computed(() =>
  tableData.filter(
    (data) =>
      !searchValue.value ||
      data.name.toLowerCase().includes(searchValue.value.toLowerCase())
  )
);

// 监听 searchValue 的变化
watch(searchValue, (newValue, oldValue) => {
  if (!newValue) {
    filterTableData.value = tableData;
  }
});
// 搜索功能的实现
const search = () => {
  searchValue.value = name.value;
  console.log(searchValue.value); // 更新搜索关键字为输入框的值
};

</script>
<template>
<div>
    <el-card class="box-card">
    <template #header>
      <div class="card-header">
        <span>用户列表</span>
      </div>
    </template>
    <!-- Element UI Input 组件,用于输入搜索名称 -->
    <el-input style="width:300px" placeholder="请输入名称" v-model="name" clearable></el-input>

    <!-- Element UI 主题样式按钮,点击后执行搜索动作 -->
    <el-button type="primary" @click="search" style="margin-left:5px">搜索</el-button>
    <el-button type="primary" @click="handeAdd" >新增数据</el-button>

    <div style="margin:0 10px">
    <el-table :data="filterTableData" style="width: 100%">
    <el-table-column prop="date" label="日期" sortable  width="180" align = 'center' />
    <el-table-column prop="name" label="姓名" width="180" align = 'center'/>
    <el-table-column prop="address" label="地址" align = 'center'/>
    <el-table-column  align = 'right'>
        <template #default="scope">
        <el-button link type="primary" size="small" @click="handleEdit(scope.row,scope.$index)"
          >编辑</el-button>
        <el-button link type="danger" size="small" @click.prevent="handleDelete(scope.$index)">删除</el-button>
      </template>
    </el-table-column>
   </el-table>
    </div>

    <el-dialog v-model="dialogFormVisible" title="信息"  width="50%"> 
    <el-form :model="form" label-width="100px" style="padding-right: 30px;" >
      <el-form-item label="日期" >
        <el-input v-model="form.date" autocomplete="off" />
      </el-form-item>
      <el-form-item label="姓名" >
        <el-input v-model="form.name" autocomplete="off" />
      </el-form-item>
      <el-form-item label="地址" >
        <el-input v-model="form.address" autocomplete="off" />
      </el-form-item>
    </el-form>
    <template #footer>
      <div class="dialog-footer">
        <el-button @click="dialogFormVisible = false">取消</el-button>
        <el-button type="primary" @click="save">
          确认
        </el-button>
      </div>
    </template>
  </el-dialog>

  </el-card>

</div>

</template>

3.4轮播图

<script setup lang="ts">
import img1 from '@/assets/lunbo1.png';
import img2 from '@/assets/lunbo2.png';
import img3 from '@/assets/lunbo3.png';
import img4 from '@/assets/lunbo4.png';
const carouselData = [
  { url: img1 },
  { url: img2 },
  { url: img3 },
  { url: img4 },
]
</script>
<template>
<div>
    <el-carousel :interval="4000" type="card" height="300px">
        <el-carousel-item v-for="item in carouselData" :key="item.url">
            <img :src="item.url" alt="轮播图片" style="width: 100%; height: 200px;"/>
            <h3>{{ item.url }}</h3>
      </el-carousel-item>
  </el-carousel>
</div>
</template>

<style>
.el-carousel__item h3 {
  color: #475669;
  opacity: 0.75;
  line-height: 200px;
  margin: 0;
  text-align: center;
}

.el-carousel__item:nth-child(2n) {
  background-color: #99a9bf;
}

.el-carousel__item:nth-child(2n + 1) {
  background-color: #d3dce6;
}

</style>

3.5面包屑

详请参考https://juejin.cn/post/7087003440773070856

路由

<template>
    <div class="breadcrumb">
      <!-- 使用 element-plus 的面包屑组件 -->
      <el-breadcrumb separator="/">
        <!-- 循环渲染面包屑导航项 -->
        <el-breadcrumb-item v-for="(crumb, index) in breadcrumbs" :key="index">
          <!-- 使用路由链接包装每个面包屑导航项 -->
          <router-link :to="crumb.to">{{ crumb.title }}</router-link>
        </el-breadcrumb-item>
      </el-breadcrumb>
    </div>
  </template>
  
  <script setup lang="ts">
  // 导入所需的模块
import { computed } from 'vue';
import { useRouter } from 'vue-router';
  
  // 获取当前路由实例
  const router = useRouter();
  
  // 使用 computed 函数计算面包屑导航项
  const breadcrumbs = computed(() => {
    // 从当前路由匹配的规则中筛选出带有 isBreadcrumb 元信息的规则
    const matchedRoutes = router.currentRoute.value.matched.filter(route => route.meta && route.meta.isBreadcrumb);
    // 根据匹配到的路由规则生成面包屑导航项
    return matchedRoutes.map(route => ({
      to: route.path, // 面包屑导航项的链接路径
      title: route.meta.title, // 面包屑导航项的标题
    }));
  });
  </script>
  
  <style scoped>
  .breadcrumb {
    display: inline-flex;
    align-items: center;
    justify-content: flex-start; 
    text-align: right;
    margin: 0 20px;
    flex: 1;
  }
  </style>

 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

2-dubbo源码 : 源码环境搭建

好的开始是成功的一半&#xff0c;阅读源码也是一样。 很多同学在下定决心阅读一个开源框架之后&#xff0c;就一头扎进去&#xff0c;迷失在代码“迷宫”中。此时&#xff0c;有同学意识到&#xff0c;需要一边 Debug 一边看&#xff1b;然后又有一批同学在搭建源码环境的时候…

鸿蒙一次开发,多端部署(十五)常见问题

如何查询设备类型 设备类型分为default&#xff08;默认设备&#xff09;、tablet、tv、wearable、2in1等&#xff0c;有多种查询设备类型的方式。 通过命令行的方式查询设备类型。 通过命令行查询指定系统参数&#xff08;const.product.devicetype&#xff09;进而确定设备…

Java基础-常用类

文章目录 1.Math类2.System类1.exit代码 结果2.arraycopy参数解释代码结果 3.currentTimeMillens代码结果 3.大数处理方案基本介绍BigInteger类介绍代码结果 BigDecimal类介绍代码结果 4.日期类对于IDEA类图中的属性![image-20240101190844530](https://img-blog.csdnimg.cn/im…

能降低嵌入式系统功耗的三个技术

为电池寿命设计嵌入式系统已经成为许多团队重要的设计考虑因素。优化电池寿命的能力有助于降低现场维护成本&#xff0c;并确保客户不需要不断更换或充电电池&#xff0c;从而获得良好的产品体验。 团队通常使用一些标准技术来提高电池寿命&#xff0c;例如将处理器置于低功耗…

RIPGeo代码理解(六)main.py(运行模型进行训练和测试)

​代码链接:RIPGeo代码实现 ├── preprocess.py # 预处理数据集并为模型运行执行IP聚类 ├── main.py # 运行模型进行训练和测试 ├── test.py #加载检查点,然后测试 一、导入各种模块和数据库 import torch.nnfrom lib.utils import * import argparse i…

162、应急响应——网站入侵篡改指南Webshell内存马查杀漏洞排查时间分析

文章目录 IIS&.NET—注入—基于时间配合日志分析Apache&PHP—漏洞—基于漏洞配合日志分析Tomcat&JSP—弱口令—基于后门配合日志分析查杀常规后门查杀内存马 需要了解&#xff1a; 异常检测、处置流程、分析报告等 网站被入侵会出现异常&#xff1a;流量异常、防护…

Git版本控制

这是两个学习Git推荐必看的文档&#xff0c;第一个链接是Git的官方权威文档&#xff0c;第二个链接是国内程序员在开发中&#xff0c;总结的Git快速入门教程&#xff0c;掌握这个&#xff0c;也足够应付在工作中的场景。 Git权威书籍《ProGit》中文版https://gitee.com/progit…

Web框架开发-Ajax

一、 Ajax准备知识:json 1、json(Javascript Obiect Notation,JS对象标记)是一种轻量级的数据交换格式 1 2 它基于 ECMAScript (w3c制定的js规范)的一个子集,采用完全独立于编程语言的文本格式来存储和表示数据。 简洁和清晰的层次结构使得 JSON 成为理想的数据交换语言。…

从redis安装到使用再到源码和底层原理分析指南【万字长文】

Redis 安装redis-cli记录单线程多路IO复用Redis字符串Redis列表 事务Redis悲观锁和乐观锁AOF主从集群概念slots Redis应用问题解决缓存穿透缓存击穿缓存雪崩分布式锁 重启和停止redis server配置登陆密码 配置外网访问Redis源码学习server守护进程实现server处理信号redis obje…

每日一题——LeetCode2549.统计桌面上的不同数字

方法一 模拟 维护一个数组arr&#xff0c;初始值为n,每次循环将arr[i] % j(1<j<n) 如果结果为1则将j加入&#xff0c; 最后将arr转为Set集合去重&#xff0c;Set的长度就是答案 var distinctIntegers function(n) {let arr[]arr.push(n)for(let i0;i<arr.length;i…

JAVA毕业设计131—基于Java+Springboot+Vue的餐厅点餐系统(源代码+数据库+4000字文档)

毕设所有选题&#xff1a; https://blog.csdn.net/2303_76227485/article/details/131104075 基于JavaSpringbootVue的餐厅点餐系统(源代码数据库4000字文档)131 一、系统介绍 本项目前后端分离&#xff0c;分为管理员、用户两种角色 1、用户&#xff1a; 注册、登录、点餐…

SpringBoot2.x 整合SpringDocJavadocknife4j实现无注解零入侵式接口文档

说明 基于 javadoc 无注解零入侵生成规范的 openapi 结构体。 文档工具使用 由于框架采用 openapi 行业规范 故市面上大部分的框架均支持 可自行选择 例如: apifox apipost postman torna knife4j 等 根据对应工具的文档接入即可 Swagger升级SpringDoc指南 常见功能如下 其他…

RHEL9部署Docker环境

华子目录 Docker引擎架构docker引擎架构示意图执行过程示例 RHEL9上安装Docker1.系统要求2.安装yum-utils工具包3.yum安装docker-ce4.配置docker镜像加速docker拉取镜像的过程配置阿里云镜像仓库重新加载守护进程重启Docker服务 5.拉取并运行hello-world镜像6.测试是否安装成功…

【Godot4.2】基础知识 - Godot中的2D向量

概述 在Godot中&#xff0c;乃至一切游戏编程中&#xff0c;你应该都躲不开向量。这是每一个初学者都应该知道和掌握的内容&#xff0c;否则你将很难理解和实现某些其实原理非常简单的东西。 估计很多刚入坑Godot的小伙伴和我一样&#xff0c;不一定是计算机专业或编程相关专…

ROS机器人入门第二课:ROS集成开发环境搭建

文章目录 ROS机器人入门第二课&#xff1a;ROS集成开发环境搭建一、安装终端&#xff08;一&#xff09;安装Terminator&#xff08;二&#xff09;添加到收藏夹&#xff08;三&#xff09;Terminator 常用快捷键第一部份&#xff1a;关于在同一个标签内的操作第二部份&#xf…

【开发环境搭建篇】Nacos的安装和配置

作者介绍&#xff1a;本人笔名姑苏老陈&#xff0c;从事JAVA开发工作十多年了&#xff0c;带过大学刚毕业的实习生&#xff0c;也带过技术团队。最近有个朋友的表弟&#xff0c;马上要大学毕业了&#xff0c;想从事JAVA开发工作&#xff0c;但不知道从何处入手。于是&#xff0…

01-机器学习概述

机器学习的定义 机器学习是一门从数据中研究算法的科学学科。 机器学习直白来讲&#xff0c; 就是根据已有的数据&#xff0c;进行算法选择&#xff0c;并基于算法和数据 构建模型&#xff0c;最终对未来进行预测。 机器学习就是一个模拟人决策过程的一种程序结构。 机器学…

系统大屏可视化展示平台解决方案(原件)

1.系统概述 1.1.需求分析 1.2.重难点分析 1.3.重难点解决措施 2.系统架构设计 2.1.系统架构图 2.2.关键技术 2.3.接口及要求 3.系统功能设计 3.1.功能清单列表 3.2.数据源管理 3.3.数据集管理 3.4.视图管理 3.5.仪表盘管理 3.6.移动端设计 3.7.系统权限设计 3.8.数据查询过程设…

隐私计算实训营学习三:隐私计算框架的架构和技术要点

文章目录 一、隐语架构二、产品层三、算法层3.1 PSI与PIR3.2 Data Analysis-SCQL3.3 Federated Learning 四、计算层4.1 混合调度编译-RayFed4.2 密态引擎4.3 密码原语YACL 五、资源管理层六、互联互通七、跨域管控 一、隐语架构 1、完备性&#xff1a;支持多种技术&#xff0…

QT:QTableWidget表格中加入勾选框

1.新建QTableWidget控件&#xff1a;tableWidget_TestResult 2.举例&#xff1a;在第一行第一列添加一个勾选框 //添加选择框QTableWidgetItem* check0 new QTableWidgetItem();check0->setCheckState(Qt::Checked);ui->tableWidget_TestResult->setItem(0, 0, chec…