目录
最初始 package.json 文件 :

根据项目需求下载引入具体哪一个组件库
1、Element UI 组件库 ( 饿了么 组件库 )
Element - The world's most popular Vue UI framework
npm i element-ui -S
引入 Element =>
你可以引入整个 Element ,或是 根据需要 仅 引入部分组件 。
完整引入 :( 不推荐 )
// 在 main.js 中写入以下内容 : import Vue from 'vue'; import ElementUI from 'element-ui'; // 引入 element-ui import 'element-ui/lib/theme-chalk/index.css'; // 单独引入样式文件 import App from './App.vue'; Vue.use(ElementUI); // use 挂载 ElementUI new Vue({ el: '#app', render: h => h(App) });以上代码便完成了 Element 的 完整引入 。需要注意的是 ,样式文件 需要 单独引入 。
按需引入 : ( 推荐 )
借助 babel-plugin-component ,我们可以 只引入 需要 的 组件 ,
以达到 减小 项目体积 的 目的 。
首先 ,安装 babel-plugin-component :
npm install babel-plugin-component -D"babel-plugin-component" : "^1.1.1"
将我们 根目录 下的 babel.config.js 修改 如下 :
接下来 ,如果你只希望引入部分组件 ,
比如 Button 和 Select ,那么需要在 main.js 中写入以下内容 :
完整组件列表和引入方式( 完整组件列表以 components.json 为准 )
在项目 src 根目录下创建文件夹 plugins / element.js
然后在 main.js 文件内 导入我们刚刚创建好的 组件文件 element.js
下面让我们先来简单测试一下 :
先用简单的按钮来进行测试一下看是否成功 ,
配置 OK => 启动服务器 ( npm run serve )
查看页面效果发现没有问题即可 OK :
这里我们 推荐 的 按需引入 方案 可能会有两个 bug 问题 :第一个 就是
ElementUI 按需引入 , 刷新页面 就 显示 Message 消息提示 和 MessageBox 弹框 的 问题
正常情况下,应该是点击按钮才触发弹窗,而不是现在这样页面刷新的时候就弹出来
解决方案 :
换一种引用方式即可解决
import { Message, MessageBox, } from "element-ui"; Vue.component(Message.name, Message); Vue.component(MessageBox.name, MessageBox);
第二个问题 :
这个 报错 是 因为 按需引入的文件内 没有 引入 element ui 中的 Row 引起 的
在按需引入的 element.js 中
import { Row, } from "element-ui"; Vue.use(Row)
完整代码 :
main.js
- import Vue from "vue";
- import App from "./App.vue";
- import router from "./router";
- import store from "./store";
-
- /* // 完整引入 Element ( 不推荐 )
- import ElementUI from "element-ui";
- // 单独引入 Element 全部组件样式文件
- import "element-ui/lib/theme-chalk/index.css";
- Vue.use(ElementUI) */
-
- // 引入部分组件
- // import { Button, Select } from "element-ui";
-
- // Vue.component(Button.name, Button);
- // Vue.component(Select.name, Select);
- /* 或写为
- * Vue.use(Button)
- * Vue.use(Select)
- */
-
- // 引入组件文件 element.js
- import "./plugins/element";
-
- Vue.config.productionTip = false;
-
- new Vue({
- router,
- store,
- render: (h) => h(App),
- }).$mount("#app");
babel.config.js
- module.exports = {
- presets: ["@vue/cli-plugin-babel/preset"],
- // Element 按需引入
- plugins: [
- [
- "component",
- {
- libraryName: "element-ui",
- styleLibraryName: "theme-chalk",
- },
- ],
- ],
- };
.babelrc ( 官方 )

