vue 前端框架,vue element组件

Element,一套为开发者、设计师和产品经理准备的基于 Vue 2.0 的组件库,提供了配套设计资源,帮助你的网站快速成型。由饿了么公司前端团队开源。本章我们

Element 是一个面向开发人员、设计师和产品经理的基于Vue 2.0 的组件库,提供支持设计资源,帮助您快速打造网站。饿了么前端团队开源。在本章中,您将了解Element-UI 组件。

14.1 Element-UI简介

Element 是一套基于Vue 2.0 的组件库,为开发人员、设计师和产品经理提供支持设计资源,以快速使网站栩栩如生。饿了么前端团队开源。本章我们将结合vue-cli使用Element-UI创建一个项目。

第一步是安装vue-cli。

be17fda64f3a4ea6a98e5b043c835d02~noop.image?_iz=58558&from=article.pc_detail&lk3s=953192f4&x-expires=1717747982&x-signature=njxygEz1liLYBXesaXJ%2BWqrwGt4%3D

npm 安装vue-cli -g

步骤2:创建一个文件夹并将其命名为项目。

f19af0f7cdc9476f95d41c78dd11064a~noop.image?_iz=58558&from=article.pc_detail&lk3s=953192f4&x-expires=1717747982&x-signature=3IANGVSEXuIwP%2FtInvBh1tC%2Fz%2Fs%3D

第三步:用该文件夹的目录初始化项目目录。

vue 初始化Webpack

第四步:生成目录后,安装依赖。

npm安装

第五步:最后运行命令启动项目。

npm 运行开发

bf0ae964ca56406887735233ec5ba496~noop.image?_iz=58558&from=article.pc_detail&lk3s=953192f4&x-expires=1717747982&x-signature=qfa8N5IgmYR7fPKFfBL0BXRocY0%3D

图14-1 项目启动时的效果图

项目生成结果如下:

f457a48e9652411586dd832b5e5d94f4~noop.image?_iz=58558&from=article.pc_detail&lk3s=953192f4&x-expires=1717747982&x-signature=HTH0WVWirMC0CKmmlfix4W4eMUY%3D

图14-2 目录生成流程

第6 步:在当前项目路径中安装Element-UI。

npm 安装元素ui

步骤7:配置main.js文件。

import Vue from ‘vue’import App from ‘./App’import router from ‘./router’//引入element-ui的样式import ‘element-ui/lib/theme-chalk/index.css’//引入element -ui 组件从’element-ui’Vue.use(ElementUI)Vue.config.ProductionTip=false/* eslint-disable no-new 导入ElementUI */new Vue({el: ‘#app’,router,components: { App } , template: ‘App/’}) 至此,Element-UI 就已经集成到你的vue 项目中了。现在让我们看看基本组件的用法。

14.2基础布局

14.2.1 Layout布局

快速轻松地创建具有基本24 列的布局。首先我们来看看Element-UI是如何布局的。

首先,将以下代码添加到App.vue中。

div id=’app’el-rowel-col :span=’24’div class=’grid-content bg-purple-dark’/div/el-col/el-rowel-rowel-col :span=’12’div 类=’网格内容bg-purple’/div/el-colel-col :span=’12’div class=’网格内容bg-purple-light’/div/el-col/el-rowel-row :gutter=’20’ el-col :span=’6’div class=’grid-content bg-purple’/div/el-colel-col :span=’6’div class=’grid-content bg-purple’/div/el-Colel- col :span=’6’div class=’grid-content bg-purple’/div/el-colel-col :span=’6’div class=’grid-content bg-purple’/div/el-col/el- rowel-row :gutter=’20’el-col :span=’4’div class=’grid-content bg-purple’/div/el-colel-col :span=’16’div class=’grid-content bg-purple ‘/div/el-colel-col :span=’4’div class=’grid-content bg-purple’/div/el-col/el-rowel-row :gutter=’20’el-col :span=’6′ :offset=’6’div class=’grid-content bg-purple’/div/el-colel-col :span=’6’ :offset=’6’div class=’grid-content bg-purple’/div/here 时el-col/el-row/div启动项目,Eslint规则报错。您可以按如下方式关闭Eslint:

6eabc6c569ba40b494e6c6335cad143a~noop.image?_iz=58558&from=article.pc_detail&lk3s=953192f4&x-expires=1717747982&x-signature=VICf%2BTiyE3zr4gNp620FDQjdehg%3D

第2步

第一步

打开步骤2中的文件并注释图中的代码。

3c222e94277240a0a78f37454323630b~noop.image?_iz=58558&from=article.pc_detail&lk3s=953192f4&x-expires=1717747982&x-signature=Gf73xMU9bHMiDvnc2UFgmPxhA8Y%3D

当你运行代码时,你会得到以下效果:

cc8af4323c134bb08d882b5498190fa6~noop.image?_iz=58558&from=article.pc_detail&lk3s=953192f4&x-expires=1717747982&x-signature=bGoUkG%2BZEkIxn8%2FAprAyRZ%2F7hAs%3D

图14-3 渲染布局

Element-UI 使用基本的24 列布局。本例的知识点是:

标签或属性

意义

埃尔线

知道了

埃科尔

列表

:跨度

自由组合布局与span属性

: 天沟

设置列之间的间距

: 偏移量

将列偏移、跨度和偏移总计设置为最多24。

还可以通过flex布局设置列对齐方式,灵活排列列。

div id=’app’el-row type=’flex’ class=’row-bg’el-col :span=’6’div class=’grid-content bg-purple’/div/el-colel-col :span=’6’div class=’grid-content bg-purple-light’/div/el-colel-col :span=’6’div class=’grid-content bg-purple’/div/el-col/el-rowel -row type=’flex’ class=’row-bg’ justify=’center’el-col :span=’6’div class=’grid-content bg-purple’/div/el-colel-col :span=’6 ‘div class=’grid-content bg-purple-light’/div/el-colel-col :span=’6’div class=’grid-content bg-purple’/div/el-col/el-rowel-row type=’flex’ class=’row-bg’ justify=’end’el-col :span=’6’div class=’grid-content bg-purple’/div/el-colel-col :span=’6’div class=’grid-content bg-purple-light’/div/el-colel-col :span=’6’div class=’grid-content bg-purple’/div/el-col/el-rowel-row type=’flex’ class=’row-bg’ justify=’space- Between’el-col :span=’6’div class=’grid-content bg-purple’/div/el-colel-col :span=’6’div class=’grid-content bg-purple-light’/div/el-colel-col :span=’6’div class=’grid-content bg-purple’/div/el-col/el-rowel-row type=’flex’ class=’row-bg’ justify=’space-around’el-col :span=’6’div class=’grid-content bg-purple’/div/el-colel-col :span=’6’div class=’grid-content bg-purple-light’/div/el-colel-col :span=’6’div class=’grid-content bg-purple’/div/el-col/el-row/div 程序效果如下图所示。

af2e3f176b87477fb1b46f3dcdf478b0~noop.image?_iz=58558&from=article.pc_detail&lk3s=953192f4&x-expires=1717747982&x-signature=QJu25pnQD4kRhD8Fx4NjofYx%2FuA%3D

图14-4 放置效果

将type 属性指定为’flex’ 可以启用Flex 布局,并且可以通过使用justify 属性指定开始、中心、结束、间距和间距值来定义子元素的布局。

从左边开始:

center: 居中。

end: 从右开始排列

space- Between: 对齐边缘并在项目之间提供相等的间距。

space-around: 每个项目每一侧的空间相等。因此,项目之间的间距是项目和边框之间的间距的两倍。

14.2.2 Container布局容器

用于布局的容器组件。轻松快速地构建页面的基本结构。

el-container:外容器。如果子元素包含el-header 或el-footer,则所有子元素从上到下垂直对齐,否则它们将左右水平对齐。

el-header:顶栏容器。

el-aside:侧边栏容器。

el-main:主区域容器。

el-footer:底行容器。

上面的组件使用了flex布局。使用前请确保您的目标浏览器兼容。而且el-container只有四个子元素,后四个的父元素也只是el-container。

常见页面布局的示例包括:

示例14-1 App.vue

templatediv id=’app’el-containerel-aside width=’200px’Aside/el-asideel-containerel-headerHeader/el-headerel-mainMain/el-mainel-footerFooter/el-footer/el-container/el-container/div/templatescriptexport 默认{name: ‘App’,};/scriptstyle#app {font-family: ‘Avenir’, Helvetica, Arial, sans-serif;-webkit-font-smoothing: 抗锯齿;-moz-osx-font-smoothing: 灰度; text-align: center;color: #2c3e50;margin-top: 60px;}.el-header,el-footer {background-color: #b3c0d1;color: #333;text-align: center;line-height: 60px;}.el-aside {background-color: #d3dce6;color: #333;text-align: center;line-height: 200px;}.el-main {background-color: #e9eef3;color: #333;text-align: center;line-height: 160px;}body . el-container {margin-bottom: 40px;}.el-container:nth-child(5) .el-aside,el-container:nth-child(6) .el-aside {line-height: 260px;}.el-container:nth-child (7) .el-aside {line-height: 320px;}/style程序运行结果如下。

58bb9427db7e4462acdb599d3af4cbd8~noop.image?_iz=58558&from=article.pc_detail&lk3s=953192f4&x-expires=1717747982&x-signature=gWZn9v9vlGR%2Bn%2BloJmPSTc4pbqI%3D

图14-5 渲染容器

14.2.3 Button按钮

1.常用的操作按钮

示例14-2 App.vue

templatediv id=’app’el-rowel-button 默认按钮/el-buttonel-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-row><el-button plain>朴素按钮</el-button><el-button type=”primary” plain>主要按钮</el-button><el-button type=”success” plain>成功按钮</el-button><el-button type=”info” plain>信息按钮</el-button><el-button type=”warning” plain>警告按钮</el-button><el-button type=”danger” plain>危险按钮</el-button></el-row><el-row><el-button round>圆角按钮</el-button><el-button type=”primary” round>主要按钮</el-button><el-button type=”success” round>成功按钮</el-button><el-button type=”info” round>信息按钮</el-button><el-button type=”warning” round>警告按钮</el-button><el-button type=”danger” round>危险按钮</el-button></el-row><el-row><el-button icon=”el-icon-search” circle></el-button><el-button type=”primary” icon=”el-icon-edit” circle></el-button><el-button type=”success” icon=”el-icon-check” circle></el-button><el-button type=”info” icon=”el-icon-message” circle></el-button><el-button type=”warning” icon=”el-icon-star-off” circle></el-button><el-button type=”danger” icon=”el-icon-delete” circle></el-button><el-button type=”primary” icon=”el-icon-share”></el-button><el-button type=”primary” icon=”el-icon-search”>搜索</el-button><el-button type=”primary”>上传<i class=”el-icon-upload el-icon–right”></i></el-button></el-row></div></template><script>export default {name: “App”,};</script><style></style>程序的运行结果如下:
594adcd6c9774a36a0e1a4ca7cc7b268~noop.image?_iz=58558&from=article.pc_detail&lk3s=953192f4&x-expires=1717747982&x-signature=Wb%2BUDklryqIHdGdG4oT93rUGKuA%3D
图 14- 6 按钮效果图

2.按钮尺寸

Button 组件提供除了默认值以外的三种尺寸,可以在不同场景下选择合适的按钮尺寸。额外的尺寸:medium、small、mini,通过设置size属性来配置它们。
<el-row><el-button>默认按钮</el-button><el-button size=”medium”>中等按钮</el-button><el-button size=”small”>小型按钮</el-button><el-button size=”mini”>超小按钮</el-button></el-row><el-row><el-button round>默认按钮</el-button><el-button size=”medium” round>中等按钮</el-button><el-button size=”small” round>小型按钮</el-button><el-button size=”mini” round>超小按钮</el-button></el-row>效果图:
03a33ef12fae4636800eed63f7afa13a~noop.image?_iz=58558&from=article.pc_detail&lk3s=953192f4&x-expires=1717747982&x-signature=bUjpP9resIqsxGRkh%2BI%2B7PtatZs%3D
图 14- 7 尺寸效果图

3.按钮组

