import { createApp } from 'vue'
// 引入elementPlus js库 css库
import ElementPlus from 'element-plus'
import 'element-plus/dist/index.css'
//中文语言包
import zhCn from 'element-plus/es/locale/lang/zh-cn'
//图标库
import * as ElementPlusIconsVue from '@element-plus/icons-vue'
import App from './App.vue'
//router单独的配置文件
import router from './router'
//typescript js语法做了类型限制
//对象要先设定类型 使用变量 要标记类型
let myVue = createApp(App)
//vue插件 与vue高度集成
//启动router插件
myVue.use(router)
//启用elementPlus插件
myVue.use(ElementPlus, {
locale: zhCn,
})
//把所有图标导入vue全局组件库
for (const [key, component] of Object.entries(ElementPlusIconsVue)) {
myVue.component(key, component)
}
myVue.mount('#app')
2elementPlus常用组件
2.2基础组件 按钮
按钮主要是样式 比较简单
<template>
<!-- 基础组件 -->
<el-button :loading-icon="Eleme" :loading="loadStauts" >Default</el-button>
<el-button type="primary" disabled>Primary</el-button>
<el-button type="success">Success</el-button>
<el-button type="info" :disabled="btnStatus">{{ username }}</el-button>
<el-button type="warning" link>Warning</el-button>
<el-button type="danger" text>Danger</el-button>
<el-button type="primary" :icon="Edit" circle />
<el-button type="success" :icon="Check" circle />
<el-icon><Check /></el-icon>
<el-button type="primary">
Upl<el-icon class="el-icon--right"><Upload /></el-icon>oad
</el-button>
<el-button-group class="ml-4">
<el-button type="primary" :icon="Edit" />
<el-button type="primary" :icon="Share" />
<el-button type="primary" :icon="Delete" />
</el-button-group>
<el-button color="#19a" >Default</el-button>
</template>
<script setup>
import {ref,reactive,onMounted} from 'vue'
import {get,post} from '@/myaxios'
import router from '@/router'
import {
Check,
Edit,
Upload,
Share,
Delete
} from '@element-plus/icons-vue'
/*
ui库中的自定义标签 基础用法与原生标签/属性一致
如果不支持 没有效果
*/
const username = ref('jack');
const btnStatus = ref(false)
const loadStauts = ref(false)
</script>
<style scoped>
</style>
2.3边框 颜色等其他基础组件
<template>
<div class="radius" style="width: 100px;height: 100px;
border-radius: var(--el-border-radius-round);
box-shadow: var(--el-box-shadow-dark);
background-color: rgb(179, 224.5, 156.5);" >
<el-icon><Lock /></el-icon>
<el-link href="http://www.baidu.com" type="success">success</el-link>
<el-text class="mx-1" type="success">Success</el-text>
</div>
</template>
<script setup>
import {ref,reactive,onMounted} from 'vue'
import {get,post} from '@/myaxios'
import router from '@/router'
import {
Check,
Edit,
Upload,
Share,
Delete
} from '@element-plus/icons-vue'
/*
ui库中的自定义标签 基础用法与原生标签/属性一致
如果不支持 没有效果
*/
</script>
<style scoped>
.radius {
height: 40px;
width: 70%;
border: 1px solid var(--el-border-color);
border-radius: 0;
margin-top: 20px;
}
</style>
2.4布局组件
<template>
<!-- 每行默认24分栏
如果页面需要分布局时 使用 el-row 搭配el-col使用
可以不足24 但是不能超
vue 响应式变量 (自动变化)
-->
<el-row :gutter="20">//会有留白
<el-col :span="8">11111</el-col>
<el-col :span="8">11111</el-col>
<el-col :span="8">
<el-row >
<el-col :span="12">11111</el-col>
<el-col :span="12">11111</el-col>
</el-row>
</el-col>
</el-row>
<el-row :gutter="20">
<el-col :offset="2" :span="10">11111</el-col>
<el-col :span="10">11111</el-col>
</el-row>
<el-row justify="space-around">
<el-col :span="10">11111</el-col>
<el-col :span="10">11111</el-col>
</el-row>
<!-- 在不同设备上 显示效果会改变
套壳APP 只能访问特定网站 浏览器功能按钮全砍掉
pc html css js
ios objcetC
Android java
-->
<el-row >
<el-col :xs="12" :sm="4" :md="20" :lg="12" >11111</el-col>
<el-col :xs="12" :sm="20" :md="4" :lg="12" >11111</el-col>
</el-row>
</template>
<script setup>
import {ref,reactive,onMounted} from 'vue'
import {get,post} from '@/myaxios'
import router from '@/router'
import {
Check,
Edit,
Upload,
Share,
Delete
} from '@element-plus/icons-vue'
/*
ui库中的自定义标签 基础用法与原生标签/属性一致
如果不支持 没有效果
*/
</script>
<style scoped>
.radius {
height: 40px;
width: 70%;
border: 1px solid var(--el-border-color);
border-radius: 0;
margin-top: 20px;
}
</style>
2.5输入框
<template>
<!--
插入图标有两种写法
-->
<el-input v-model="input" style="width: 240px" type="textarea" clearable placeholder="Please input" :suffix-icon="Calendar" />
{{ input }}
<el-input v-model="input2" style="width: 240px" type="password" show-password placeholder="Please input">
<template #prefix>
aaaa<el-icon class="el-input__icon"><calendar /></el-icon>
</template>
</el-input>
<el-input v-model="input2" style="width: 240px" type="password" show-password placeholder="Please input">
<template #prepend>
aaaa<el-icon class="el-input__icon"><calendar /></el-icon>
</template>
</el-input>
<br>
<el-input
v-model="text"
style="width: 240px"
maxlength="10"
placeholder="Please input"
show-word-limit
type="text"
/>
</template>
<script setup>
import {ref,reactive,onMounted} from 'vue'
import {get,post} from '@/myaxios'
import router from '@/router'
import {
Calendar,
} from '@element-plus/icons-vue'
const input = ref('')
const input2 = ref('')
const text = ref('')
</script>
<style scoped>
</style>
2.6数字输入框
<template>
<!--
官网文档是ts代码
去掉ts中类型部分 可以成js
-->
<el-input-number v-model="num" :min="1" :max="10" @change="handleChange" />
</template>
<script setup>
import {ref,reactive,onMounted} from 'vue'
import {get,post} from '@/myaxios'
import router from '@/router'
import {
Calendar,
} from '@element-plus/icons-vue'
const num = ref(1)
const handleChange = (value) => {
console.log(value)
}
</script>
<style scoped>
</style>
2.7单选多选开关
<template>
<el-radio-group v-model="radVal">
<el-radio value="1" size="large">Option 1</el-radio>
<el-radio value="2" size="large">Option 2</el-radio>
</el-radio-group>
{{ radVal }}
<el-radio-group v-model="radVal2" size="large">
<el-radio-button value="1" >New York</el-radio-button>
<el-radio-button value="2" >Washington</el-radio-button>
<el-radio-button value="3" >Los Angeles</el-radio-button>
<el-radio-button value="4" >Chicago</el-radio-button>
</el-radio-group>
{{ radVal2 }}
<hr>
<el-checkbox-group v-model="checkList">
<el-checkbox :value="1" >A</el-checkbox>
<el-checkbox :value="2" >B</el-checkbox>
<el-checkbox :value="3" >C</el-checkbox>
</el-checkbox-group>
{{ checkList }}
<hr>
<el-switch
v-model="switchVal"
style="--el-switch-on-color: #13ce66; --el-switch-off-color: #ff4949"
active-text="是"
inactive-text="否"
inline-prompt
/>
{{ switchVal }}
</template>
<script setup>
import {ref,reactive,onMounted} from 'vue'
import {get,post} from '@/myaxios'
import router from '@/router'
import {
Calendar,
} from '@element-plus/icons-vue'
const radVal = ref('1')
const radVal2 = ref('1')
// 注意数据类型 如果类型不匹配 无法选中
const checkList = ref([1,'3'])//不是:value要用字符串类型
const switchVal = ref(true)
</script>
<style scoped>
</style>
2.8下拉列表
<template>
<el-select
v-model="selVal"
placeholder="请选择"
size="large"
style="width: 240px"
clearable
multiple //可多选、与clearable不可叠加
>
<el-option value="001">北京</el-option>
<el-option value="002" disabled>上海</el-option>
<el-option value="003">深圳</el-option>
</el-select>
{{ selVal }}
<hr/>
<!-- 自动根据层级遍历 (有父子关系的数据)
遍历时的key有默认值
label 显示内容 value 选项值 children 子数据
-->
<el-cascader v-model="casVal"
:options="options.optionList"
:props="props"/>
{{ casVal }}
</template>
<script setup>
import {ref,reactive,onMounted} from 'vue'
import {get,post} from '@/myaxios'
import router from '@/router'
import areaData from '@/myjs/myData.js'
import {
Calendar,
} from '@element-plus/icons-vue'
const selVal = ref('')
const casVal = ref('')
const props = {
'label':'name',
'children':'subArea',
'value':'code'
}
const options = reactive({optionList:[]})
onMounted(()=>{
console.log(areaData);
options.optionList = areaData
})
</script>
<style scoped>
</style>
2.9日期选择
有日期选择 时间选择
<template>
<el-date-picker
v-model="dataStr"
type="datetime"
placeholder="Select date and time"
value-format="YYYY-MM-DD HH:mm:ss"
/>
{{ dataStr }}
</template>
<script setup>
import {ref,reactive,onMounted} from 'vue'
import {get,post} from '@/myaxios'
import router from '@/router'
import areaData from '@/myjs/myData.js'
const dataStr = ref('')
</script>
<style scoped>
</style>
2.10table组件
table是数据显示的主要组件 每个页面都要使用
主要作用是显示后端返回的动态数据
<template>
<!-- 单选
<el-table highlight-current-row
stripe border
height="250"
:data="tableData.dataList"
style="width: 100%"
@current-change="handleCurrentChange"
>
-->
<el-table
ref="tableRef" // 使用ref可用拿到对应的table对象
stripe border
height="250"
:data="tableData.dataList"
style="width: 100%"
>
<el-table-column type="selection" width="55" />
<el-table-column fixed prop="date" label="日期" width="180" />
<el-table-column prop="name" label="名称" width="180" />
<el-table-column prop="status" label="状态" width="180" >
<!-- table遍历数据插槽的基础上
通过template标签 可自定义table中的内容
自定义每列的内容 美化table
-->
<template #default="xxx">
<el-button type="success" v-if="xxx.row.status ==1" >正常</el-button>
<el-button type="warning" v-else-if="xxx.row.status ==2" >请假</el-button>
</template>
</el-table-column>
<el-table-column prop="address" label="Address" width="280"/>
<el-table-column prop="address" label="Address" width="280"/>
<el-table-column prop="address" label="Address" width="280"/>
<el-table-column fixed="right" label="操作" width="280">
<el-button type="warning" >修改</el-button>
<el-button type="danger" >删除</el-button>
</el-table-column>
</el-table>
<el-button @click="myTest">测试</el-button>
</template>
<script setup>
import {ref,reactive,onMounted} from 'vue'
import {get,post} from '@/myaxios'
import router from '@/router'
import areaData from '@/myjs/myData.js'
let currentRow = {};
//文件编译 时会把相同名称的html元素绑定到一起
const tableRef = ref()
const tableData = reactive({dataList:[]})
const myTest = ()=>{
console.log(tableRef.value);//获得的是全部的
console.log(tableRef.value.getSelectionRows());//获得的是选中的
}
const handleCurrentChange = (val)=>{
console.log(val);
currentRow = val;
}
onMounted(()=>{
tableData.dataList = [
{
date: '2016-05-03',
name: 'Tom',
status:1,
address: 'No. 189, Grove St, Los Angeles',
},
{
date: '2016-05-02',
name: 'Tom',
status:1,
address: 'No. 189, Grove St, Los Angeles',
},
{
date: '2016-05-04',
name: 'Tom',
status:1,
address: 'No. 189, Grove St, Los Angeles',
},
{
date: '2016-05-01',
name: 'Tom',
status:2,
address: 'No. 189, Grove St, Los Angeles',
},
{
date: '2016-05-01',
name: 'Tom',
status:1,
address: 'No. 189, Grove St, Los Angeles',
},
{
date: '2016-05-01',
name: 'Tom',
address: 'No. 189, Grove St, Los Angeles',
},
{
date: '2016-05-01',
name: 'Tom',
address: 'No. 189, Grove St, Los Angeles',
},
{
date: '2016-05-01',
name: 'Tom',
address: 'No. 189, Grove St, Los Angeles',
},
]
})
</script>
<style scoped>
</style>
注意:
table是自动遍历的 所以显示每列数据时 通常需要自定义显示的列
需要搭配table的数据插槽使用 主要作用美化界面 提高交互效果
<el-table-column prop="status" label="状态" width="180" >
<!-- table遍历数据插槽的基础上
通过template标签 可自定义table中的内容
自定义每列的内容 美化table
-->
<template #default="xxx">
<el-button type="success" v-if="xxx.row.status ==1" >正常</el-button>
<el-button type="warning" v-else-if="xxx.row.status ==2" >请假</el-button>
</template>
</el-table-column>
2.11分页组件
<el-pagination
v-model:current-page="pageInfo.pageData.page"
v-model:page-size="pageInfo.pageData.pageSize"
:total="pageInfo.pageData.total"
:page-sizes="[10, 20, 30]" //依次为10页显示方式 总共50页 共有5页
layout="total, sizes, prev, pager, next, jumper"
@current-change="paginationCurrentChange"
@size-change="paginationSizeChange"
/>
// const total = ref(77);
// const page = ref(2);
// const pageSize = ref(10);
const pageInfo = reactive({pageData:{
page:1,
pageSize:10,
total:55,
}})
/*
经常与table的分页功能搭配使用
用户点击按钮时 重新查询table数据 响应之后 给table赋值刷新数据
*/
const paginationCurrentChange = (val)=>{
console.log(val);
}
const paginationSizeChange = (val)=>{
console.log(val);
}
注意:分页组件通常与table组合使用
2.12tree组件
// tree自动遍历 有默认读取的key
// 可以通过自定义key的对应表 指定解析的数据
//注意:自动的遍历如果没有显示数据 有可能是key每对上(有没有文字的选项)
//对应key的部分多注意 仔细 多复制
//部分代码key没有完全对应
<template>
<el-tree
style="max-width: 600px"
:data="data"
:props="defaultProps"
/>
</template>
<script setup>
import {ref,reactive,onMounted} from 'vue'
import {get,post} from '@/myaxios'
import router from '@/router'
import areaData from '@/myjs/myData.js'
// tree自动遍历 有默认读取的key
// 可以通过自定义key的对应表 指定解析的数据
//注意:自动的遍历如果没有显示数据 有可能是key每对上(有没有文字的选项)
//对应key的部分多注意 仔细 多复制
const defaultProps = {
children: 'subData',
label: 'name',
}
const data = [
{
name: 'Level one 1',
subData: [
{
label: 'Level two 1-1',
children: [
{
label: 'Level three 1-1-1',
},
],
},
],
},
{
label: 'Level one 2',
children: [
{
label: 'Level two 2-1',
children: [
{
label: 'Level three 2-1-1',
},
],
},
{
label: 'Level two 2-2',
children: [
{
label: 'Level three 2-2-1',
},
],
},
],
},
{
label: 'Level one 3',
children: [
{
label: 'Level two 3-1',
children: [
{
label: 'Level three 3-1-1',
},
],
},
{
label: 'Level two 3-2',
children: [
{
label: 'Level three 3-2-1',
},
],
},
],
},
]
</script>
<style scoped>
</style>
2.13菜单组件
菜单一般做动态菜单 由后端加载数据 在前端展示
<template>
<e-row>
<el-col :span="6" >
<el-menu
active-text-color="#ffd04b"
background-color="#545c64"
default-active="2" //与active-text-color="#ffd04b"形成高亮
text-color="#fff"
>
<!--
系统管理
人员管理
菜单管理
财务管理
人员工资
财务报表
-->
<el-sub-menu v-for="menu in menuList.menuData" :index="menu.mid+''">
<template #title>
<el-icon><component :is="menu.icon"></component></el-icon>
<span>{{ menu.mname }}</span>
</template>
<el-menu-item v-for="subm in menu.subMen" :index="subm.mid+''">
<el-icon><component :is="subm.icon"></component></el-icon>
<span>{{ subm.mname }}</span>
</el-menu-item>
</el-sub-menu>
<!-- <el-sub-menu index="1">
<template #title>
<el-icon><Check /></el-icon>
<span>系统管理</span>
</template>
<el-menu-item index="11">
<el-icon><Edit /></el-icon>
<span>人员管理</span>
</el-menu-item>
<el-menu-item index="12">
<el-icon><Edit /></el-icon>
<span>菜单管理</span>
</el-menu-item>
</el-sub-menu>
<el-sub-menu index="2">
<template #title>
<el-icon><Share /></el-icon>
<span>财务管理</span>
</template>
<el-menu-item index="21">
<el-icon><Edit /></el-icon>
<span>人员工资</span>
</el-menu-item>
<el-menu-item index="22">
<el-icon><Edit /></el-icon>
<span>财务报表</span>
</el-menu-item>
</el-sub-menu> -->
<!-- <el-sub-menu index="1">
<template #title>
<el-icon><location /></el-icon>
<span>Navigator One</span>
</template>
<el-menu-item-group title="Group One">
<el-menu-item index="1-1">item one</el-menu-item>
<el-menu-item index="1-2">item two</el-menu-item>
</el-menu-item-group>
<el-menu-item-group title="Group Two">
<el-menu-item index="1-3">item three</el-menu-item>
</el-menu-item-group>
<el-sub-menu index="1-4">
<template #title>item four</template>
<el-menu-item index="1-4-1">item one</el-menu-item>
</el-sub-menu>
</el-sub-menu>
<el-menu-item index="2">
<el-icon><icon-menu /></el-icon>
<span>Navigator Two</span>
</el-menu-item>
<el-menu-item index="3" disabled>
<el-icon><document /></el-icon>
<span>Navigator Three</span>
</el-menu-item>
<el-menu-item index="4">
<el-icon><setting /></el-icon>
<span>Navigator Four</span>
</el-menu-item> -->
</el-menu>
</el-col>
</e-row>
<!-- 动态标签 <component :is="'input'"></component> -->
</template>
<script setup>
import {ref,reactive,onMounted} from 'vue'
import {get,post} from '@/myaxios'
import router from '@/router'
import areaData from '@/myjs/myData.js'
import {
Check,
Edit,
Upload,
Share,
Delete
} from '@element-plus/icons-vue'
const menuList = reactive({menuData:[]})
onMounted(()=>{
//后端取值
menuList.menuData = [
{mid:1,mname:"系统管理",icon:'Upload',subMen:[
{mid:11,mname:"用户管理",icon:'Delete'},
{mid:12,mname:"菜单管理",icon:'Edit'}
]},
{mid:2,mname:"财务管理",icon:'Share',subMen:[
{mid:21,mname:"财务1",icon:'Edit'},
{mid:22,mname:"财务2",icon:'Edit'}
]}
]
})
</script>
<style scoped>
</style>
2.14反馈组件
<template>
<el-button :plain="true" @click="myopen">Success</el-button>
<el-button plain @click="open">Click to open the Message Box</el-button>
<el-button plain @click="dialogVisible = true">//dialogVisible(刚开始时不显示) = true(点击显示)
Click to open the Dialog
</el-button>
<el-button plain @click="drawerVisible = true">
Click to open the Drawer
</el-button>
<!-- 多功能组合到同一个界面时 使用对话框 -->
<el-dialog
v-model="dialogVisible"
title="Tips"
width="500"
>
<span>可以放表格 表单 或其他界面</span>
</el-dialog>
<el-drawer
v-model="drawerVisible"
title="I am the title"
:direction="'btt'"
>
<span>这是抽屉</span>
</el-drawer>
</template>
<script setup>
import {ref,reactive,onMounted} from 'vue'
import {get,post} from '@/myaxios'
import router from '@/router'
/*
ElMessage 显示用
ElMessageBox 交互用
*/
import { ElMessage, ElMessageBox } from 'element-plus'
const myopen = ()=>{
ElMessage.error('恭喜你操作成功')
}
const open = () => {
ElMessageBox.confirm(
'确认要继续me?',
'警告',
{
confirmButtonText: '确定',
cancelButtonText: '不确定',
type: 'error',
}
)
.then(() => {
console.log("执行");
})
.catch(() => {
console.log("点了取消");
})
}
const dialogVisible = ref(false)//表示刚开始时不显示
const drawerVisible = ref(false)
</script>
<style scoped>
</style>