Vue.js自定义指令及用Vue实现简单的学生信息管理系统

news2024/9/22 11:26:28

目录

一、自定义指令v-mycolor

 自定义指令生命周期:

二、使用钩子函数的自定义指令

三、Vue实现简单的学生信息管理系统


        除了核心功能默认内置的指令,Vue.js允许注册自定义指令。添加一个自定义指令,有两种方式:

(1)通过Vue.directive()函数注册一个全局的指令

(2)通过组件directives属性,对该组件添加一个局部的指令

一、自定义指令v-mycolor

示例:

    <div id="root">
        <div v-mycolor="color" id="demo">
            {{hello}}
        </div>
    </div>
    <script>
        Vue.config.productionTip = false;
        Vue.directive('mycolor', function(el, binding, vnode) {
                el.style = 'color:' + binding.value;
        });
        const vm = new Vue({
            el: '#root',
            data: {
                hello:"你好",
                color:'red'
            },
            methods: {

            }
        })
    </script>

执行结果:

通过以上示例,可以看到网页上的"你好"是红色,说明自定义指令起到了作用。

在自定义指令中,可以传递是三个参数:

el:指令所绑定的元素,可以用来直接操作DOM。

binding:一个对象,包含指令的很多信息。

vnode:Vue.js编译生成的虚拟节点。

 自定义指令生命周期:

(1)bind:只调用一次,指令第一次绑定到元素时调用,用这个钩子函数可以定义一个绑定时执行一次的初始化动作

(2)nserted:被绑定元素插入父节点时调用(父节点存在即可调用,不必存在与document中)。

(3)update:被绑定于元素所在的模板更新时调用,而无论绑定至是否变化。通过比较更新前后的绑定值,可以忽略不必要的模板更新。

(4)componentUpdated:被绑定元素所在模板完成一次更新周期时调用。

(5)unbind:只调用一次,指令与元素解绑时调用

二、使用钩子函数的自定义指令

钩子函数的参数如下所示:

el:与上面介绍的一样,el是指令所绑定的元素,可以用来直接操作DOM;

示例:

    <div id="root">
        <div v-mycolor="color" id="demo">
            {{num}}
        </div>
        <div>
            <button @click="add">Add</button>
        </div>
    </div>
    <script>
        Vue.config.productionTip = false;
        Vue.directive('mycolor',{
            bind:function(){
                console.log('1-绑定时调用bind');
            },
            inserted:function(el,binding,vnode){
                alert('绑定到节点时调用inserted');
                console.log('2-绑定到节点时调用inserted');
                el.style='color:'+binding.value;
            },
            update:function(el,binding,vnode){
                alert('3-组件更新时调用update');
                console.log('3-组件更新时调用update');
                el.style='color:green';
            },
            componentUpdated:function(){
                console.log('4-组件更新完成时调用componentUpdated');
            }
        })
        const vm = new Vue({
            el: '#root',
            data: {
                num:10,
                color:'red'
            },
            methods: {
                add:function(){
                    this.num++;
                }
            }
        })
    </script>

执行结果:

运行后,浏览器会弹出"绑定到节点时调用inserted",这时文字的颜色会变成红色,且浏览器的控制中输出:

当点击"Add"按钮时,浏览器会弹出"3-组件更新时调用update",这时文字会由"10"变成11,字体颜色会变成绿色:

 

三、Vue实现简单的学生信息管理系统

实现学生信息的增删改查和分页功能,及按照学生年龄进行降序排序,升序排序和原顺序

全部源代码:

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <script src="../../vue-2.7.14.js"></script>
    <style>
        * {
            margin: 0px;
            padding: 0px;
        }

        #root {
            margin: 0px auto;
            width: 900px;
            height: auto;
            background-color: orange;
        }

        div {
            margin: 0px auto;
            border: 2px solid black;
            width: 98%;
            text-align: center;
            padding-top: 10px;
            padding-bottom: 10px;
        }

        table {
            width: 98%;
            margin: 1px auto;
            border: 2px solid black;
            border-collapse: collapse;
        }

        th,
        td {
            border: 2px solid black;
            padding: 5px;
        }

        label {
            margin-left: 10px;
        }

        input {
            height: 30px;
        }

        button {
            width: 100px;
            height: 30px;
        }

        span {
            margin-left: 50px;
            margin-right: 50px;
        }
    </style>