<el-button-group><el-button type=”primary” icon=”el-icon-arrow-left”>上一页</el-button><el-button type=”primary”>下一页<i class=”el-icon-arrow-right el-icon–right”></i></el-button></el-button-group><el-button-group><el-button type=”primary” icon=”el-icon-edit”></el-button><el-button type=”primary” icon=”el-icon-share”></el-button><el-button type=”primary” icon=”el-icon-delete”></el-button></el-button-group>效果图:
4c6851c6a2a6439f9544449557513dbb~noop.image?_iz=58558&from=article.pc_detail&lk3s=953192f4&x-expires=1717747982&x-signature=eYYhg2zb4IF868kzZvBnOX%2F1Fek%3D
图 14- 8 分页按钮组

4.加载中图标

<el-button type=”primary” :loading=”true”>加载中</el-button>
效果图:
9e487ef1ab7b4ea1b8d0861f6a03dfc9~noop.image?_iz=58558&from=article.pc_detail&lk3s=953192f4&x-expires=1717747982&x-signature=ia%2F8taCSHKx8t97%2B9UFlWsNdICk%3D
图 14- 9 加载中效果图
总结:
参数
说明
类型
可选值
默认值
size
尺寸
string
medium / small / mini

type
类型
string
primary / success / warning / danger / info / text

plain
是否朴素按钮
boolean

false
round
是否圆角按钮
boolean

false
circle
是否圆形按钮
boolean

false
loading
是否加载中状态
boolean

false
disabled
是否禁用状态
boolean

false
icon
图标类名
string


autofocus
是否默认聚焦
boolean

false
native-type
原生 type 属性
string
button / submit / reset
button

14.2.4 Link文字链接

例14-3 App.vue
<template><div id=”app”><h3>基础用法</h3><div><el-link href=”https://element.eleme.io” target=”_blank”>默认链接</el-link><el-link type=”primary”>主要链接</el-link><el-link type=”success”>成功链接</el-link><el-link type=”warning”>警告链接</el-link><el-link type=”danger”>危险链接</el-link><el-link type=”info”>信息链接</el-link></div><h3>禁用状态</h3><div><el-link disabled>默认链接</el-link><el-link type=”primary” disabled>主要链接</el-link><el-link type=”success” disabled>成功链接</el-link><el-link type=”warning” disabled>警告链接</el-link><el-link type=”danger” disabled>危险链接</el-link><el-link type=”info” disabled>信息链接</el-link></div><h3>下划线</h3><div><el-link :underline=”false”>无下划线</el-link><el-link>有下划线</el-link></div><h3>图标</h3><div><el-link icon=”el-icon-edit”>编辑</el-link><el-link>查看<i class=”el-icon-view el-icon–right”></i> </el-link></div></div></template><script>export default {name: “App”,};</script><style></style>程序运行效果如果:
01f5efc7980d4032b613396d305861f7~noop.image?_iz=58558&from=article.pc_detail&lk3s=953192f4&x-expires=1717747982&x-signature=4zZ3bd6ct4OFkYlvTCABZ7ufytc%3D
图 14- 10 文字链接效果图
总结如下:
参数
说明
类型
可选值
默认值
type
类型
string
primary / success / warning / danger / info
default
underline
是否下划线
boolean

true
disabled
是否禁用状态
boolean

false
href
原生 href 属性
string


icon
图标类名
string

14.3 Form组件

在实际的项目使用中,我们经常会使用到Form表单元素,本节课我们就来一一讲解表单元素。

14.3.1 Radio单选框

1.基础使用

代码示例:
<template>
<div id=”app”>
<el-radio v-model=”radio” label=”1″>备选项</el-radio>
<el-radio v-model=”radio” label=”2″>备选项</el-radio>
</div>
</template>
<script>
export default {
name: “App”,
data() {
return {
radio: “1”,
};
},
};
</script>
<style>
</style>
程序运行,效果如图:
a902c33895ab417cb03e13e34d652915~noop.image?_iz=58558&from=article.pc_detail&lk3s=953192f4&x-expires=1717747982&x-signature=ciG91hrUQe1SDKxnFcYDUTNuQSI%3D
图 14- 11 单选按钮基础使用
通过以上示例代码,单选按钮选中的值就是label属性对应的值。

禁用状态

示例代码:
<template>
<div id=”app”>
<el-radio disabled v-model=”radio” label=”禁用”>禁用</el-radio>
<el-radio disabled v-model=”radio” label=”选中且禁用”>选中且禁用</el-radio>
</div>
</template>
<script>
export default {
name: “App”,
data() {
return {
radio: “选中且禁用”,
};
},
};
</script>
<style>
</style>
程序运行,效果如图:
53010420b74e429f833a7ba5db26e3d3~noop.image?_iz=58558&from=article.pc_detail&lk3s=953192f4&x-expires=1717747982&x-signature=6CLANjvNQUsRvlQRwPSMfuR6JpM%3D
图 14- 12 单选按钮禁用
设置disabled 属性,则单选按钮就可成为禁用状态。

单选框组

结合el-radio-group元素和子元素el-radio可以实现单选组,在el-radio-group中绑定v-model,在el-radio中设置好label即可,无需再给每一个el-radio绑定变量,另外,还提供了change事件来响应变化,它会传入一个参数value,示例代码如下:
<template>
<div id=”app”>
<el-radio-group v-model=”radio”>
<el-radio :label=”3″>备选项3</el-radio>
<el-radio :label=”6″>备选项6</el-radio>
<el-radio :label=”9″>备选项9</el-radio>
</el-radio-group>
</div>
</template>
<script>
export default {
name: “App”,
data() {
return {
radio: 3,
};
},
};
</script>
<style>
</style>
7aecd0ad893f4043a3066fbab93a0e6f~noop.image?_iz=58558&from=article.pc_detail&lk3s=953192f4&x-expires=1717747982&x-signature=csLk%2FfWR7WFWXECGYZ4l7oiQRUM%3D
图 14- 13 单选按钮组

按钮样式

把单选按钮设置为button样式:
<template>
<div id=”app”>
<div>
<el-radio-group v-model=”radio1″>
<el-radio-button label=”上海”></el-radio-button>
<el-radio-button label=”北京”></el-radio-button>
<el-radio-button label=”广州”></el-radio-button>
<el-radio-button label=”深圳”></el-radio-button>
</el-radio-group>
</div>
<div style=”margin-top: 20px”>
<el-radio-group v-model=”radio2″ size=”medium”>
<el-radio-button label=”上海”></el-radio-button>
<el-radio-button label=”北京”></el-radio-button>
<el-radio-button label=”广州”></el-radio-button>
<el-radio-button label=”深圳”></el-radio-button>
</el-radio-group>
</div>
<div style=”margin-top: 20px”>
<el-radio-group v-model=”radio3″ size=”small”>
<el-radio-button label=”上海”></el-radio-button>
<el-radio-button label=”北京” disabled></el-radio-button>
<el-radio-button label=”广州”></el-radio-button>
<el-radio-button label=”深圳”></el-radio-button>
</el-radio-group>
</div>
<div style=”margin-top: 20px”>
<el-radio-group v-model=”radio4″ disabled size=”mini”>
<el-radio-button label=”上海”></el-radio-button>
<el-radio-button label=”北京”></el-radio-button>
<el-radio-button label=”广州”></el-radio-button>
<el-radio-button label=”深圳”></el-radio-button>
</el-radio-group>
</div>
</div>
</template>
<script>
export default {
name: “App”,
data() {
return {
radio1: “上海”,
radio2: “上海”,
radio3: “上海”,
radio4: “上海”,
};
},
};
</script>
<style>
</style>
程序运行,效果如图:
cdde9d937d884fc0924b001d861ab195~noop.image?_iz=58558&from=article.pc_detail&lk3s=953192f4&x-expires=1717747982&x-signature=s0TvuXu381b1pcOWIjHTBuIdbNA%3D
图 14- 14 按钮样式的单选按钮
el-radio-button可以设置为按钮样式;

带有边框

设置border属性可以渲染为带有边框的单选框。
示例代码:
<template>
<div id=”app”>
<div>
<el-radio v-model=”radio1″ label=”1″ border>备选项1</el-radio>
<el-radio v-model=”radio1″ label=”2″ border>备选项2</el-radio>
</div>
<div style=”margin-top: 20px”>
<el-radio v-model=”radio2″ label=”1″ border size=”medium”
>备选项1</el-radio
>
<el-radio v-model=”radio2″ label=”2″ border size=”medium”
>备选项2</el-radio
>
</div>
<div style=”margin-top: 20px”>
<el-radio-group v-model=”radio3″ size=”small”>
<el-radio label=”1″ border>备选项1</el-radio>
<el-radio label=”2″ border disabled>备选项2</el-radio>
</el-radio-group>
</div>
<div style=”margin-top: 20px”>
<el-radio-group v-model=”radio4″ size=”mini” disabled>
<el-radio label=”1″ border>备选项1</el-radio>
<el-radio label=”2″ border>备选项2</el-radio>
</el-radio-group>
</div>
</div>
</template>
<script>
export default {
name: “App”,
data() {
return {
radio1: “2”,
radio2: “2”,
radio3: “2”,
radio4: “2”,
};
},
};
</script>
<style>
</style>
程序运行,效果如图:
0d069e8e05f648a1bd39666f0f58ed8d~noop.image?_iz=58558&from=article.pc_detail&lk3s=953192f4&x-expires=1717747982&x-signature=ERPsWJ2dyt9Ok%2FbUodtwldC3U4s%3D
图 14- 15 border边框样式
使用border 可以添加边框样式。

总结

参数
说明
类型
可选值
默认值
value / v-model
绑定值
string / number / boolean


label
Radio 的 value
string / number / boolean


disabled
是否禁用
boolean

false
border
是否显示边框
boolean

false
size
Radio 的尺寸,仅在 border 为真时有效
string
medium / small / mini

name
原生 name 属性
string

14.3.2 Checkbox多选框

1.基础使用

在el-checkbox元素中定义v-model绑定变量,单一的checkbox中,默认绑定变量的值会是Boolean,选中为true。
示例代码如下:
<template>
<div id=”app”>
<!– `checked` 为 true 或 false –>
<el-checkbox v-model=”checked”>备选项</el-checkbox>
</div>
</template>
<script>
export default {
name: “App”,
data() {
return {
checked: true,
};
},
};
</script>
程序运行,效果如图:
0b3d492d0e6f4abd8b33e71bb6945e29~noop.image?_iz=58558&from=article.pc_detail&lk3s=953192f4&x-expires=1717747982&x-signature=%2FZ5BA%2FsCbnz6skLEmrz1IVscVZk%3D
图 14- 16 单个复选框效果

禁用状态

多选框不可用状态。设置disabled属性即可。
示例代码:
<template>
<div id=”app”>
<!– `checked` 为 true 或 false –>
<el-checkbox v-model=”checked1″ disabled>备选项1</el-checkbox>
<el-checkbox v-model=”checked2″ disabled>备选项</el-checkbox>
</div>
</template>
<script>
export default {
name: “App”,
data() {
return {
checked1: true,
checked2: false,
};
},
};
</script>
程序运行,效果如图:
7f7370b6e52e4643b08a0807a209d68c~noop.image?_iz=58558&from=article.pc_detail&lk3s=953192f4&x-expires=1717747982&x-signature=H9gx1%2F3rW51GnCZjckXw46jU1C4%3D
图 14- 17 禁用复选框效果图

多选框组

checkbox-group元素能把多个 checkbox 管理为一组,只需要在 Group 中使用v-model绑定Array类型的变量即可。 el-checkbox 的 label属性是该 checkbox 对应的值,若该标签中无内容,则该属性也充当 checkbox 按钮后的介绍。label与数组中的元素值相对应,如果存在指定的值则为选中状态,否则为不选中。
示例代码:
<template>
<div id=”app”>
<!– `checked` 为 true 或 false –>
<el-checkbox v-model=”checked1″ disabled>备选项1</el-checkbox>
<el-checkbox v-model=”checked2″ disabled>备选项</el-checkbox>
</div>
</template>
<script>
export default {
name: “App”,
data() {
return {
checked1: true,
checked2: false,
};
},
};
</script>
程序运行,效果如图:
a788ad8d26164a31839512a1b7c91fe9~noop.image?_iz=58558&from=article.pc_detail&lk3s=953192f4&x-expires=1717747982&x-signature=ntGq5aSEu9AW4cqR5IKBF0K6ufI%3D
图 14- 18 复选框组效果图

