前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >浅学前端:Vue篇(二)

浅学前端:Vue篇(二)

原创
作者头像
传说之下的花儿
发布于 2023-11-12 09:31:45
发布于 2023-11-12 09:31:45
27600
代码可运行
举报
运行总次数:0
代码可运行

2. Vue 进阶

1) ElementUI

ElementUI是基于vue的一套组件库,前面讲述了如何自己去创建组件,但是自己创建组件成本太高了,所以我们一般都是采用一些第三方的比较成熟的组件库,ElementUI就是其中一中,使用之后可以大大减少我们的开发成本。

安装

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 npm install element-ui -S

引入组件

引入的方式有很多种,这里就介绍个最简单的,引入所有的组件

放在main.js中

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 import Element from 'element-ui' // 导入ElementUI组件
 import 'element-ui/lib/theme-chalk/index.css' // 导入他的一些样式// 之前我们自己使用组件的时候,我们是给options对象里的components去加组件
 // 但是ElementUI里的组件太多了,个数大于有几十种,如果一个个去加,太麻烦了,
 // 所以使用了另外一个手段vue的use方法,将Element对象传入,就会把所有Element的组件加入到内部去,以后在页面里就可以直接使用相关标签了
 Vue.use(Element)

测试,在自己的组件中使用 ElementUI 的组 件

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 <!-- ElementUI测试 -->
 <template>
     <div>
         <el-button>点我</el-button>
     </div>
 </template>
 <script>
     export default {}
 </script>

使用:

ElementUI用啥找啥就行,参考官网的例子。

1. 表格组件

具体属性见:https://element.eleme.cn/#/zh-CN/component/table

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 <template>
     <div>
         <!-- data属性:关联表格需要展示的数据 -->
         <el-table v-bind:data="students">
             <!-- lable属性:这个列的标题 -->
             <!-- prop属性:表格内部会遍历这个学生数组,那么学生对象的哪个属性需要显示在这一列上就使用到了prop -->
             <el-table-column label="编号" prop="ID"></el-table-column>
             <el-table-column label="姓名" prop="Name"></el-table-column>
             <el-table-column label="性别" prop="Sex"></el-table-column>
             <el-table-column label="年龄" prop="Age"></el-table-column>
         </el-table>
     </div>
 </template>
 <script>
 import axios from 'axios';
 export default {
     data: function () {
         return {
             "students": []
         };
     },
     mounted: async function () {
         const resp = await axios.get("/api/students")
         this.students = resp.data.data
     }
 };
 </script>

2. 分页组件

具体使用见:https://element.eleme.cn/#/zh-CN/component/pagination

分页常用的属性:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 <template>
     <div>
         <!-- 分页常用属性:
             total属性:总条目数 
             page-size:每页显示条目个数,默认10条
             current-page:当前页数
             layout:控制分页条外观,
                 分页条可以看成由多个小的部分组成的
                 (比如:向上翻,向下翻,页码,跳转到第几页的数框,总记录数...)
                 这个layout就可以控制这些部分哪些显示,哪些不显示
                 默认是'prev, pager, next, jumper, ->, total'都显示
                 可选参数:sizes, prev, pager, next, jumper, ->, total, slot
             page-sizes:每页显示个数选择器的选项设置,默认:[10, 20, 30, 40, 50, 100]
         -->
         <el-pagination v-bind:total="50" v-bind:page-size="5" layout="prev, pager, next, sizes, ->, total"></el-pagination>
     </div>
 </template>
 <script>
 export default {};
 </script>

有人可能会好奇为什么有的属性加了v-bind,有的没有呢? 加了v-bind,就代表他的值来自于JavaScript,如果在option的data()返回的对象里找不到对应的绑定属性,就会将右侧当成表达式进行解析; 没有加:的,等号右边的值就是他的最终结果。 例子: :page-sizes="[5,10,15,20]"如果加了:会正常解析成数组,但是如果没加:,就会当做字符串,而不是解析成数组。

分页常用的事件:

示例:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 <template>
     <div>
         <!-- data属性:关联表格需要展示的数据 -->
         <el-table v-bind:data="students">
             <!-- lable属性:这个列的标题 -->
             <!-- prop属性:表格内部会遍历这个学生数组,那么学生对象的哪个属性需要显示在这一列上就使用到了prop -->
             <el-table-column label="编号" prop="ID"></el-table-column>
             <el-table-column label="姓名" prop="Name"></el-table-column>
             <el-table-column label="性别" prop="Sex"></el-table-column>
             <el-table-column label="年龄" prop="Age"></el-table-column>
         </el-table>
         <!-- 分页常用事件:
             事件名称                说明              回调参数
             current-change  currentPage 改变时会触发     当前页
             size-change     pageSize 改变时会触发     每页条数
         -->
         <el-pagination 
                        v-bind:total="total" 
                        v-bind:page-size="queryPage.pageSize"
                        v-bind:current-page="queryPage.currentPage" 
                        v-on:current-change="currentChange"
                        v-on:size-change="sizeChange" 
                        v-bind:page-sizes="[2,3,5,7]"
             layout='prev, pager, next, sizes,jumper, ->, total'>
         </el-pagination>
     </div>
 </template>
 <script>
 import axios from 'axios';
 export default {
     data: function () {
         return {
             total: 0,
             students: [],
             queryPage: {
                 pageSize: 5, // 页大小
                 currentPage: 1, // 页码
             },
         };
     },
     methods: {
         currentChange(page) {
             this.queryPage.currentPage = page;
             this.queryStudents()
         },
         sizeChange(size) {
             this.queryPage.pageSize = size;
             this.queryStudents()
         },
         async queryStudents() {
             const resp = await axios.get("/api/students", {
                 params: this.queryPage,
             })
             this.students = resp.data.data.students;
             this.total = resp.data.data.total;
         },
     },
     mounted: function () {
         this.queryStudents()
     }
 };
 </script>
  • 三种情况都应该触发查询
    • mounted 组件挂载完成后
    • 页号变化时
    • 页大小变化时
  • 查询传参应该根据后台需求,灵活采用不同方式
    • 本例中因为是 get 请求,无法采用请求体,只能用 params 方式传参
  • 返回响应的格式也许会很复杂,需要掌握【根据返回的响应结构,获取数据】的能力
3. 分页搜索
  1. 按姓名模糊搜索
  2. 按性别精确搜索
  3. 按年龄范围查询
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 <template>
     <div>
         <!-- 输入框 -->
         <el-input placeholder="请输入姓名" v-model="queryDto.name"></el-input>
         <!-- 下拉列表 -->
         <el-select placeholder="请选择性别" v-model="queryDto.sex" clearable>
             <el-option value="男"></el-option>
             <el-option value="女"></el-option>
         </el-select>
         <!-- 下拉列表 -->
         <!-- label:展示给用户看的样子 -->
         <el-select placeholder="请选择年龄" v-model="queryDto.age" clearable>
             <el-option value="0,18" label="0到18岁"></el-option>
             <el-option value="19,30" label="19到30岁"></el-option>
             <el-option value="31,40" label="31到40岁"></el-option>
             <el-option value="41,120" label="41到120岁"></el-option>
         </el-select><el-button type="primary" v-on:click="search()">搜索</el-button><el-table v-bind:data="students">
             <el-table-column label="编号" prop="ID"></el-table-column>
             <el-table-column label="姓名" prop="Name"></el-table-column>
             <el-table-column label="性别" prop="Sex"></el-table-column>
             <el-table-column label="年龄" prop="Age"></el-table-column>
         </el-table>
         <el-pagination v-bind:total="total" v-bind:page-size="queryDto.pageSize"
             v-bind:current-page="queryDto.currentPage" v-on:current-change="currentChange" v-on:size-change="sizeChange"
             v-bind:page-sizes="[2,3,5,7]" layout='prev, pager, next, sizes,jumper, ->, total'>
         </el-pagination>
     </div>
 </template>
 <script>
 import axios from 'axios';
 export default {
     data: function () {
         return {
             total: 0,
             students: [],
             queryDto: {
                 pageSize: 5, // 页大小
                 currentPage: 1, // 页码
                 name: '',
                 sex: '',
                 age: ''
             },
         };
     },
     methods: {
         currentChange(page) {
             this.queryDto.currentPage = page;
             this.queryStudents()
         },
         sizeChange(size) {
             this.queryDto.pageSize = size;
             this.queryStudents()
         },
         async queryStudents() {
             const resp = await axios.get("/api/students", {
                 params: this.queryDto,
             })
             this.students = resp.data.data.students;
             this.total = resp.data.data.total;
         },
         search() {
             this.queryStudents()
         }
     },
     mounted: function () {
         this.queryStudents()
     },
 };
 </script>