</head>

<body>
    <div id="root">
        <div>
            <h2>学生信息管理系统</h2>
            <div>
                <h2>添加信息</h2><br>
                <div>
                    <input type="text" placeholder="请输入学号" v-model="id">
                    <input type="text" placeholder="请输入姓名" v-model="name">
                    <input type="text" placeholder="请输入性别" v-model="sex">
                    <input type="text" placeholder="请输入年龄" v-model="age">
                    <button v-on:click="add">提交</button>
                </div><br>
                <div>
                    <h2>查询信息</h2><br>
                    <input type="text" placeholder="请输入要查询的姓名" v-model.lazy="keyword">
                    <button @click="search()">查询</button>
                </div>
            </div><br>
            <div>
                <table>
                    <tr>
                        <th>序号</th>
                        <th>学号</th>
                        <th>姓名</th>
                        <th>性别</th>
                        <th>年龄</th>
                        <th>创建时间</th>
                        <th>操作</th>
                    </tr>
                    <tr v-for="(student,index) in dataShow" :key="student.id">
                        <td>{{index+1}}</td>
                        <td>{{student.id}}</td>
                        <td>{{student.name}}</td>
                        <td>{{student.sex}}</td>
                        <td>{{student.age}}</td>
                        <td>{{student.ctime | newTime}}</td>
                        <td>
                            <button @click.prevent='toEdit(student.id)'>修改</button>
                            <button @click.prevent="del(index)">删除</button>
                        </td>
                    </tr>
                    <tr>
                        <td align="right" colspan="7">共计&nbsp;&nbsp;{{count}}&nbsp;&nbsp;人</td>
                    </tr>
                </table>
            </div><br>
            <div>
                <select v-model="pageSize" v-on:change="changePageSize">
                    <option value="5">5页</option>
                    <option value="10">10页</option>
                    <option value="15">15页</option>
                    <option value="20">20页</option>
                </select>
                <button v-on:click="firstPage" :disabled="currentPage === 1">首页</button>
                <button v-on:click="previousPage" :disabled="currentPage === 1">上一页</button>
                <button v-on:click="nextPage" :disabled="currentPage === totalPages">下一页</button>
                <button v-on:click="lastPage" :disabled="currentPage === totalPages">尾页</button>
                <span>当前是第{{ currentPage }}页 / 总共{{ totalPages }}页</span>
            </div>
            <br>
            <div v-show="flag">
                <h2>修改信息</h2>
                <br><br>
                <label>学号:<input type="text" placeholder="请输入学号" v-model="id2"></label>
                <label>姓名:<input type="text" placeholder="请输入姓名" v-model="name2"></label>
                <br><br>
                <label>性别:<input type="text" placeholder="请输入性别" v-model="sex2"></label>
                <label>年龄:<input type="text" placeholder="请输入年龄" v-model="age2"></label>
                <br><br>
                <button @click="add2(editIndex)">保存</button>
            </div>
            <div>
                <span><button style="width: 150px;" v-on:click="sortType=2">按年龄升序</button></span>
                <span><button style="width: 150px;" v-on:click="sortType=1">按年龄降序</button></span>
                <span><button style="width: 150px;" v-on:click="sortType=0">原顺序</button></span>
            </div>
        </div>
    </div>
    <script>
        Vue.config.productionTip = false;
        Vue.filter("newTime", (value) => {
            year = value.getFullYear();
            month = value.getMonth() + 1;
            day = value.getDate();
            return `${year}年${month}月${day}日`;
            // return year + "年" + month + "月" + day + "日"
        })
        const vm = new Vue({
            el: '#root',
            data: {
                flag: false,//true表示修改窗口展开,false表示窗口关闭
                id: "",
                name: "",
                sex: "",
                age: "",

                id2: "",
                name2: "",
                sex2: "",
                age2: "",

                keyword: "",
                time: "",

                sortType: 0,//0表示原顺序,1表示降序,2表示升序
                editIndex: null, // 保存正在编辑的对象的索引,初始值不能为0及0以上的数

                students: [
                    { id: "00001", name: "张三", sex: "男", age: 20, ctime: new Date() },
                    { id: "00002", name: "李四", sex: "女", age: 19, ctime: new Date() },
                    { id: "00003", name: "王五", sex: "男", age: 18, ctime: new Date() },
                    { id: "00004", name: "赵六", sex: "男", age: 19, ctime: new Date() },
                    { id: "00005", name: "李力", sex: "男", age: 21, ctime: new Date() },
                    { id: "00006", name: "二狗", sex: "男", age: 17, ctime: new Date() },
                    { id: "00007", name: "狗蛋", sex: "女", age: 20, ctime: new Date() },
                    { id: "00008", name: "三炮", sex: "男", age: 19, ctime: new Date() },
                    { id: "00009", name: "刘仁", sex: "女", age: 19, ctime: new Date() },
                    { id: "00010", name: "四儿", sex: "男", age: 22, ctime: new Date() }
                ],
                newStudents: [],
                currentPage: 1,//当前页数,默认为1
                pageSize: 5,//每页显示数量
            },
            computed: {
                //计算有几组学生信息
                count() {
                    return this.fillPersons.length;
                },
                dataShow() {
                    let start = (this.currentPage - 1) * this.pageSize;
                    let end = Math.min((this.currentPage) * this.pageSize, this.count);
                    return this.fillPersons.slice(start, end);
                },
                //计算总页数
                totalPages() {
                    return Math.ceil(this.count / this.pageSize) || 1;
                },
                //对学生信息进行排序
                fillPersons() {
                    // 找到第一个满足条件的元素就终止过滤操作
                    const arr = this.students.filter((p) => {
                        return p.name.indexOf(this.keyword) !== -1;
                    });
                    //对学生信息进行升序降序和原顺序排序
                    if (this.sortType) {
                        arr.sort((p1, p2) => {
                            return this.sortType === 1 ? p2.age - p1.age : p1.age - p2.age;
                        });
                    }
                    return arr;
                }

            },
            methods: {
                //更改每页显示的记录数时更新当前页码,以确保在更改每页记录数后,
                // 用户仍然可以看到正确的记录列表。
                changePageSize() {
                    this.currentPage = 1;
                },
                //首页
                firstPage() {
                    this.currentPage = 1;
                },
                //上一页
                previousPage() {
                    this.currentPage -= 1;
                },
                //下一页
                nextPage() {
                    this.currentPage += 1;
                },
                //尾页
                lastPage() {
                    this.currentPage = this.totalPages;
                },
                //添加操作
                add() {
                    //添加进对应的学生信息
                    this.students.push({
                        id: this.id,
                        name: this.name,
                        sex: this.sex,
                        age: this.age,
                        ctime: new Date()
                    });
                    //重新赋空值
                    this.id = "",
                        this.name = "",
                        this.sex = "",
                        this.age = ""
                },
                //删除操作
                del(index) {
                    //根据下标删除对应的学生信息
                    this.students.splice(index, 1);
                },
                //查询操作
                search() {
                    //判断是否输入查询内容
                    if (this.keyword) {
                        // this.students = this.newStudents;
                        //找到满足条件的元素并赋值
                        var list = this.students.filter(item => item.name.indexOf(this.keyword) > -1);
                        if (list.length != 0) {
                            alert("查询成功");
                            this.students = list;
                        } else {
                            alert("查询失败");
                            this.students = [];
                        }
                        this.keyword = ''
                    } else {
                        alert("请输入要查找的姓名");
                    }
                },
                // 修改操作
                toEdit(id) {
                    //定位索引 
                    this.editIndex = id;
                    // flag 调成 true,调出修改操作窗口
                    this.flag = true;
                    // filter 操作:找到第一个满足条件的元素就终止过滤操作
                    let student = this.students.filter(stu => {
                        // 注意:此时的返回值 student 是一个对象
                        return stu.id == id;
                    });

                    // 此时在文本框中显示的是:已经选中的学生信息
                    this.id2 = student[0].id;
                    this.name2 = student[0].name;
                    this.sex2 = student[0].sex;
                    this.age2 = student[0].age;
                },
                // 修改保存操作
                add2(editIndex) {
                    // flag 调成 false,就表示是关闭修改操作窗口
                    this.flag = false;

                    //查找需要修改的的下标
                    var index = this.students.findIndex((item) => {
                        if (item.id == this.editIndex) {
                            return true;
                        }
                    })
                    //删除对应下标的学生信息
                    this.students.splice(index, 1);

                    // //把最最新的学生信息重新添加
                    this.students.push({
                        id: this.id2,
                        name: this.name2,
                        sex: this.sex2,
                        age: this.age2,
                        ctime: new Date()
                    });

                    // //重新赋空值
                    this.id2 = "",
                        this.name2 = "",
                        this.sex2 = "",
                        this.age2 = ""
                },
            }
        })
    </script>