indeterminate 状态

indeterminate 属性用以表示 checkbox 的不确定状态,一般用于实现全选的效果。
示例代码:
<template>
<div id=”app”>
<el-checkbox
:indeterminate=”isIndeterminate”
v-model=”checkAll”
@change=”handleCheckAllChange”
>全选</el-checkbox
>
<div style=”margin: 15px 0″></div>
<el-checkbox-group
v-model=”checkedCities”
@change=”handleCheckedCitiesChange”
>
<el-checkbox v-for=”city in cities” :label=”city” :key=”city”>{{
city
}}</el-checkbox>
</el-checkbox-group>
</div>
</template>
<script>
const cityOptions = [“上海”, “北京”, “广州”, “深圳”];
export default {
name: “App”,
data() {
return {
checkAll: false,
checkedCities: [“上海”, “北京”],
cities: cityOptions,
isIndeterminate: true,
};
},
methods: {
handleCheckAllChange(val) {
this.checkedCities = val ? cityOptions : [];
this.isIndeterminate = false;
},
handleCheckedCitiesChange(value) {
let checkedCount = value.length;
this.checkAll = checkedCount === this.cities.length;
this.isIndeterminate =
checkedCount > 0 && checkedCount < this.cities.length;
},
},
};
</script>
程序运行,效果如图:
3e1535d5a60345da9191c859c34c928a~noop.image?_iz=58558&from=article.pc_detail&lk3s=953192f4&x-expires=1717747982&x-signature=CD%2FeLxmTAuw2BEWoJ2bV%2BSlXKLQ%3D
图 14- 19 全选效果
在这注意,未全选,则indeterminate属性为true,全选的话则为true。

可选项目数量的限制

使用 min 和 max 属性能够限制可以被勾选的项目的数量。
示例代码如下:
<template>
<div id=”app”>
<!– `checked` 为 true 或 false –>
<el-checkbox v-model=”checked1″ disabled>备选项1</el-checkbox>
<el-checkbox v-model=”checked2″ disabled>备选项</el-checkbox>
</div>
</template>
<script>
export default {
name: “App”,
data() {
return {
checked1: true,
checked2: false,
};
},
};
</script>
程序运行,效果如图:
745ba96cdc6b422098d2f46862841546~noop.image?_iz=58558&from=article.pc_detail&lk3s=953192f4&x-expires=1717747982&x-signature=IMgExcCjqtyKgDRE6KcLi5cxinE%3D
图 14- 20 设置数量效果图

总结

复选框也可以设置按钮样式,使用<el-checkbox-button>即可;
复选框也可以像单选按钮一样加上边框,只需加上border属性即可;
参数
说明
类型
可选值
默认值
value / v-model
绑定值
string / number / boolean


label
选中状态的值(只有在checkbox-group或者绑定对象类型为array时有效)
string / number / boolean


true-label
选中时的值
string / number


false-label
没有选中时的值
string / number


disabled
是否禁用
boolean

false
border
是否显示边框
boolean

false
size
Checkbox 的尺寸,仅在 border 为真时有效
string
medium / small / mini

name
原生 name 属性
string


checked
当前是否勾选
boolean

false
indeterminate
设置 indeterminate 状态,只负责样式控制
boolean

false

14.3.3 Input输入框

1.基础使用

示例代码:
<template>
<div id=”app”>
<h3>基础用法</h3>
<el-input v-model=”input1″ placeholder=”请输入内容”></el-input>
<h3>基础用法,使用disabled属性禁用</h3>
<el-input placeholder=”请输入内容” v-model=”input2″ :disabled=”true”>
</el-input>
<h3>使用clearable属性即可得到一个可清空的输入框</h3>
<el-input placeholder=”请输入内容” v-model=”input3″ clearable> </el-input>
<h3>使用show-password属性即可得到一个可切换显示隐藏的密码框</h3>
<el-input
placeholder=”请输入密码”
v-model=”input4″
show-password
></el-input>
</div>
</template>
<script>
const cityOptions = [“上海”, “北京”, “广州”, “深圳”];
export default {
name: “App”,
data() {
return {
input1: “”,
input2: “”,
input3: “”,
input4: “”,
};
},
};
</script>
程序运行,效果如图:
8a24a40f79f84c8a84fe278dc98683c7~noop.image?_iz=58558&from=article.pc_detail&lk3s=953192f4&x-expires=1717747982&x-signature=7t4SXyccUSndkThH7Q27%2F%2FUvRLc%3D
清空图标
图 14- 21 input输入框的使用

带 icon 的输入框

可以通过 prefix-icon 和 suffix-icon 属性在 input 组件首部和尾部增加显示图标,也可以通过 slot 来放置图标。
示例代码:
<template>
<div id=”app”>
<div class=”demo-input-suffix”>
属性方式:
<el-input
placeholder=”请选择日期”
suffix-icon=”el-icon-date”
v-model=”input1″
>
</el-input>
<el-input
placeholder=”请输入内容”
prefix-icon=”el-icon-search”
v-model=”input2″
>
</el-input>
</div>
<div class=”demo-input-suffix”>
slot 方式:
<el-input placeholder=”请选择日期” v-model=”input3″>
<i slot=”suffix” class=”el-input__icon el-icon-date”></i>
</el-input>
<el-input placeholder=”请输入内容” v-model=”input4″>
<i slot=”prefix” class=”el-input__icon el-icon-search”></i>
</el-input>
</div>
</div>
</template>
<script>
const cityOptions = [“上海”, “北京”, “广州”, “深圳”];
export default {
name: “App”,
data() {
return {
input1: “”,
input2: “”,
input3: “”,
input4: “”,
};
},
};
</script>
程序运行,效果如图:
f93ddb84a325405f9e8f2473aac854e1~noop.image?_iz=58558&from=article.pc_detail&lk3s=953192f4&x-expires=1717747982&x-signature=2DEva1hVJ0dPwEVeK8rhgu0cDPI%3D
图 14- 22 带图标效果

文本域

用于输入多行文本信息,通过将 type 属性的值指定为 textarea。文本域高度可通过 rows 属性控制。
使用autosize属性可以自适应内容高度。
示例代码:
<template>
<div id=”app”>
<el-input
type=”textarea”
:rows=”2″
placeholder=”请输入内容”
v-model=”textarea”
>
</el-input>
<h3>加入autosize属性,可以自适应高度的文本域</h3>
<el-input
type=”textarea”
autosize
placeholder=”请输入内容”
v-model=”textarea1″
>
</el-input>
<div style=”margin: 20px 0″></div>
<el-input
type=”textarea”
:autosize=”{ minRows: 2, maxRows: 4 }”
placeholder=”请输入内容”
v-model=”textarea2″
>
</el-input>
</div>
</template>
<script>
export default {
name: “App”,
data() {
return {
textarea: “”,
textarea1: “”,
textarea2: “”,
};
},
};
</script>
程序运行,效果如图:
96a93abec79e46f790f2d39e73a4d1b7~noop.image?_iz=58558&from=article.pc_detail&lk3s=953192f4&x-expires=1717747982&x-signature=zuJMUnDWhohG13uEqCScuLP3B%2BE%3D
图 14- 23 文本域效果图

复合型输入框

可前置或后置元素,一般为标签或按钮.可通过 slot 来指定在 input 中前置或者后置内容。
slot=”prepend”:前置内容;
slot=”append”:后置内容;
示例代码:
<template>
<div id=”app”>
<div>
<el-input placeholder=”请输入内容” v-model=”input1″>
<template slot=”prepend”>Http://</template>
</el-input>
</div>
<div style=”margin-top: 15px”>
<el-input placeholder=”请输入内容” v-model=”input2″>
<template slot=”append”>.com</template>
</el-input>
</div>
<div style=”margin-top: 15px”>
<el-input
placeholder=”请输入内容”
v-model=”input3″
class=”input-with-select”
>
<el-select v-model=”select” slot=”prepend” placeholder=”请选择”>
<el-option label=”餐厅名” value=”1″></el-option>
<el-option label=”订单号” value=”2″></el-option>
<el-option label=”用户电话” value=”3″></el-option>
</el-select>
<el-button slot=”append” icon=”el-icon-search”></el-button>
</el-input>
</div>
</div>
</template>
<script>
export default {
name: “App”,
data() {
return {
input1: “”,
input2: “”,
input3: “”,
select: “”,
};
},
};
</script>
<style>
.el-select .el-input {
width: 130px;
}
.input-with-select .el-input-group__prepend {
background-color: #fff;
}
</style>
程序运行,效果如图:
df760578645b4b2eb7a598488b139efc~noop.image?_iz=58558&from=article.pc_detail&lk3s=953192f4&x-expires=1717747982&x-signature=DYzTxK%2F3XbqV7WznzgDeJ03lCAQ%3D
图 14- 24 复合型输入框效果图

尺寸

通过设置size的不同的值,可以控制文本框的尺寸;
size = medium/small/mini
示例代码:
<template>
<div id=”app”>
<div class=”demo-input-size”>
<h3>不加入size</h3>
<el-input
placeholder=”请输入内容”
suffix-icon=”el-icon-date”
v-model=”input1″
>
</el-input>
<h3>size=”medium”</h3>
<el-input
size=”medium”
placeholder=”请输入内容”
suffix-icon=”el-icon-date”
v-model=”input2″
>
</el-input>
<h3>size=”small”</h3>
<el-input
size=”small”
placeholder=”请输入内容”
suffix-icon=”el-icon-date”
v-model=”input3″
>
</el-input>
<h3>size=”mini”</h3>
<el-input
size=”mini”
placeholder=”请输入内容”
suffix-icon=”el-icon-date”
v-model=”input4″
>
</el-input>
</div>
</div>
</template>
<script>
export default {
name: “App”,
data() {
return {
input1: “”,
input2: “”,
input3: “”,
input4: “”,
};
},
};
</script>
程序运行,效果如图:
4807f02f5b07421faa7c9b92488ef8da~noop.image?_iz=58558&from=article.pc_detail&lk3s=953192f4&x-expires=1717747982&x-signature=UFA5sBlbPOoR0A7n5L%2B7tGC3uuY%3D
图 14- 25 尺寸效果图

带输入建议