4. Cascader 级联选择器

级联选择器中选项的数据结构为:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 <!-- 多级菜单 -->
 <template>
     <div>
         <el-cascader v-bind:options="ops"></el-cascader>
     </div>
 </template>
 <script>
     export default {
         data:function(){
             return {
                 // 多级菜单的数据
                 ops:[
                     {value:100,label:'主页',children:[
                         {value:101,label:'菜单1',children:[
                             {value:105,label:'子项1'},
                             {value:106,label:'子项2'},
                         ]},
                         { value: 102, label: '菜单2', children: [
                             {value:107,label:'子项3'},
                             {value:108,label:'子项4'},
                             {value:109,label:'子项5'},
                         ]},
                         { value: 103, label: '菜单3', children: [
                             {value:110,label:'子项6'},
                             {value:111,label:'子项7'},
                         ] },
                         {value:104,label:'菜单4'},
                     ]}
                 ],
             };
         },
     };
 </script>

上面将选项数据写死在了javaScipt里,更合理的做法应该来自后端服务器

数据准备:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 CREATE TABLE `menu`(
     id INT,
     name VARCHAR(10),
     icon VARCHAR(30),
     path VARCHAR(30),
     pid INT,
     PRIMARY KEY (id)
 ) COMMENT '菜单表';INSERT INTO menu (id, name, icon, path, pid) values
     (100,'主页','el-icon-menu','/',0),
         (101,'菜单1','el-icon-menu','/menu1',100),
             (105,'子项1','el-icon-menu','/menu1/c1',101),
             (106,'子项2','el-icon-menu','/menu1/c2',101),
         (102,'菜单2','el-icon-menu','/menu2',100),
             (107,'子项3','el-icon-menu','/menu2/c3',102),
             (108,'子项4','el-icon-menu','/menu2/c4',102),
             (109,'子项5','el-icon-menu','/menu2/c5',102),
         (103,'菜单3','el-icon-menu','/menu3',100),
             (110,'子项6','el-icon-menu','/menu3/c6',103),
             (111,'子项7','el-icon-menu','/menu3/c7',103),
         (104,'菜单4','el-icon-menu','/menu4',100);

后端代码自己写,表里的数据是一维的,没有层级关系的,后端的人可以直接返给你有层级的关系的数据,但是如果他们不想写,而是给你返回一维的这种数组,那么前端就需要自己将这个一维的数组转换成这种树状的数据(这也是个基本功)。

下面的例子是将后端返回的一维数组【树化】

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 <!-- 多级菜单 -->
 <template>
     <div>
         <el-cascader v-bind:options="ops"></el-cascader>
     </div>
 </template>
 <script>
 import axios from 'axios';
 export default {
     data: function () {
         return {
             // 多级菜单的数据
             // cascade级联选择器只需要最顶层的对象,就会从children里遍历子对象(所有只需要将最顶层的对象给他就行)。
             ops: [],
         };
     },
     mounted: async function () {
         const resp = await axios.get("/api/menu");
         const menus = resp.data.data;
         // 1. 将所有数据存入map集合(为了接下来查找效率)
         const map = new Map(); // set get
         for (const { Id, Name, Pid } of menus) {
             map.set(Id, { value: Id, label: Name, pid: Pid });
         }// 2. 建立父子关系
         const top = [];
         for (const obj of map.values()) {
             if (obj.pid !== 0) {
                 const parent = map.get(obj.pid)
                 // 如果父节点还没定义子数组,就创建一个空的数组
                 if (parent.children === undefined) {
                     parent.children = [];
                 }
                 parent.children.push(obj);
             } else {
                 // 3. 找到顶层对象,本例中顶层对象只有一个,但是实际上可能不止,所以使用数组
                 // cascade级联选择器只需要最顶层的对象,就会从children里遍历子对象(所有只需要将最顶层的对象给他就行)。
                 // 这个时候的top顶层对象是与所有子对象建立完联系了的
                 top.push(obj);
             }
         }
         this.ops = top;
     },
 };
 </script>