</body>

</html>

执行结果:

上图只展示了主界面,其他功能请自行复制粘贴到vscode中执行修改!

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Redis 常见命令

一、redis中的常见数据结构 Redis共有5种常见数据结构&#xff0c;分别字符串&#xff08;STRING)、列表&#xff08;LIST&#xff09;、集合&#xff08;SET)、散列&#xff08;HASH&#xff09;、有序集合&#xff08;ZSET)。 二、redis中字符串(String)介绍 String 类型是…

PS网页版设计工具有哪些?

Photoshop是平面设计领域的老熟人&#xff0c;也是许多设计师的启蒙设计软件。然而&#xff0c;Photoshop的功能繁多&#xff0c;需要设计师具备较强的软件操作能力。在我们以为会和Photoshop一直相爱相杀的时候&#xff0c;一款专注于用户界面的矢量设计软件——即时设计&…

荔枝派Zero(全志V3S)驱动开发之RGB LCD屏幕显示jpg图片

文章目录 前言一、jpeglib 库移植1、jpeglib 库下载2、安装 jpeglib 库 二、jpeg 图片解压缩过程和压缩过程1、jpeg 解压缩过程2、jpeg 压缩过程 三、编译 C 源码1、源码展示2、拷贝需要用到的头文件3、编译 C 代码 四、验证测试1、拷贝相关文件到开发板2、显示图片 前言 由于…