src / plugins / element.js
- import Vue from "vue";
- // 在下面大括号中导入所需 Element-ui 中的组件即可
- import {
- Pagination,
- Dialog,
- Autocomplete,
- Dropdown,
- DropdownMenu,
- DropdownItem,
- Menu,
- Submenu,
- MenuItem,
- MenuItemGroup,
- Input,
- InputNumber,
- Radio,
- RadioGroup,
- RadioButton,
- Checkbox,
- CheckboxButton,
- CheckboxGroup,
- Switch,
- Select,
- Option,
- OptionGroup,
- Button,
- ButtonGroup,
- Table,
- TableColumn,
- DatePicker,
- TimeSelect,
- TimePicker,
- Popover,
- Tooltip,
- Breadcrumb,
- BreadcrumbItem,
- Form,
- FormItem,
- Tabs,
- TabPane,
- Tag,
- Tree,
- Alert,
- Slider,
- Icon,
- Row,
- Col,
- Upload,
- Progress,
- Spinner,
- Badge,
- Card,
- Rate,
- Steps,
- Step,
- Carousel,
- CarouselItem,
- Collapse,
- CollapseItem,
- Cascader,
- ColorPicker,
- Transfer,
- Container,
- Header,
- Aside,
- Main,
- Footer,
- Timeline,
- TimelineItem,
- Link,
- Divider,
- Image,
- Calendar,
- Backtop,
- PageHeader,
- CascaderPanel,
- Loading,
- MessageBox,
- Message,
- Notification,
- } from "element-ui";
-
- // 注意导入的组件都需要使用 Vue.use() 进行注册
- Vue.use(Pagination);
- Vue.use(Dialog);
- Vue.use(Autocomplete);
- Vue.use(Dropdown);
- Vue.use(DropdownMenu);
- Vue.use(DropdownItem);
- Vue.use(Menu);
- Vue.use(Submenu);
- Vue.use(MenuItem);
- Vue.use(MenuItemGroup);
- Vue.use(Input);
- Vue.use(InputNumber);
- Vue.use(Radio);
- Vue.use(RadioGroup);
- Vue.use(RadioButton);
- Vue.use(Checkbox);
- Vue.use(CheckboxButton);
- Vue.use(CheckboxGroup);
- Vue.use(Switch);
- Vue.use(Select);
- Vue.use(Option);
- Vue.use(OptionGroup);
- Vue.use(Button);
- Vue.use(ButtonGroup);
- Vue.use(Table);
- Vue.use(TableColumn);
- Vue.use(DatePicker);
- Vue.use(TimeSelect);
- Vue.use(TimePicker);
- Vue.use(Popover);
- Vue.use(Tooltip);
- Vue.use(Breadcrumb);
- Vue.use(BreadcrumbItem);
- Vue.use(Form);
- Vue.use(FormItem);
- Vue.use(Tabs);
- Vue.use(TabPane);
- Vue.use(Tag);
- Vue.use(Tree);
- Vue.use(Alert);
- Vue.use(Slider);
- Vue.use(Icon);
- Vue.use(Row);
- Vue.use(Col);
- Vue.use(Upload);
- Vue.use(Progress);
- Vue.use(Spinner);
- Vue.use(Badge);
- Vue.use(Card);
- Vue.use(Rate);
- Vue.use(Steps);
- Vue.use(Step);
- Vue.use(Carousel);
- Vue.use(CarouselItem);
- Vue.use(Collapse);
- Vue.use(CollapseItem);
- Vue.use(Cascader);
- Vue.use(ColorPicker);
- Vue.use(Transfer);
- Vue.use(Container);
- Vue.use(Header);
- Vue.use(Aside);
- Vue.use(Main);
- Vue.use(Footer);
- Vue.use(Timeline);
- Vue.use(TimelineItem);
- Vue.use(Link);
- Vue.use(Divider);
- Vue.use(Image);
- Vue.use(Calendar);
- Vue.use(Backtop);
- Vue.use(PageHeader);
- Vue.use(CascaderPanel);
-
- Vue.use(Loading.directive);
-
- // Vue.use(Message); // 不要用这种注册方式(会刷新时自动消息提示)
- // Vue.use(MessageBox); // 不要用这种注册方式(会刷新时自动弹框)
- Vue.component(Message.name, Message); // 换用这种注册方式
- Vue.component(MessageBox.name, MessageBox); // 换用这种注册方式
-
- Vue.prototype.$loading = Loading.service;
- Vue.prototype.$msgbox = MessageBox;
- Vue.prototype.$alert = MessageBox.alert;
- Vue.prototype.$confirm = MessageBox.confirm;
- Vue.prototype.$prompt = MessageBox.prompt;
- Vue.prototype.$notify = Notification;
- Vue.prototype.$message = Message;
src / views / About.vue
- <div class="about">
- <el-row>
- <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>
- el-row>
-
- <el-button :plain="true" @click="openMessage">打开消息提示el-button>
- <el-button type="primary" @click="openMessageBox">打开消息提示el-button>
- div>
-
- <script>
- export default {
- methods: {
- openMessage() {
- this.$message("这是一条消息提示");
- },
- openMessageBox() {
- this.$alert("这是一段内容", "标题名称", {
- confirmButtonText: "确定",
- callback: (action) => {
- this.$message({
- type: "info",
- message: `action: ${action}`,
- });
- },
- });
- },
- },
- };
- script>
2、Ant Design Vue 组件库
https://www.antdv.com/docs/vue/introduce-cn
Apache ECharts
一个基于 JavaScript 的开源可视化图表库
推荐观看此文章入门简介 :