我正在参与2023腾讯技术创作特训营第三期有奖征文,组队打卡瓜分大奖!

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
【linux学习指南】linux捕捉信号
如果信号的处理动作是⽤⼾⾃定义函数,在信号递达时就调⽤这个函数,这称为捕捉信号。 由于信号处理函数的代码是在⽤⼾空间的,处理过程⽐较复杂,举例如下:
学习起来吧
2024/12/01
1200
【linux学习指南】linux捕捉信号
Linux 内核0.11 系统调用详解(上)
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u014688145/article/details/50608829
用户1147447
2019/05/26
1.8K0
linux0.11中断处理源码初探
所以idt的内容是一个单位是8字节,长度是256的数组。linux0.11分为中断、系统、陷阱门。系统在启动的时候设置idt。
theanarkh
2019/04/23
1.8K0
深入分析Linux内核源代码阅读笔记 第三章
中断控制是计算机发展中一种重要的技术,最初它是为克服对 I/O 接口控制采用程序查询所带来的处理器低效率而产生的。
云微
2023/02/11
1.4K0
java开发系统内核:使用LDT保护进程数据和代码
上一节,我们开发了一个流氓程序,当他运行起来后,能够把自己的数据写入到另一个进程的数据内存中。之所以产生这样的漏洞,是因为被入侵进程的数据段所对应的全局描述符在全局描述符表中。恶意程序通过在全局描述符表中查找,当找到目标程序的内存描述符后,将对应的描述符加载到自己的ds寄存器里,于是恶意程序访问内存时,就相当于读写目标程序的内存。 要防范此类入侵,最好的办法是让恶意程序无法读取自己内存段对应的描述符,但是如果不把自己的内存描述符放置在全局描述符表中的话,还能放哪里呢?Intel X86架构还给我们提供了另一
望月从良
2018/07/19
8110
Linux中断 - IDT
中断描述符表简单来说说是定义了发生中断/异常时,CPU按这张表中定义的行为来处理对应的中断/异常。
扫帚的影子
2020/02/18
6.9K0
Linux中断 - IDT
文件系统杂谈
文件系统中重要的概念有大概有超级块、inode、file、文件描述符、文件缓存系统、目录。下面我们逐个说一下。
theanarkh
2020/02/25
1.6K0
文件系统杂谈
linux系统的进程管理
本文讲解系统的进程管理相关内容,系统的进程管理是有关系统的所有进程的调度、排序、分配资源、创建、销毁等,是比较重要的内容。
Gnep@97
2024/03/07
2290
linux系统的进程管理
ucoreOS_lab1 实验报告
进入 /home/moocos/ucore_lab/labcodes_answer/lab1_result 目录下
Angel_Kitty
2019/07/15
1.7K0
ucoreOS_lab1 实验报告
java开发操作系统:一个程序向另一个程序伸出的咸猪手
安全,是一个操作系统必须具备的根本特性。我们的系统发展到现在,安全性能上当然不可能与专业系统同日而语,但该做到的,系统内核都应该努力完善。前几期课程,我们给系统内核增加了中断处理,于是当应用程序妄图执行特权指令,想要染指内核运行时,中断会把程序强行切断,内核从中断中重新获得CPU的执行权限。 虽说恶意用户程序难以攻击内核,但是系统当前还存在一个漏洞,使得恶意程序能取攻击另一个程序,我们看看这个问题到底是怎么实现的。我们先在内核C语言部分做简单修改,把原来的cmd_hlt函数改为cmd_execute_pro
望月从良
2018/07/19
5700
linux系统调用之read源码解析(基于linux0.11)
进程通过系统调用,从而进入中断处理,中断处理从系统调用表里找到sys_read函数执行。
theanarkh
2019/05/14
2.9K0
Linux中断一网打尽(1) —— 中断及其初始化
既然叫中断, 那我们首先就会想到这个中断是中断谁?想一想计算机最核心的部分是什么?没错, CPU, 计算机上绝大部分的计算都在CPU中完成,因此这个中断也就是中断CPU当前的运行,让CPU转而先处理这个引起中断的事件,通常来说这个中断的事件比较紧急,处理完毕后再继续执行之前被中断的task。比如,我们敲击键盘,CPU就必须立即响应这个操作,不然我们打字就全变成了慢动作~。说白了中断其实就是一种主动通知机制,如果中断源不主动通知,那想知道其发生了什么事情,只能一次次地轮询了,白白耗费CPU。
扫帚的影子
2020/02/25
1.7K0
Linux中断一网打尽(1) —— 中断及其初始化
java开发操作系统:同时运行多窗口多任务
在系统有了命令行窗口后,我们可以直接在窗口内输入命令,启动应用程序。当通过命令行加载运行用户开发的程序时,命令行会被‘冷冻’,这是因为被启动的程序与命令行属于同一进程,CPU要把运行的权限交给应用程序,命令行窗口得不到运行的机会,因此看上去像死机一样。 这造成的一个问题是,命令行窗口一次只能加载一个应用程序,然后必须等到程序运行结束后,CPU控制权交还给命令行窗口时,它才有机会启动另一个应用程序。我们可以把命令行窗口的程序启动机制进行修改,使得应用程序运行后,控制台仍然能获取CPU的执行权限,但这么改动难度
望月从良
2018/07/19
9840
《一个操作系统的实现》笔记(6)--进程
---- 我们可以把一个单独的任务所用到的所有东西封装在一个LDT中,这种思想是多任务处理的雏形。 多任务所用的段类型如下图,使用LDT来隔离每个应用程序任务的方法,正是关键保护需求之一:
felix
2018/07/02
1K0
《一个操作系统的实现》笔记(5)--内核雏形
---- 我们希望自己的操作系统内核至少应该在Linux下用GCC编译链接。 Loader要做的事有两件:加载内核入内存、跳入保护模式。 ---- 在Linux下用汇编写程序 示例: ;hello.asm [section .data] ; 数据在此 strHello db "Hello, world!", 0Ah STRLEN equ $ - strHello [section .text] ; 代码在此 global _start ; 我们必须导出 _start 这个入口
felix
2018/06/08
1.2K0
linux0.11系统调用过程和fork源码解析
所以执行fork函数就会执行system_call函数,但是在这之前,还有些事情需要做,就是保存现场。下面是操作系统执行系统调用前,在内核栈里保存的寄存器,这个压入的寄存器和iret中断返回指令出栈的寄存器是对应的。其中ip指向的是调用系统调用返回后的下一句代码。
theanarkh
2019/04/24
1.5K0
linux0.11系统调用过程和fork源码解析
操作系统CPU调度策略---07
当进程1执行陷入阻塞时,需要进行进程调度,此时有进程2和进程3都处于就绪态,问: 应该选择哪个进程进行切换?
大忽悠爱学习
2022/08/23
8310
操作系统CPU调度策略---07
【linux学习指南】linux捕捉信号(二)软中断&&缺⻚中断?等&& 如何理解内核态和⽤⼾态
如果是这样,操作系统不就可以躺平了吗?对,操作系统⾃⼰不做任何事情,需要什么功能,就向中 断向量表⾥⾯添加⽅法即可.操作系统的本质:就是⼀个死循环!
学习起来吧
2024/12/30
1380
【linux学习指南】linux捕捉信号(二)软中断&&缺⻚中断?等&& 如何理解内核态和⽤⼾态
MIT 6.828 操作系统工程 lab4A:多处理器支持和协作多任务
这里是我实现的完整代码仓库,也包含其他笔记等等:https://github.com/yunwei37/6.828-2018-labs
云微
2023/02/24
4570
MIT 6.828 操作系统工程 lab3A:用户环境和异常处理
这里是我实现的完整代码仓库,也包含其他笔记等等:https://github.com/yunwei37/6.828-2018-labs
云微
2023/02/24
7000
推荐阅读
相关推荐
【linux学习指南】linux捕捉信号
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档