深入了解Dubbo SPI 工作机制——@Adaptive(6)

Adaptive这个注解就是适配策略&#xff0c;我都是称呼为最佳适配子类&#xff0c;或者最佳适配类。就是找到最佳的子实现类的&#xff0c;其实就是默认的类。这个注解可以打在类上方&#xff0c;那么dubbo SPI机制通过接口获取实例类&#xff0c;就是获取到有Adaptive注解的实现…

WooCommerce商城开发:高性能订单存储数据库模式

这是一系列深入探讨的第一部分&#xff0c;专门用于解释高性能订单存储数据库模式的实施。 与1 月份提出的版本相比&#xff0c;数据库模式的变化很小。我们在不同的地方添加和删除了几列&#xff0c;但整体表结构与第一个提案中描述的相同&#xff1a; 我们在此项目中添加了4…

51单片机(九)LED点阵屏

❤️ 专栏简介&#xff1a;本专栏记录了从零学习单片机的过程&#xff0c;其中包括51单片机和STM32单片机两部分&#xff1b;建议先学习51单片机&#xff0c;其是STM32等高级单片机的基础&#xff1b;这样再学习STM32时才能融会贯通。 ☀️ 专栏适用人群 &#xff1a;适用于想要…

创维E900-S-Hi3798MV100-当贝纯净桌面-卡刷固件包

创维E900-S-Hi3798MV100-当贝纯净桌面-卡刷固件包-内有教程 特点&#xff1a; 1、适用于对应型号的电视盒子刷机&#xff1b; 2、开放原厂固件屏蔽的市场安装和u盘安装apk&#xff1b; 3、修改dns&#xff0c;三网通用&#xff1b; 4、大量精简内置的没用的软件&#xff0…

RabbitMQ消息队列实战(5)—— 发后即忘和远程RPC数据传输模型

本文我们学习下使用RabbitMQ实现的几种数据发送的模型——发后即忘模型和远程RPC调用。二者实际上是从业务的角度定义的一个RabbitMQ的使用模型。发后即忘模型&#xff0c;强调发送时不太关心消息接收者的执行结果&#xff0c;仅仅是为了发送信息。而远程RPC调用模型强调&#…

vulnhub靶场之double:1

1.信息收集 探测存活主机&#xff0c;发现192.168.239.178存活 对目标主机192.168.239.176进行端口扫描&#xff0c;发现存活22(SSH)、25(smtp)、80、8080端口。 浏览器访问http://192.168.239.178&#xff0c;发现有两个链接。查看源码发现一个是跳转到/production&#xf…

David Silver Lecture 6: Value function approximation