npm i echarts -S
“echarts”: “5.3.3”

将 echarts 全部引入,这样一来,我们可以在该页面使用 echarts 所有组件;
import * as echarts from "echarts";
按需引入 ECharts 图表和组件
上面的代码会引入 ECharts 中所有的图表和组件,但是假如你不想引入所有组件,
也可以使用 ECharts 提供的按需引入的接口来打包必须的组件。
- // 引入 echarts 核心模块,核心模块提供了 echarts 使用必须要的接口。
- import * as echarts from 'echarts/core';
- // 引入柱状图图表,图表后缀都为 Chart
- import { BarChart } from 'echarts/charts';
- // 引入提示框,标题,直角坐标系,数据集,内置数据转换器组件,组件后缀都为 Component
- import {
- TitleComponent,
- TooltipComponent,
- GridComponent,
- DatasetComponent,
- TransformComponent
- } from 'echarts/components';
- // 标签自动布局,全局过渡动画等特性
- import { LabelLayout, UniversalTransition } from 'echarts/features';
- // 引入 Canvas 渲染器,注意引入 CanvasRenderer 或者 SVGRenderer 是必须的一步
- import { CanvasRenderer } from 'echarts/renderers';
-
- // 注册必须的组件
- echarts.use([
- TitleComponent,
- TooltipComponent,
- GridComponent,
- DatasetComponent,
- TransformComponent,
- BarChart,
- LabelLayout,
- UniversalTransition,
- CanvasRenderer
- ]);
-
- // 接下来的使用就跟之前一样,初始化图表,设置配置项
- var myChart = echarts.init(document.getElementById('main'));
- myChart.setOption({
- // ...
- });

在 src / 根目录下新建 components 组件文件夹 / 新建一个 echarts 文件夹
用于存放二次封装 ECharts 的公共组件
src / components / echarts / EchartsChart.vue
- <template>
- <div>
- <div id="id" class="myChart" :style="setStyle">div>
- div>
- template>
-
- <script>
- import * as echarts from "echarts";
-
- export default {
- name: "pieChart",
- props: {
- id: {
- type: String, // 类型
- default: null, // 默认值
- },
- options: {
- type: Object, // 类型
- default: () => ({}),
- },
- setStyle: {
- type: Object, // 类型
- default: () => ({}),
- },
- },
- data() {
- return {
- myChart: null,
- myChartStyle: { height: "300px" }, // 图表样式
- tooltip: {
- trigger: "item",
- },
- legend: {
- origin: "vertical",
- left: "left",
- },
- };
- },
- watch: {
- option: {
- handler(newValue) {
- this.$nextTick(() => {
- if (document.getElementById(this.id)) {
- if (!this.myChart) {
- this.myChart = echarts.init(document.getElementById(this.id));
- }
- this.myChart.setOption(newValue, true);
- }
- });
- },
- },
- deep: true,
- },
- mounted() {
- this.pieChart(this.id, this.options);
- window.addEventListener("resize", function () {
- if (this.myChart) {
- this.myChart.resize();
- }
- });
- },
- methods: {
- pieChart(id, options) {
- if (document.getElementById(id)) {
- this.myChart = echarts.init(document.getElementById(id));
- this.myChart.setOption(options, true);
- }
- },
- },
- beforeDestroy() {
- // 解决 Echarts 页面切换卡顿问题
- this.myChart.clear();
- },
- };
- script>
-
- <style lang="scss" scoped>
- // .myChart {
- // width: 95%;
- // height: 400px;
- // }
- style>
使用 :

jsconfig.json
- {
- "compilerOptions": {
- "baseUrl": "./",
- "paths": {
- "@/*": ["src/*"]
- }
- },
- "exclude": ["node_modules", "dist"]
- }
未完待续 。。。