根据输入内容提供对应的输入建议。autocomplete 是一个可带输入建议的输入框组件,fetch-suggestions 是一个返回输入建议的方法属性,如 querySearch(queryString, cb),在该方法中你可以在你的输入建议数据准备好时通过 cb(data) 返回到 autocomplete 组件中。
示例代码:
<template>
<div id=”app”>
<el-row class=”demo-autocomplete”>
<el-col :span=”12″>
<el-autocomplete
class=”inline-input”
v-model=”state1″
:fetch-suggestions=”querySearch”
placeholder=”请输入内容”
></el-autocomplete>
</el-col>
<el-col :span=”12″>
<h3>自定义模板</h3>
<el-autocomplete
popper-class=”my-autocomplete”
v-model=”state”
:fetch-suggestions=”querySearch”
placeholder=”请输入内容”
>
<i class=”el-icon-edit el-input__icon” slot=”suffix”> </i>
<template slot-scope=”{ item }”>
<div class=”name”>{{ item.value }}</div>
<span class=”addr”>{{ item.address }}</span>
</template>
</el-autocomplete>
</el-col>
</el-row>
</div>
</template>
<script>
export default {
name: “App”,
data() {
return {
restaurants: [],
state1: “”,
state: “”,
};
},
methods: {
querySearch(queryString, cb) {
var restaurants = this.restaurants;
var results = queryString
? restaurants.filter(this.createFilter(queryString))
: restaurants;
// 调用 callback 返回建议列表的数据
cb(results);
},
createFilter(queryString) {
return (restaurant) => {
return (
restaurant.value.toLowerCase().indexOf(queryString.toLowerCase()) ===
0
);
};
},
loadAll() {
return [
{ value: “三全鲜食(北新泾店)”, address: “长宁区新渔路144号” },
{
value: “Hot honey 首尔炸鸡(仙霞路)”,
address: “上海市长宁区淞虹路661号”,
},
{
value: “新旺角茶餐厅”,
address: “上海市普陀区真北路988号创邑金沙谷6号楼113”,
},
{ value: “泷千家(天山西路店)”, address: “天山西路438号” },
{
value: “胖仙女纸杯蛋糕(上海凌空店)”,
address: “上海市长宁区金钟路968号1幢18号楼一层商铺18-101”,
},
{ value: “贡茶”, address: “上海市长宁区金钟路633号” },
{
value: “豪大大香鸡排超级奶爸”,
address: “上海市嘉定区曹安公路曹安路1685号”,
},
{
value: “茶芝兰(奶茶,手抓饼)”,
address: “上海市普陀区同普路1435号”,
},
{ value: “十二泷町”, address: “上海市北翟路1444弄81号B幢-107” },
{ value: “星移浓缩咖啡”, address: “上海市嘉定区新郁路817号” },
{ value: “阿姨奶茶/豪大大”, address: “嘉定区曹安路1611号” },
{ value: “新麦甜四季甜品炸鸡”, address: “嘉定区曹安公路2383弄55号” },
{
value: “Monica摩托主题咖啡店”,
address: “嘉定区江桥镇曹安公路2409号1F,2383弄62号1F”,
},
{
value: “浮生若茶(凌空soho店)”,
address: “上海长宁区金钟路968号9号楼地下一层”,
},
{ value: “NONO JUICE 鲜榨果汁”, address: “上海市长宁区天山西路119号” },
{ value: “CoCo都可(北新泾店)”, address: “上海市长宁区仙霞西路” },
{
value: “快乐柠檬(神州智慧店)”,
address: “上海市长宁区天山西路567号1层R117号店铺”,
},
{
value: “Merci Paul cafe”,
address: “上海市普陀区光复西路丹巴路28弄6号楼819”,
},
{
value: “猫山王(西郊百联店)”,
address: “上海市长宁区仙霞西路88号第一层G05-F01-1-306”,
},
{ value: “枪会山”, address: “上海市普陀区棕榈路” },
{ value: “纵食”, address: “元丰天山花园(东门) 双流路267号” },
{ value: “钱记”, address: “上海市长宁区天山西路” },
{ value: “壹杯加”, address: “上海市长宁区通协路” },
{
value: “唦哇嘀咖”,
address: “上海市长宁区新泾镇金钟路999号2幢(B幢)第01层第1-02A单元”,
},
{ value: “爱茜茜里(西郊百联)”, address: “长宁区仙霞西路88号1305室” },
{
value: “爱茜茜里(近铁广场)”,
address:
“上海市普陀区真北路818号近铁城市广场北区地下二楼N-B2-O2-C商铺”,
},
{
value: “鲜果榨汁(金沙江路和美广店)”,
address: “普陀区金沙江路2239号金沙和美广场B1-10-6”,
},
{
value: “开心丽果(缤谷店)”,
address: “上海市长宁区威宁路天山路341号”,
},
{ value: “超级鸡车(丰庄路店)”, address: “上海市嘉定区丰庄路240号” },
{ value: “妙生活果园(北新泾店)”, address: “长宁区新渔路144号” },
{ value: “香宜度麻辣香锅”, address: “长宁区淞虹路148号” },
{
value: “凡仔汉堡(老真北路店)”,
address: “上海市普陀区老真北路160号”,
},
{ value: “港式小铺”, address: “上海市长宁区金钟路968号15楼15-105室” },
{ value: “蜀香源麻辣香锅(剑河路店)”, address: “剑河路443-1” },
{ value: “北京饺子馆”, address: “长宁区北新泾街道天山西路490-1号” },
{
value: “饭典*新简餐(凌空SOHO店)”,
address: “上海市长宁区金钟路968号9号楼地下一层9-83室”,
},
{
value: “焦耳·川式快餐(金钟路店)”,
address: “上海市金钟路633号地下一层甲部”,
},
{ value: “动力鸡车”, address: “长宁区仙霞西路299弄3号101B” },
{ value: “浏阳蒸菜”, address: “天山西路430号” },
{ value: “四海游龙(天山西路店)”, address: “上海市长宁区天山西路” },
{
value: “樱花食堂(凌空店)”,
address: “上海市长宁区金钟路968号15楼15-105室”,
},
{ value: “壹分米客家传统调制米粉(天山店)”, address: “天山西路428号” },
{
value: “福荣祥烧腊(平溪路店)”,
address: “上海市长宁区协和路福泉路255弄57-73号”,
},
{
value: “速记黄焖鸡米饭”,
address: “上海市长宁区北新泾街道金钟路180号1层01号摊位”,
},
{ value: “红辣椒麻辣烫”, address: “上海市长宁区天山西路492号” },
{
value: “(小杨生煎)西郊百联餐厅”,
address: “长宁区仙霞西路88号百联2楼”,
},
{ value: “阳阳麻辣烫”, address: “天山西路389号” },
{
value: “南拳妈妈龙虾盖浇饭”,
address: “普陀区金沙江路1699号鑫乐惠美食广场A13”,
},
];
},
},
mounted() {
this.restaurants = this.loadAll();
},
};
</script>
<style scoped>
li {
line-height: normal;
padding: 7px;
}
.name {
text-overflow: ellipsis;
overflow: hidden;
}
.addr {
font-size: 12px;
color: #b4b4b4;
}
.highlighted .addr {
color: #ddd;
}
</style>
程序运行,效果如图:
fbbffe9b533449608c7ab54fb0dfe823~noop.image?_iz=58558&from=article.pc_detail&lk3s=953192f4&x-expires=1717747982&x-signature=6jWuz9WFhS4TN6K6H0vDDKsmj4k%3D
图 14- 26 自带建议输入框效果
68ccd0b2a29a4fdab8ea49f846a91744~noop.image?_iz=58558&from=article.pc_detail&lk3s=953192f4&x-expires=1717747982&x-signature=RPQN1U9lirUwm0BbhTPhKvaMSdw%3D
图 14- 27 自定义模板效果图
在案例中,使用template模板标签可以自定义建议的模板;

输入长度限制

maxlength 和 minlength 是原生属性,用来限制输入框的字符长度,其中字符长度是用 Javascript 的字符串长度统计的。对于类型为 text 或 textarea 的输入框,在使用 maxlength 属性限制最大输入长度的同时,可通过设置 show-word-limit 属性来展示字数统计。
示例代码:
<template>
<div id=”app”>
<el-input
type=”text”
placeholder=”请输入内容”
v-model=”text”
maxlength=”10″
show-word-limit
>
</el-input>
<div style=”margin: 20px 0″></div>
<el-input
type=”textarea”
placeholder=”请输入内容”
v-model=”textarea”
maxlength=”30″
show-word-limit
>
</el-input>
</div>
</template>
<script>
export default {
name: “App”,
data() {
return {
text: “”,
textarea: “”,
};
},
};
</script>
程序运行,效果如图:
4d5ef7c9200b4a09b5f45d32556b4fbb~noop.image?_iz=58558&from=article.pc_detail&lk3s=953192f4&x-expires=1717747982&x-signature=O1HZWU8gYaqIclirRWtbznQCDG0%3D
图 14- 28 展示字数统计效果图

总结

参数
说明
类型
可选值
默认值
type
类型
string
text,textarea 和其他 原生 input 的 type 值
text
value / v-model
绑定值
string / number


maxlength
原生属性,最大输入长度
number


minlength
原生属性,最小输入长度
number


show-word-limit
是否显示输入字数统计,只在 type = “text” 或 type = “textarea” 时有效
boolean

false
placeholder
输入框占位文本
string


clearable
是否可清空
boolean

false
show-password
是否显示切换密码图标
boolean

false
disabled
禁用
boolean

false
size
输入框尺寸,只在 type!=”textarea” 时有效
string
medium / small / mini

prefix-icon
输入框头部图标
string


suffix-icon
输入框尾部图标
string


rows
输入框行数,只对 type=”textarea” 有效
number

2
autosize
自适应内容高度,只对 type=”textarea” 有效,可传入对象,如,{ minRows: 2, maxRows: 6 }
boolean / object

false
autocomplete
原生属性,自动补全
string
on, off
off
auto-complete
下个主版本弃用
string
on, off
off
name
原生属性
string


readonly
原生属性,是否只读
boolean

false
max
原生属性,设置最大值



min
原生属性,设置最小值



step
原生属性,设置输入字段的合法数字间隔



resize
控制是否能被用户缩放
string
none, both, horizontal, vertical

autofocus
原生属性,自动获取焦点
boolean
true, false
false
form
原生属性
string


label
输入框关联的label文字
string


tabindex
输入框的tabindex
string


validate-event
输入时是否触发表单的校验
boolean

true

14.3.4 InputNumber计算器

仅允许输入标准的数字值,可定义范围。

1.使用

<template>
<div id=”app”>
<h3>基础使用</h3>
<el-input-number
v-model=”num1″
@change=”handleChange”
:min=”1″
:max=”10″
label=”描述文字”
></el-input-number>
<h3>
禁用状态,disabled属性接受一个Boolean,设置为true即可禁用整个组件,如果你只需要控制数值在某一范围内,可以设置min属性和max属性,不设置min和max时,最小值为
0。
</h3>
<el-input-number v-model=”num2″ :disabled=”true”></el-input-number>
<h3>步数,设置step属性可以控制步长,接受一个Number。</h3>
<el-input-number v-model=”num3″ :step=”2″></el-input-number>
<h3>
严格步数,step-strictly属性接受一个Boolean。如果这个属性被设置为true,则只能输入步数的倍数。
</h3>
<el-input-number v-model=”num4″ :step=”2″ step-strictly></el-input-number>
<h3>
精度,precision 的值必须是一个非负整数,并且不能小于 step 的小数位数。
</h3>
<el-input-number
v-model=”num5″
:precision=”2″
:step=”0.1″
:max=”10″
></el-input-number>
<h3>尺寸,提供了 medium、small、mini 三种尺寸的数字输入框</h3>
<el-input-number size=”medium” v-model=”num6″></el-input-number>
<el-input-number size=”small” v-model=”num7″></el-input-number>
<el-input-number size=”mini” v-model=”num8″></el-input-number>
<h3>按钮位置,设置 controls-position 属性可以控制按钮位置。</h3>
<el-input-number
v-model=”num9″
controls-position=”right”
@change=”handleChange”
:min=”1″
:max=”10″
></el-input-number>
</div>
</template>
<script>
export default {
name: “App”,
data() {
return {
num1: 0,
num2: 0,
num3: 0,
num4: 0,
num5: 0,
num6: 0,
num7: 0,
num8: 0,
num9: 0,
};
},
};
</script>
程序运行,效果如图:
e8d3d00feca344d39e8d6473d71e13b9~noop.image?_iz=58558&from=article.pc_detail&lk3s=953192f4&x-expires=1717747982&x-signature=704mtbLfB64yUQHliTYkfSjkzfw%3D
2c6bd6a7a26442a29b1ffa8b1bcb2dd6~noop.image?_iz=58558&from=article.pc_detail&lk3s=953192f4&x-expires=1717747982&x-signature=axF5jdWoIMoo6AhwXKSuXML%2B%2FdE%3D
图 14- 29 效果图

2.总结

参数
说明
类型
可选值
默认值
value / v-model
绑定值
number

0
min
设置计数器允许的最小值
number

-Infinity
max
设置计数器允许的最大值
number

Infinity
step
计数器步长
number

1
step-strictly
是否只能输入 step 的倍数
boolean

false
precision
数值精度
number


size
计数器尺寸
string
large, small

disabled
是否禁用计数器
boolean

false
controls
是否使用控制按钮
boolean

true
controls-position
控制按钮位置
string
right

name
原生属性
string


label
输入框关联的label文字
string


placeholder
输入框默认 placeholder
string

14.3.5 Select选择器

当选项过多时,使用下拉菜单展示并选择内容。

基础使用