1 Introduction pipeline大致讲完了&#xff0c;开始到数值计算的部分。 1.1 大规模的运算 对于这种大规模运算&#xff0c;如何拓展前面两个章节的内容&#xff0c;进行实战。 1.1.1 回顾value function approximation 1.1.3 which function approximator 强化学习中的值函…

java源码----集合系列1----ArrayList,linkedList

Arraylist 基础信息 底层是一个object数组 Arraylist 是java里面Collection 标准的一个集合&#xff0c;其底层是一个object数组。当new一个空参的ArrayList的时候&#xff0c;会默认生成一个空数组。 Arraylist上限是 Integer.MAX_VALUE - 8(Integer.MAX_VALUE 2^31-1);…

一文搞定接口测试及常用接口测试工具解析

目录 首先&#xff0c;什么是接口呢&#xff1f; 一、常见接口&#xff1a; 二、前端和后端&#xff1a; 三、什么是接口测试&#xff1a; 四、接口组成 五、为什么要做接口测试&#xff1a; 六、接口测试怎么测&#xff1a; 七、用什么工具测 首先&#xff0c;什么是接…

软件工程开发文档写作教程(06)—项目建议书写作规范

本文原创作者&#xff1a;谷哥的小弟作者博客地址&#xff1a;http://blog.csdn.net/lfdfhl本文参考资料&#xff1a;电子工业出版社《软件文档写作教程》 马平&#xff0c;黄冬梅编著 项目建议书概述 项目建议书一般是由主策划或者项目经理负责编写的。进行可行性分析是一个自…

3.编写油猴脚本之-helloword

3.编写油猴脚本之-helloword Start 通过上一篇文章的学习&#xff0c;我们安装完毕了油猴插件。今天我们来编写一个helloword的脚步&#xff0c;体验一下油猴。 1. 开始 点击油猴插件>添加新脚本 默认生成的脚本 // UserScript // name New Userscript // name…

Linux介绍及环境搭建

文章目录 &#x1f3ac;1.Linux背景&#x1f4bb;1.1 计算机的发展&#x1f4bb;1.2 操作系统的故事&#x1f4bb;1.3 Linux操作系统&#x1f4bb;1.4 Linux的应用场景&#x1f4bb;1.5 Linux版本 &#x1f50c;2. Linux环境&#x1f4be;2.1 环境选择&#x1f4be;2.2 云服务器…

u1s1,查问题已经从百度到Google,再从Google到gpt了

现在查问题&#xff0c;查资料&#xff0c;基本都是问gpt。 感觉AI的回答会比较智能。 除了解释说明&#xff0c;还会附录Demo源码。 而且没有广告和其他杂七杂八的。 方便/快捷&#xff0c;提高了工作效率。 举例 上传图片后无法渲染的文章,发现数据库的图片地址前缀带blob,可…

数据结构-查找-线性结构(顺序、折半、分块)查找

目录 一、顺序查找 *查找效率分析 二、折半查找 *查找效率分析 三、分块查找 *查找效率分析 一、顺序查找 有称线性查找&#xff0c; 算法思想&#xff1a;从头到尾挨个查找(反过来也行) typedef struct{int *elem; //数据int TableLen; …

MySQL原理(六):日志

前言 上一篇介绍了 MySQL 的锁&#xff0c;这一篇将介绍日志相关的内容。 MySQL 中最常见的日志有三类&#xff1a; undo log&#xff08;回滚日志&#xff09;&#xff1a;是 Innodb 存储引擎层生成的日志&#xff0c;实现了事务中的原子性&#xff0c;主要用于事务回滚和 …

MATLAB程序在设备端部署实例

背景介绍 MATLAB广泛应用于物理系统建模、测量测试、系统控制以及深度学习等&#xff0c;在工程实践中具有非常重要的地位&#xff0c;具体如图1所示。调研发现&#xff0c;科研人员能够编写各种matlab代码&#xff0c;通过建模仿真来更好的认识世界。近年来&#xff0c;随着物…

《LeetCode》—— 摆动序列

今天&#xff0c;我们要讲解的是 “摆动序列” 这道题目。对于这道题目&#xff0c;我们可以从贪心的思想去解决&#xff0c;也可以使用动态规划的方法。接下来&#xff0c;我通过这两种方法的讲解让你轻松拿捏它&#xff01; 目录 &#xff08;一&#xff09;贪心算法 1、上下…