适用广泛的基础单选。v-model的值为当前被选中的el-option的 value 属性值。
核心代码如下:
<template>
<div id=”app”>
<el-select v-model=”value” placeholder=”请选择”>
<el-option
v-for=”item in options”
:key=”item.value”
:label=”item.label”
:value=”item.value”
>
</el-option>
</el-select>
</div>
</template>
<script>
export default {
name: “App”,
data() {
return {
options: [
{
value: “选项1”,
label: “黄金糕”,
},
{
value: “选项2”,
label: “双皮奶”,
},
{
value: “选项3”,
label: “蚵仔煎”,
},
{
value: “选项4”,
label: “龙须面”,
},
{
value: “选项5”,
label: “北京烤鸭”,
},
],
value: “”,
};
},
};
</script>
程序运行,效果如下图:
d04ad6b0b7bc4ef4961a0585224deb66~noop.image?_iz=58558&from=article.pc_detail&lk3s=953192f4&x-expires=1717747982&x-signature=p%2BgDsoopQhtDIFMBQg1uHeUfUis%3D
图 14- 30 下拉框效果图

禁用状态

为el-select设置disabled属性,则整个选择器不可用。
核心代码如下:
<el-select v-model=”value” placeholder=”请选择” disabled>
<el-option
v-for=”item in options”
:key=”item.value”
:label=”item.label”
:value=”item.value”
>
</el-option>
</el-select>

基础多选

<el-select
v-model=”value”
multiple
collapse-tags
style=”margin-left: 20px”
placeholder=”请选择”
>
<el-option
v-for=”item in options”
:key=”item.value”
:label=”item.label”
:value=”item.value”
>
</el-option>
</el-select>
为el-select设置multiple属性即可启用多选,此时v-model的值为当前选中值所组成的数组。默认情况下选中值会以 Tag 的形式展现,你也可以设置collapse-tags属性将它们合并为一段文字。
核心代码如下:
20f2bf08c76c4befa062a32b74df5f0e~noop.image?_iz=58558&from=article.pc_detail&lk3s=953192f4&x-expires=1717747982&x-signature=zL7WOu%2FE%2B108d93znG0q6ZdF3LY%3D
图 14- 31 设置多选

自定义模板

将自定义的 HTML 模板插入el-option的 slot 中即可。
核心代码如下:
<el-select v-model=”value” placeholder=”请选择”>
<el-option
v-for=”item in cities”
:key=”item.value”
:label=”item.label”
:value=”item.value”>
<span style=”float: left”>{{ item.label }}</span>
<span style=”float: right; color: #8492a6; font-size: 13px”>{{ item.value }}</span>
</el-option>
</el-select>
程序运行效果如图:
2f11ed25add846c1953bd63dd2794bcb~noop.image?_iz=58558&from=article.pc_detail&lk3s=953192f4&x-expires=1717747982&x-signature=2rS3uGQmkeHhYt%2FxSnem5721VNI%3D
图 14- 32 自定义模板效果图

分组

使用el-option-group对备选项进行分组,它的label属性为分组名。
核心代码如下:
<template>
<div id=”app”>
<el-select v-model=”value” placeholder=”请选择”>
<el-option-group
v-for=”group in options”
:key=”group.label”
:label=”group.label”
>
<el-option
v-for=”item in group.options”
:key=”item.value”
:label=”item.label”
:value=”item.value”
>
</el-option>
</el-option-group>
</el-select>
</div>
</template>
<script>
export default {
name: “App”,
data() {
return {
options: [
{
label: “热门城市”,
options: [
{
value: “Shanghai”,
label: “上海”,
},
{
value: “Beijing”,
label: “北京”,
},
],
},
{
label: “城市名”,
options: [
{
value: “Chengdu”,
label: “成都”,
},
{
value: “Shenzhen”,
label: “深圳”,
},
{
value: “Guangzhou”,
label: “广州”,
},
{
value: “Dalian”,
label: “大连”,
},
],
},
],
value: “”,
};
},
};
</script>
程序运行效果如下图:
e886aaa1b9254f4e893fc002b307a20c~noop.image?_iz=58558&from=article.pc_detail&lk3s=953192f4&x-expires=1717747982&x-signature=ztszSFq%2FgV5s%2B4xgNtS5TtPUpI4%3D
图 14- 33 分组效果

搜索

为el-select添加filterable属性即可启用搜索功能。默认情况下,Select 会找出所有label属性包含输入值的选项。如果希望使用其他的搜索逻辑,可以通过传入一个filter-method来实现。filter-method为一个Function,它会在输入值发生变化时调用,参数为当前输入值。
核心代码如下:
<el-select v-model=”value” filterable placeholder=”请选择”>
<el-option
v-for=”item in options”
:key=”item.value”
:label=”item.label”
:value=”item.value”>
</el-option>
</el-select>
程序运行效果如下图:
447d6c40766b45ba8358b01da92a9078~noop.image?_iz=58558&from=article.pc_detail&lk3s=953192f4&x-expires=1717747982&x-signature=P5uhoz7fA%2FqUEbBmLzk4nvhmmB4%3D
图 14- 34 搜索效果

创建条目

使用allow-create属性即可通过在输入框中输入文字来创建新的条目。注意此时filterable必须为真。本例还使用了default-first-option属性,在该属性打开的情况下,按下回车就可以选中当前选项列表中的第一个选项,无需使用鼠标或键盘方向键进行定位。
核心代码如下:
<el-select
v-model=”value”
multiple
filterable
allow-create
default-first-option
placeholder=”请选择文章标签”>
<el-option
v-for=”item in options”
:key=”item.value”
:label=”item.label”
:value=”item.value”>
</el-option>
</el-select>
程序运行效果如下图:
cff96ce8469d4578be5a4e438bf4d5ac~noop.image?_iz=58558&from=article.pc_detail&lk3s=953192f4&x-expires=1717747982&x-signature=eovTDBrBKoVqxxPam%2BaNBJ%2Fex64%3D
图 14- 35 自创条目效果

14.3.6 Cascader级联选择器

当一个数据集合有清晰的层级结构时,可通过级联选择器逐级查看并选择。

基础使用

只需为 Cascader 的options属性指定选项数组即可渲染出一个级联选择器。通过props.expandTrigger可以定义展开子级菜单的触发方式。
示例代码:
<template>
<div id=”app”>
<div class=”block”>
<span class=”demonstration”>默认 click 触发子菜单</span>
<el-cascader
v-model=”value1″
:options=”options”
@change=”handleChange”
></el-cascader>
</div>
<div class=”block”>
<span class=”demonstration”>hover 触发子菜单</span>
<el-cascader
v-model=”value2″
:options=”options”
:props=”{ expandTrigger: ‘hover’ }”
@change=”handleChange”
></el-cascader>
</div>
</div>
</template>
<script>
export default {
name: “App”,
data() {
return {
value1: [],
value2: [],
options: [
{
value: “zhinan”,
label: “指南”,
children: [
{
value: “shejiyuanze”,
label: “设计原则”,
children: [
{
value: “yizhi”,
label: “一致”,
},
{
value: “fankui”,
label: “反馈”,
},
{
value: “xiaolv”,
label: “效率”,
},
{
value: “kekong”,
label: “可控”,
},
],
},
{
value: “daohang”,
label: “导航”,
children: [
{
value: “cexiangdaohang”,
label: “侧向导航”,
},
{
value: “dingbudaohang”,
label: “顶部导航”,
},
],
},
],
},
{
value: “zujian”,
label: “组件”,
children: [
{
value: “basic”,
label: “Basic”,
children: [
{
value: “layout”,
label: “Layout 布局”,
},
{
value: “color”,
label: “Color 色彩”,
},
{
value: “typography”,
label: “Typography 字体”,
},
{
value: “icon”,
label: “Icon 图标”,
},
{
value: “button”,
label: “Button 按钮”,
},
],
},
{
value: “form”,
label: “Form”,
children: [
{
value: “radio”,
label: “Radio 单选框”,
},
{
value: “checkbox”,
label: “Checkbox 多选框”,
},
{
value: “input”,
label: “Input 输入框”,
},
{
value: “input-number”,
label: “InputNumber 计数器”,
},
{
value: “select”,
label: “Select 选择器”,
},
{
value: “cascader”,
label: “Cascader 级联选择器”,
},
{
value: “switch”,
label: “Switch 开关”,
},
{
value: “slider”,
label: “Slider 滑块”,
},
{
value: “time-picker”,
label: “TimePicker 时间选择器”,
},
{
value: “date-picker”,
label: “DatePicker 日期选择器”,
},
{
value: “datetime-picker”,
label: “DateTimePicker 日期时间选择器”,
},
{
value: “upload”,
label: “Upload 上传”,
},
{
value: “rate”,
label: “Rate 评分”,
},
{
value: “form”,
label: “Form 表单”,
},
],
},
{
value: “data”,
label: “Data”,
children: [
{
value: “table”,
label: “Table 表格”,
},
{
value: “tag”,
label: “Tag 标签”,
},
{
value: “progress”,
label: “Progress 进度条”,
},
{
value: “tree”,
label: “Tree 树形控件”,
},
{
value: “pagination”,
label: “Pagination 分页”,
},
{
value: “badge”,
label: “Badge 标记”,
},
],
},
{
value: “notice”,
label: “Notice”,
children: [
{
value: “alert”,
label: “Alert 警告”,
},
{
value: “loading”,
label: “Loading 加载”,
},
{
value: “message”,
label: “Message 消息提示”,
},
{
value: “message-box”,
label: “MessageBox 弹框”,
},
{
value: “notification”,
label: “Notification 通知”,
},
],
},
{
value: “navigation”,
label: “Navigation”,
children: [
{
value: “menu”,
label: “NavMenu 导航菜单”,
},
{
value: “tabs”,
label: “Tabs 标签页”,
},
{
value: “breadcrumb”,
label: “Breadcrumb 面包屑”,
},
{
value: “dropdown”,
label: “Dropdown 下拉菜单”,
},
{
value: “steps”,
label: “Steps 步骤条”,
},
],
},
{
value: “others”,
label: “Others”,
children: [
{
value: “dialog”,
label: “Dialog 对话框”,
},
{
value: “tooltip”,
label: “Tooltip 文字提示”,
},
{
value: “popover”,
label: “Popover 弹出框”,
},
{
value: “card”,
label: “Card 卡片”,
},
{
value: “carousel”,
label: “Carousel 走马灯”,
},
{
value: “collapse”,
label: “Collapse 折叠面板”,
},
],
},
],
},
{
value: “ziyuan”,
label: “资源”,
children: [
{
value: “axure”,
label: “Axure Components”,
},
{
value: “sketch”,
label: “Sketch Templates”,
},
{
value: “jiaohu”,
label: “组件交互文档”,
},
],
},
],
};
},
methods: {
handleChange(value) {
console.log(value);
},
},
};
</script>
<style lang=”” scoped>
.block {
float: left;
}
</style>
运行程序,效果如图:
a69fcdeee41e4e23951e244fb3b70938~noop.image?_iz=58558&from=article.pc_detail&lk3s=953192f4&x-expires=1717747982&x-signature=rbrdwcbgEcrNDPNcGYIf5vijZU0%3D
图 14- 36 级联菜单

禁用状态

通过在数据源中设置 disabled 字段来声明该选项是禁用的。该属性也可以在子集中添加。
0dd083231f284e70aa57cbac1418820e~noop.image?_iz=58558&from=article.pc_detail&lk3s=953192f4&x-expires=1717747982&x-signature=LSIt52QIOLWReORewW%2FkOh%2ByjzY%3D
加入该属性,则禁用该选项
图 14- 37 设置禁用
本例中,options指定的数组中的第一个元素含有disabled: true键值对,因此是禁用的。在默认情况下,Cascader 会检查数据中每一项的disabled字段是否为true,如果你的数据中表示禁用含义的字段名不为disabled,可以通过props.disabled属性来指定。当然,value、label和children这三个字段名也可以通过同样的方式指定。

可清空

通过 clearable 设置输入框可清空。
核心代码如下:
<el-cascader :options=”options” clearable></el-cascader>
效果如图:
8c0a7655333042768913d75e9cd3f5c5~noop.image?_iz=58558&from=article.pc_detail&lk3s=953192f4&x-expires=1717747982&x-signature=S3TbS6FBdgNwExxGHqpsS115BfE%3D

仅显示最后一级

可以仅在输入框中显示选中项最后一级的标签,而不是选中项所在的完整路径。
属性show-all-levels定义了是否显示完整的路径,将其赋值为false则仅显示最后一级。
核心代码如下:
<el-cascader :options=”options” :show-all-levels=”false”></el-cascader>

可多选

可通过 props.multiple = true 来开启多选模式。在开启多选模式后,默认情况下会展示所有已选中的选项的Tag,你可以使用collapse-tags来折叠Tag。
核心代码如下:
2b884cf2d3634da1a0607e6cf4b95892~noop.image?_iz=58558&from=article.pc_detail&lk3s=953192f4&x-expires=1717747982&x-signature=tTfxDDse8BAv%2FJgZLD2X6WOur5s%3D
在data中设置props
加入props属性
图 14- 38 多选代码
也可以设置折叠选项,只需要加入collapse-tags,核心代码如下:
<el-cascader
v-model=”value1″
:options=”options”
@change=”handleChange”
:props=”props”
collapse-tags
></el-cascader>

任意选择一级选项

在单选模式下,你只能选择叶子节点;而在多选模式下,勾选父节点真正选中的都是叶子节点。启用该功能后,可让父子节点取消关联,选择任意一级选项。可通过 props.checkStrictly = true 来设置父子节点取消选中关联,从而达到选择任意一级选项的目的。
核心代码如下:
<div class=”block”>
<span class=”demonstration”>单选选择任意一级选项</span>
<el-cascader
:options=”options”
:props=”{ checkStrictly: true }”
clearable></el-cascader>
</div>
<div class=”block”>
<span class=”demonstration”>多选选择任意一级选项</span>
<el-cascader
:options=”options”
:props=”{ multiple: true, checkStrictly: true }”
clearable></el-cascader>
</div>
程序运行,单选选择效果如图:
53762b01121741f0b1a27a8854a40d99~noop.image?_iz=58558&from=article.pc_detail&lk3s=953192f4&x-expires=1717747982&x-signature=HLJ2dAsUU0BzagYHz1%2Bd7JfbS0k%3D
图 14- 39 单选父节点消失效果
程序运行,多选效果如下图:
c51f3e223d3a46c6b9382f201c7a2dcb~noop.image?_iz=58558&from=article.pc_detail&lk3s=953192f4&x-expires=1717747982&x-signature=dCyWTuyOG94KpOl%2FkMoaaV4inh8%3D
可以点击关闭父节点
图 14- 40 多选效果如图

动态加载

当选中某一级时,动态加载该级下的选项。通过lazy开启动态加载,并通过lazyload来设置加载数据源的方法。lazyload方法有两个参数,第一个参数node为当前点击的节点,第二个resolve为数据加载完成的回调(必须调用)。为了更准确的显示节点的状态,还可以对节点数据添加是否为叶子节点的标志位 (默认字段为leaf,可通过props.leaf修改),否则会简单的以有无子节点来判断是否为叶子节点。
核心代码如下:
<el-cascader :props=”props”></el-cascader>
<script>
let id = 0;
export default {
data() {
return {
props: {
lazy: true,
lazyLoad (node, resolve) {
const { level } = node;
setTimeout(() => {
const nodes = Array.from({ length: level + 1 })
.map(item => ({
value: ++id,
label: `选项${id}`,
leaf: level >= 2
}));
// 通过调用resolve将子节点数据返回,通知组件数据加载完成
resolve(nodes);
}, 1000);
}
}
};
}
};
</script>

可搜索

可以快捷地搜索选项并选择。将filterable赋值为true即可打开搜索功能,默认会匹配节点的label或所有父节点的label(由show-all-levels决定)中包含输入值的选项。你也可以用filter-method自定义搜索逻辑,接受一个函数,第一个参数是节点node,第二个参数是搜索关键词keyword,通过返回布尔值表示是否命中。
核心代码如下:
<div class=”block”>
<span class=”demonstration”>单选可搜索</span>
<el-cascader
placeholder=”试试搜索:指南”
:options=”options”
filterable></el-cascader>
</div>
<div class=”block”>
<span class=”demonstration”>多选可搜索</span>
<el-cascader
placeholder=”试试搜索:指南”
:options=”options”
:props=”{ multiple: true }”
filterable></el-cascader>
</div>
程序运行,效果如图:
77057bc412fa40f4b1b8cc847cb94a7a~noop.image?_iz=58558&from=article.pc_detail&lk3s=953192f4&x-expires=1717747982&x-signature=lIoxbz97EAcLVpOlYLZCEqL0bkY%3D
图 14- 41 搜索效果

自定义节点内容

可以自定义备选项的节点内容。可以通过scoped slot对级联选择器的备选项的节点内容进行自定义,scoped slot会传入两个字段 node 和 data,分别表示当前节点的 Node 对象和数据。
核心代码:
<el-cascader :options=”options”>
<template slot-scope=”{ node, data }”>
<span>{{ data.label }}</span>
<span v-if=”!node.isLeaf”> ({{ data.children.length }}) </span>
</template>
</el-cascader>

级联面板

级联面板是级联选择器的核心组件,与级联选择器一样,有单选、多选、动态加载等多种功能。
核心代码如下:
<el-cascader-panel :options=”options”></el-cascader-panel>
和级联选择器一样,通过options来指定选项,也可通过props来设置多选、动态加载等功能。

14.3.7 Switch开关

表示两种相互对立的状态间的切换,多用于触发「开/关」。

基础使用

绑定v-model到一个Boolean类型的变量。可以使用active-color属性与inactive-color属性来设置开关的背景色。
使用active-text属性与inactive-text属性来设置开关的文字描述。
设置active-value和inactive-value属性,接受Boolean, String或Number类型的值。
设置disabled属性,接受一个Boolean,设置true即可禁用。
示例代码:
<template>
<div id=”app”>
<h3>基础使用</h3>
<el-switch v-model=”value1″ active-color=”#13ce66″ inactive-color=”#ff4949″>
</el-switch>
<h3>文字描述</h3>
<el-switch v-model=”value2″ active-text=”按月付费” inactive-text=”按年付费”>
</el-switch>
<el-switch
style=”display: block”
v-model=”value3″
active-color=”#13ce66″
inactive-color=”#ff4949″
active-text=”按月付费”
inactive-text=”按年付费”
>
</el-switch>
<h3>扩展的 value 类型</h3>
<el-tooltip :content=”‘Switch value: ‘ + value” placement=”top”>
<el-switch
v-model=”value4″
active-color=”#13ce66″
inactive-color=”#ff4949″
active-value=”100″
inactive-value=”0″
>
</el-switch>
</el-tooltip>
<h3>禁用状态</h3>
<el-switch v-model=”value5″ disabled> </el-switch>
</div>
</template>
<script>
export default {
name: “App”,
data() {
return {
value1: true,
value2: true,
value3: true,
value4: true,
value5: true,
};
},
};
</script>
<style lang=”” scoped>
</style>
程序运行,效果如图:
74a17005bf194529bf553caf51800655~noop.image?_iz=58558&from=article.pc_detail&lk3s=953192f4&x-expires=1717747982&x-signature=0i1zqiRk5H%2BJLFuKy2JCLJOZ1Ac%3D
图 14- 42 开关效果图

14.3.8 日期时间选择器

1.TimePicker时间选择器

固定时间点

提供几个固定的时间点供用户选择。使用 el-time-select 标签,分别通过start、end和step指定可选的起始时间、结束时间和步长。
示例代码如下:
<template>
<div id=”app”>
<el-time-select
v-model=”value”
:picker-options=”{
start: ’08:30′,
step: ’00:15′,
end: ’18:30′,
}”
placeholder=”选择时间”
>
</el-time-select>
</div>
</template>
<script>
export default {
name: “App”,
data() {
return {
value: “”,
};
},
};
</script>
程序运行,效果如图:
086a9c4cf1e44c279d5000cc5f900658~noop.image?_iz=58558&from=article.pc_detail&lk3s=953192f4&x-expires=1717747982&x-signature=whsqh8X9VwCLxKddiyexGAvwkTU%3D
图 14- 43 固定时间选择点

任意时间点

可以选择任意时间;使用 el-time-picker 标签,通过selectableRange限制可选时间范围。提供了两种交互方式:默认情况下通过鼠标滚轮进行选择,打开arrow-control属性则通过界面上的箭头进行选择。
示例代码如下:
<template>
<div id=”app”>
<el-time-picker
v-model=”value1″
:picker-options=”{
selectableRange: ’18:30:00 – 20:30:00′,
}”
placeholder=”任意时间点”
>
</el-time-picker>
<el-time-picker
arrow-control
v-model=”value2″
:picker-options=”{
selectableRange: ’18:30:00 – 20:30:00′,
}”
placeholder=”任意时间点”
>
</el-time-picker>
</div>
</template>
<script>
export default {
name: “App”,
data() {
return {
value1: new Date(2016, 9, 10, 18, 40),
value2: new Date(2016, 9, 10, 18, 40),
};
},
};
</script>
程序运行,效果如图:
9a36d66f0d1c4ffd9abbb2c813263935~noop.image?_iz=58558&from=article.pc_detail&lk3s=953192f4&x-expires=1717747982&x-signature=Q3F96L6yWcS1nqZNCpAV4weU3oU%3D
图 14- 44 使用箭头选择效果图

固定时间范围

若先选择开始时间,则结束时间内备选项的状态会随之改变。
示例代码如下:
<template>
<div id=”app”>
<el-time-select
placeholder=”起始时间”
v-model=”startTime”
:picker-options=”{
start: ’08:30′,
step: ’00:15′,
end: ’18:30′,
}”
>
</el-time-select>
<el-time-select
placeholder=”结束时间”
v-model=”endTime”
:picker-options=”{
start: ’08:30′,
step: ’00:15′,
end: ’18:30′,
minTime: startTime,
}”
>
</el-time-select>
</div>
</template>
<script>
export default {
name: “App”,
data() {
return {
startTime: “”,
endTime: “”,
};
},
};
</script>
程序运行,效果如图:
5ed6544dd9d54031b14e006343b31677~noop.image?_iz=58558&from=article.pc_detail&lk3s=953192f4&x-expires=1717747982&x-signature=HuJJ3RRiYK%2F3U0JyEKUauoxXVdA%3D
图 14- 45 固定时间起始范围

任意时间范围

可选择任意的时间范围。添加is-range属性即可选择时间范围,同样支持arrow-control属性。
示例代码如下:
<template>
<div id=”app”>
<el-time-picker
is-range
v-model=”value1″
range-separator=”至”
start-placeholder=”开始时间”
end-placeholder=”结束时间”
placeholder=”选择时间范围”
>
</el-time-picker>
<el-time-picker
is-range
arrow-control
v-model=”value2″
range-separator=”至”
start-placeholder=”开始时间”
end-placeholder=”结束时间”
placeholder=”选择时间范围”
>
</el-time-picker>
</div>
</template>
<script>
export default {
name: “App”,
data() {
return {
value1: [new Date(2016, 9, 10, 8, 40), new Date(2016, 9, 10, 9, 40)],
value2: [new Date(2016, 9, 10, 8, 40), new Date(2016, 9, 10, 9, 40)],
};
},
};
</script>
程序运行,效果如图:
a692a04990ed43769c693ecd30976de0~noop.image?_iz=58558&from=article.pc_detail&lk3s=953192f4&x-expires=1717747982&x-signature=k336P0NkYOjdkZnEgJrLhmUFXmc%3D
图 14- 46 选择任意时间范围

DateTimePicker日期时间选择器

在同一个选择器里选择日期和时间。DateTimePicker 由 DatePicker 和 TimePicker 派生,Picker Options 或者其他选项可以参照 DatePicker 和 TimePicker。

日期和时间点

通过设置type属性为datetime,即可在同一个选择器里同时进行日期和时间的选择。快捷选项通过shortcuts进行设置,默认时间通过default-time属性进行设置。
示例代码:
<template>
<div id=”app”>
<div class=”block”>
<span class=”demonstration”>默认</span>
<el-date-picker
v-model=”value1″
type=”datetime”
placeholder=”选择日期时间”
>
</el-date-picker>
</div>
<div class=”block”>
<span class=”demonstration”>带快捷选项</span>
<el-date-picker
v-model=”value2″
type=”datetime”
placeholder=”选择日期时间”
align=”right”
:picker-options=”pickerOptions”
>
</el-date-picker>
</div>
<div class=”block”>
<span class=”demonstration”>设置默认时间</span>
<el-date-picker
v-model=”value3″
type=”datetime”
placeholder=”选择日期时间”
default-time=”12:00:00″
>
</el-date-picker>
</div>
</div>
</template>
<script>
export default {
name: “App”,
data() {
return {
pickerOptions: {
shortcuts: [
{
text: “今天”,
onClick(picker) {
picker.$emit(“pick”, new Date());
},
},
{
text: “昨天”,
onClick(picker) {
const date = new Date();
date.setTime(date.getTime() – 3600 * 1000 * 24);
picker.$emit(“pick”, date);
},
},
{
text: “一周前”,
onClick(picker) {
const date = new Date();
date.setTime(date.getTime() – 3600 * 1000 * 24 * 7);
picker.$emit(“pick”, date);
},
},
],
},
value1: “”,
value2: “”,
value3: “”,
};
},
};
</script>
<style lang=”” scoped>
.block {
float: left;
}
</style>
程序运行,效果如图:
ab4b51861ab44901bc50d1e1e59f484c~noop.image?_iz=58558&from=article.pc_detail&lk3s=953192f4&x-expires=1717747982&x-signature=jsbyEaSnYiS43cwaO2D9AHdBUhc%3D
设置了快捷时间选择
图 14- 47 设置日期和时间

日期和时间范围

设置type为datetimerange即可选择日期和时间范围。
示例代码:
<template>
<div id=”app”>
<div class=”block”>
<span class=”demonstration”>默认</span>
<el-date-picker
v-model=”value1″
type=”datetime”
placeholder=”选择日期时间”
>
</el-date-picker>
</div>
<div class=”block”>
<span class=”demonstration”>带快捷选项</span>
<el-date-picker
v-model=”value2″
type=”datetime”
placeholder=”选择日期时间”
align=”right”
:picker-options=”pickerOptions”
>
</el-date-picker>
</div>
<div class=”block”>
<span class=”demonstration”>设置默认时间</span>
<el-date-picker
v-model=”value3″
type=”datetime”
placeholder=”选择日期时间”
default-time=”12:00:00″
>
</el-date-picker>
</div>
</div>
</template>
<script>
export default {
name: “App”,
data() {
return {
pickerOptions: {
shortcuts: [
{
text: “今天”,
onClick(picker) {
picker.$emit(“pick”, new Date());
},
},
{
text: “昨天”,
onClick(picker) {
const date = new Date();
date.setTime(date.getTime() – 3600 * 1000 * 24);
picker.$emit(“pick”, date);
},
},
{
text: “一周前”,
onClick(picker) {
const date = new Date();
date.setTime(date.getTime() – 3600 * 1000 * 24 * 7);
picker.$emit(“pick”, date);
},
},
],
},
value1: “”,
value2: “”,
value3: “”,
};
},
};
</script>
<style lang=”” scoped>
.block {
float: left;
}
</style>
程序运行,效果如图:
6bd87f45d87847ffab74ace09ba3ed15~noop.image?_iz=58558&from=article.pc_detail&lk3s=953192f4&x-expires=1717747982&x-signature=lALZBrRIY6cR1qOr6jo4e7OStbk%3D
图 14- 48 设置日期和时间选择范围

默认的起始和结束时刻

使用datetimerange进行范围选择时,在日期选择面板中选定起始与结束的日期,默认会使用该日期的00:00:00作为起始与结束的时刻;通过选项default-time可以控制选中起始与结束日期时所使用的具体时刻。default-time接受一个数组,数组每项值为字符串,形如12:00:00,其中第一项控制起始日期的具体时刻,第二项控制结束日期的具体时刻。
示例代码:
<template>
<div id=”app”>
<div class=”block”>
<span class=”demonstration”>起始日期时刻为 12:00:00</span>
<el-date-picker
v-model=”value1″
type=”datetimerange”
start-placeholder=”开始日期”
end-placeholder=”结束日期”
:default-time=”[’12:00:00′]”
>
</el-date-picker>
</div>
<div class=”block”>
<span class=”demonstration”
>起始日期时刻为 12:00:00,结束日期时刻为 08:00:00</span
>
<el-date-picker
v-model=”value2″
type=”datetimerange”
align=”right”
start-placeholder=”开始日期”
end-placeholder=”结束日期”
:default-time=”[’12:00:00′, ’08:00:00′]”
>
</el-date-picker>
</div>
</div>
</template>
<script>
export default {
name: “App”,
data() {
return {
value1: “”,
value2: “”,
};
},
};
</script>
<style lang=”” scoped>
.block {
float: left;
}
</style>
程序运行,效果如图:
7cd8a8efa24d4c5ca066204f698bd8d9~noop.image?_iz=58558&from=article.pc_detail&lk3s=953192f4&x-expires=1717747982&x-signature=2LcYEn0GESbiE8bdZOMDOJQAl5A%3D
图 14- 49 设置默认的起始时间

14.3.9 Upload上传

1.普通上传

通过 slot 你可以传入自定义的上传按钮类型和文字提示。可通过设置limit和on-exceed来限制上传文件的个数和定义超出限制时的行为。可通过设置before-remove来阻止文件移除操作。
示例代码:
<template>
<div id=”app”>
<el-upload
class=”upload-demo”
action=”https://jsonplaceholder.typicode.com/posts/”
:on-preview=”handlePreview”
:on-remove=”handleRemove”
:before-remove=”beforeRemove”
multiple
:limit=”3″
:on-exceed=”handleExceed”
:file-list=”fileList”
>
<el-button size=”small” type=”primary”>点击上传</el-button>
<div slot=”tip” class=”el-upload__tip”>
只能上传jpg/png文件,且不超过500kb
</div>
</el-upload>
</div>
</template>
<script>
export default {
name: “App”,
data() {
return {
fileList: [
{
name: “food.jpeg”,
url: “https://fuss10.elemecdn.com/3/63/4e7f3a15429bfda99bce42a18cdd1jpeg.jpeg?imageMogr2/thumbnail/360×360/format/webp/quality/100”,
},
{
name: “food2.jpeg”,
url: “https://fuss10.elemecdn.com/3/63/4e7f3a15429bfda99bce42a18cdd1jpeg.jpeg?imageMogr2/thumbnail/360×360/format/webp/quality/100″,
},
],
};
},
methods: {
handleRemove(file, fileList) {
console.log(file, fileList);
},
handlePreview(file) {
console.log(file);
},
handleExceed(files, fileList) {
this.$message.warning(
`当前限制选择 3 个文件,本次选择了 ${files.length} 个文件,共选择了 ${
files.length + fileList.length
} 个文件`
);
},
beforeRemove(file, fileList) {
return this.$confirm(`确定移除 ${file.name}?`);
},
},
};
</script>
<style lang=”” scoped>
</style>
程序运行,效果如图:
06a226b1c1504c2b8ac81606608c3948~noop.image?_iz=58558&from=article.pc_detail&lk3s=953192f4&x-expires=1717747982&x-signature=EwT9BMUMOGAE5ylw%2BaqzpmyJl5k%3D
图 14- 50 上传效果图

文件缩略图

使用 scoped-slot 去设置缩略图模版。
示例代码:
<template>
<div id=”app”>
<el-upload action=”#” list-type=”picture-card” :auto-upload=”false”>
<i slot=”default” class=”el-icon-plus”></i>
<div slot=”file” slot-scope=”{ file }”>
<img class=”el-upload-list__item-thumbnail” :src=”file.url” alt=”” />
<span class=”el-upload-list__item-actions”>
<span
class=”el-upload-list__item-preview”
@click=”handlePictureCardPreview(file)”
>
<i class=”el-icon-zoom-in”></i>
</span>
<span
v-if=”!disabled”
class=”el-upload-list__item-delete”
@click=”handleDownload(file)”
>
<i class=”el-icon-download”></i>
</span>
<span
v-if=”!disabled”
class=”el-upload-list__item-delete”
@click=”handleRemove(file)”
>
<i class=”el-icon-delete”></i>
</span>
</span>
</div>
</el-upload>
<el-dialog :visible.sync=”dialogVisible”>
<img width=”100%” :src=”dialogImageUrl” alt=”” />
</el-dialog>
</div>
</template>
<script>
export default {
name: “App”,
data() {
return {
dialogImageUrl: “”,
dialogVisible: false,
disabled: false,
};
},
methods: {
handleRemove(file) {
console.log(file);
},
handlePictureCardPreview(file) {
this.dialogImageUrl = file.url;
this.dialogVisible = true;
},
handleDownload(file) {
console.log(file);
},
},
};
</script>
<style lang=”” scoped>
</style>
程序运行,效果如图:
f89caebd674c4eb5b67d3f82c99a7dce~noop.image?_iz=58558&from=article.pc_detail&lk3s=953192f4&x-expires=1717747982&x-signature=O7lWZ8axoy4fBw4xztV5WrG869U%3D
图 14- 51 上传缩略图效果

3.总结

参数
说明
类型
可选值
默认值
action
必选参数,上传的地址
string


headers
设置上传的请求头部
object


multiple
是否支持多选文件
boolean


data
上传时附带的额外参数
object


name
上传的文件字段名
string

file
with-credentials
支持发送 cookie 凭证信息
boolean

false
show-file-list
是否显示已上传文件列表
boolean

true
drag
是否启用拖拽上传
boolean

false
accept
接受上传的文件类型(thumbnail-mode 模式下此参数无效)
string


on-preview
点击文件列表中已上传的文件时的钩子
function(file)


on-remove
文件列表移除文件时的钩子
function(file, fileList)


on-success
文件上传成功时的钩子
function(response, file, fileList)


on-error
文件上传失败时的钩子
function(err, file, fileList)


on-progress
文件上传时的钩子
function(event, file, fileList)


on-change
文件状态改变时的钩子,添加文件、上传成功和上传失败时都会被调用
function(file, fileList)


before-upload
上传文件之前的钩子,参数为上传的文件,若返回 false 或者返回 Promise 且被 reject,则停止上传。
function(file)


before-remove
删除文件之前的钩子,参数为上传的文件和文件列表,若返回 false 或者返回 Promise 且被 reject,则停止删除。
function(file, fileList)


list-type
文件列表的类型
string
text/picture/picture-card
text
auto-upload
是否在选取文件后立即进行上传
boolean

true
file-list
上传的文件列表, 例如: [{name: ‘food.jpg’, url: ‘https://xxx.cdn.com/xxx.jpg’}]
array

[]
http-request
覆盖默认的上传行为,可以自定义上传的实现
function


disabled
是否禁用
boolean

false
limit
最大允许上传个数
number


on-exceed
文件超出个数限制时的钩子
function(files, fileList)

14.3.10 Form表单

由输入框、选择器、单选框、多选框等控件组成,用以收集、校验、提交数据。

典型表单

在 Form 组件中,每一个表单域由一个 Form-Item 组件构成,表单域中可以放置各种类型的表单控件,包括 Input、Select、Checkbox、Radio、Switch、DatePicker、TimePicker。
示例代码:
<template>
<div id=”app”>
<el-form ref=”form” :model=”form” label-width=”80px”>
<el-form-item label=”活动名称”>
<el-input v-model=”form.name”></el-input>
</el-form-item>
<el-form-item label=”活动区域”>
<el-select v-model=”form.region” placeholder=”请选择活动区域”>
<el-option label=”区域一” value=”shanghai”></el-option>
<el-option label=”区域二” value=”beijing”></el-option>
</el-select>
</el-form-item>
<el-form-item label=”活动时间”>
<el-col :span=”11″>
<el-date-picker
type=”date”
placeholder=”选择日期”
v-model=”form.date1″
style=”width: 100%”
></el-date-picker>
</el-col>
<el-col class=”line” :span=”2″>-</el-col>
<el-col :span=”11″>
<el-time-picker
placeholder=”选择时间”
v-model=”form.date2″
style=”width: 100%”
></el-time-picker>
</el-col>
</el-form-item>
<el-form-item label=”即时配送”>
<el-switch v-model=”form.delivery”></el-switch>
</el-form-item>
<el-form-item label=”活动性质”>
<el-checkbox-group v-model=”form.type”>
<el-checkbox label=”美食/餐厅线上活动” name=”type”></el-checkbox>
<el-checkbox label=”地推活动” name=”type”></el-checkbox>
<el-checkbox label=”线下主题活动” name=”type”></el-checkbox>
<el-checkbox label=”单纯品牌曝光” name=”type”></el-checkbox>
</el-checkbox-group>
</el-form-item>
<el-form-item label=”特殊资源”>
<el-radio-group v-model=”form.resource”>
<el-radio label=”线上品牌商赞助”></el-radio>
<el-radio label=”线下场地免费”></el-radio>
</el-radio-group>
</el-form-item>
<el-form-item label=”活动形式”>
<el-input type=”textarea” v-model=”form.desc”></el-input>
</el-form-item>
<el-form-item>
<el-button type=”primary” @click=”onSubmit”>立即创建</el-button>
<el-button>取消</el-button>
</el-form-item>
</el-form>
</div>
</template>
<script>
export default {
name: “App”,
data() {
return {
form: {
name: “”,
region: “”,
date1: “”,
date2: “”,
delivery: false,
type: [],
resource: “”,
desc: “”,
},
};
},
methods: {
onSubmit() {
console.log(“submit!”);
},
},
};
</script>
<style lang=”” scoped>
</style>
程序运行,效果如图:
03cfadbf92c54b52b835ab3809b3baae~noop.image?_iz=58558&from=article.pc_detail&lk3s=953192f4&x-expires=1717747982&x-signature=L1VJ1jS3GBCHLKQszMJbzu0f%2F5s%3D
图 14- 52 表单效果图

行内表单

当垂直方向空间受限且表单较简单时,可以在一行内放置表单。设置 inline 属性可以让表单域变为行内的表单域。
示例代码:
<template>
<div id=”app”>
<el-form :inline=”true” :model=”formInline” class=”demo-form-inline”>
<el-form-item label=”审批人”>
<el-input v-model=”formInline.user” placeholder=”审批人”></el-input>
</el-form-item>
<el-form-item label=”活动区域”>
<el-select v-model=”formInline.region” placeholder=”活动区域”>
<el-option label=”区域一” value=”shanghai”></el-option>
<el-option label=”区域二” value=”beijing”></el-option>
</el-select>
</el-form-item>
<el-form-item>
<el-button type=”primary” @click=”onSubmit”>查询</el-button>
</el-form-item>
</el-form>
</div>
</template>
<script>
export default {
name: “App”,
data() {
return {
formInline: {
user: “”,
region: “”,
},
};
},
methods: {
onSubmit() {
console.log(“submit!”);
},
},
};
</script>
<style lang=”” scoped>
</style>
程序运行,效果如图:
2066e1eb5c9e4dfc9ec99ccb9988aa8e~noop.image?_iz=58558&from=article.pc_detail&lk3s=953192f4&x-expires=1717747982&x-signature=QJICIJeIlJnml6V2ohGaEpfXTjQ%3D
图 14- 53 单行表单效果

表单验证

在防止用户犯错的前提下,尽可能让用户更早地发现并纠正错误。Form 组件提供了表单验证的功能,只需要通过 rules 属性传入约定的验证规则,并将 Form-Item 的 prop 属性设置为需校验的字段名即可。校验规则参见 async-validator。
示例代码:
<template>
<div id=”app”>
<el-form
:model=”ruleForm”
:rules=”rules”
ref=”ruleForm”
label-width=”100px”
class=”demo-ruleForm”
>
<el-form-item label=”活动名称” prop=”name”>
<el-input v-model=”ruleForm.name”></el-input>
</el-form-item>
<el-form-item label=”活动区域” prop=”region”>
<el-select v-model=”ruleForm.region” placeholder=”请选择活动区域”>
<el-option label=”区域一” value=”shanghai”></el-option>
<el-option label=”区域二” value=”beijing”></el-option>
</el-select>
</el-form-item>
<el-form-item label=”活动时间” required>
<el-col :span=”11″>
<el-form-item prop=”date1″>
<el-date-picker
type=”date”
placeholder=”选择日期”
v-model=”ruleForm.date1″
style=”width: 100%”
></el-date-picker>
</el-form-item>
</el-col>
<el-col class=”line” :span=”2″>-</el-col>
<el-col :span=”11″>
<el-form-item prop=”date2″>
<el-time-picker
placeholder=”选择时间”
v-model=”ruleForm.date2″
style=”width: 100%”
></el-time-picker>
</el-form-item>
</el-col>
</el-form-item>
<el-form-item label=”即时配送” prop=”delivery”>
<el-switch v-model=”ruleForm.delivery”></el-switch>
</el-form-item>
<el-form-item label=”活动性质” prop=”type”>
<el-checkbox-group v-model=”ruleForm.type”>
<el-checkbox label=”美食/餐厅线上活动” name=”type”></el-checkbox>
<el-checkbox label=”地推活动” name=”type”></el-checkbox>
<el-checkbox label=”线下主题活动” name=”type”></el-checkbox>
<el-checkbox label=”单纯品牌曝光” name=”type”></el-checkbox>
</el-checkbox-group>
</el-form-item>
<el-form-item label=”特殊资源” prop=”resource”>
<el-radio-group v-model=”ruleForm.resource”>
<el-radio label=”线上品牌商赞助”></el-radio>
<el-radio label=”线下场地免费”></el-radio>
</el-radio-group>
</el-form-item>
<el-form-item label=”活动形式” prop=”desc”>
<el-input type=”textarea” v-model=”ruleForm.desc”></el-input>
</el-form-item>
<el-form-item>
<el-button type=”primary” @click=”submitForm(‘ruleForm’)”
>立即创建</el-button
>
<el-button @click=”resetForm(‘ruleForm’)”>重置</el-button>
</el-form-item>
</el-form>
</div>
</template>
<script>
export default {
name: “App”,
data() {
return {
ruleForm: {
name: “”,
region: “”,
date1: “”,
date2: “”,
delivery: false,
type: [],
resource: “”,
desc: “”,
},
rules: {
name: [
{ required: true, message: “请输入活动名称”, trigger: “blur” },
{ min: 3, max: 5, message: “长度在 3 到 5 个字符”, trigger: “blur” },
],
region: [
{ required: true, message: “请选择活动区域”, trigger: “change” },
],
date1: [
{
type: “date”,
required: true,
message: “请选择日期”,
trigger: “change”,
},
],
date2: [
{
type: “date”,
required: true,
message: “请选择时间”,
trigger: “change”,
},
],
type: [
{
type: “array”,
required: true,
message: “请至少选择一个活动性质”,
trigger: “change”,
},
],
resource: [
{ required: true, message: “请选择活动资源”, trigger: “change” },
],
desc: [{ required: true, message: “请填写活动形式”, trigger: “blur” }],
},
};
},
methods: {
submitForm(formName) {
this.$refs[formName].validate((valid) => {
if (valid) {
alert(“submit!”);
} else {
console.log(“error submit!!”);
return false;
}
});
},
resetForm(formName) {
this.$refs[formName].resetFields();
},
},
};
</script>
<style lang=”” scoped>
</style>
程序运行,效果如图:
cc792c41fd754899b22d71be6c8da5c5~noop.image?_iz=58558&from=article.pc_detail&lk3s=953192f4&x-expires=1717747982&x-signature=gTOsxHrOEYJTHkOfr6uh6ObxHV4%3D
图 14- 54 校验效果图

自定义校验规则

这个例子中展示了如何使用自定义验证规则来完成密码的二次验证。
示例代码:
<template>
<div id=”app”>
<el-form
:model=”ruleForm”
status-icon
:rules=”rules”
ref=”ruleForm”
label-width=”100px”
class=”demo-ruleForm”
>
<el-form-item label=”密码” prop=”pass”>
<el-input
type=”password”
v-model=”ruleForm.pass”
autocomplete=”off”
></el-input>
</el-form-item>
<el-form-item label=”确认密码” prop=”checkPass”>
<el-input
type=”password”
v-model=”ruleForm.checkPass”
autocomplete=”off”
></el-input>
</el-form-item>
<el-form-item label=”年龄” prop=”age”>
<el-input v-model.number=”ruleForm.age”></el-input>
</el-form-item>
<el-form-item>
<el-button type=”primary” @click=”submitForm(‘ruleForm’)”
>提交</el-button
>
<el-button @click=”resetForm(‘ruleForm’)”>重置</el-button>
</el-form-item>
</el-form>
</div>
</template>
<script>
export default {
name: “App”,
data() {
var checkAge = (rule, value, callback) => {
if (!value) {
return callback(new Error(“年龄不能为空”));
}
setTimeout(() => {
if (!Number.isInteger(value)) {
callback(new Error(“请输入数字值”));
} else {
if (value < 18) {
callback(new Error(“必须年满18岁”));
} else {
callback();
}
}
}, 1000);
};
var validatePass = (rule, value, callback) => {
if (value === “”) {
callback(new Error(“请输入密码”));
} else {
if (this.ruleForm.checkPass !== “”) {
this.$refs.ruleForm.validateField(“checkPass”);
}
callback();
}
};
var validatePass2 = (rule, value, callback) => {
if (value === “”) {
callback(new Error(“请再次输入密码”));
} else if (value !== this.ruleForm.pass) {
callback(new Error(“两次输入密码不一致!”));
} else {
callback();
}
};
return {
ruleForm: {
pass: “”,
checkPass: “”,
age: “”,
},
rules: {
pass: [{ validator: validatePass, trigger: “blur” }],
checkPass: [{ validator: validatePass2, trigger: “blur” }],
age: [{ validator: checkAge, trigger: “blur” }],
},
};
},
methods: {
submitForm(formName) {
this.$refs[formName].validate((valid) => {
if (valid) {
alert(“submit!”);
} else {
console.log(“error submit!!”);
return false;
}
});
},
resetForm(formName) {
this.$refs[formName].resetFields();
},
},
};
</script>
<style lang=”” scoped>
</style>
程序运行,效果如图:
845593603f7043358486ce95d0c73ca1~noop.image?_iz=58558&from=article.pc_detail&lk3s=953192f4&x-expires=1717747982&x-signature=fFfxaaij5ZU3OwM63IkuAfsF0mg%3D
图 14- 55 自定义校验效果
本例还使用status-icon属性为输入框添加了表示校验结果的反馈图标。自定义校验 callback 必须被调用。

总结

参数
说明
类型
可选值
默认值
model
表单数据对象
object


rules
表单验证规则
object


inline
行内表单模式
boolean

false
label-position
表单域标签的位置,如果值为 left 或者 right 时,则需要设置 label-width
string
right/left/top
right
label-width
表单域标签的宽度,例如 ’50px’。作为 Form 直接子元素的 form-item 会继承该值。支持 auto。
string


label-suffix
表单域标签的后缀
string


hide-required-asterisk
是否隐藏必填字段的标签旁边的红色星号
boolean

false
show-message
是否显示校验错误信息
boolean

true
inline-message
是否以行内形式展示校验信息
boolean

false
status-icon
是否在输入框中显示校验结果反馈图标
boolean

false
validate-on-rule-change
是否在 rules 属性改变后立即触发一次验证
boolean

true
size
用于控制该表单内组件的尺寸
string
medium / small / mini

disabled
是否禁用该表单内的所有组件。若设置为 true,则表单内组件上的 disabled 属性不再生效
boolean

false

14.4 本章小结

在main.js中,引入Element-UI的样式和Element-UI即可使用Element-UI。会使用el-row,以及el-col进行基础的布局,灵活使用span,offset,gutter等属性灵活调整。掌握Container常用的标签:el-container,el-header,el-aside,el-main,el-footer。掌握按钮常用的使用,会调整按钮的尺寸以及大小,会使用按钮组。掌握常用的文字链接属性。Form表单是我们在实践项目中经常使用的,灵活掌握各个表单元素。

14.5 理论试题与实践练习

1.编程题

1.1 使用element-ui写一个常用网页布局。
1.2 使用本章所有的表单元素写一个Form表单进行提交。

原创文章,作者:小条,如若转载,请注明出处:https://www.sudun.com/ask/82567.html

Like (0)
小条的头像小条
Previous 2024年5月31日 下午4:12
Next 2024年5月31日 下午4:14

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注