Vue 组件化: 计算属性、内容分发、自定义事件

news2024/12/28 5:21:09

目录

1. 计算属性

1.1 计算属性的特点

2. 内容分发

2.1 使用插槽的示例

3. 自定义事件


1. 计算属性

什么是计算属性 ?

计算属性的重点突出在属性两字, 首先它是个属性, 其次这个属性有计算的能力, 这里的计算就是个函数; 简单来说, 它就是一个能够将计算结果缓存起来的属性 (将行为转化成了静态的属性), 仅此而已; 可以想象为缓存!

代码示例 : 

<div id="app">
  <p>currentTime1: {{currentTime1()}}</p>
  <p>currentTime2: {{currentTime2}}</p>
</div>

<script src="https://cdn.jsdelivr.net/npm/vue@2.5.21/dist/vue.min.js">
</script>
<script>
    var vm = new Vue({
        el: "#app",
        data: {
          msg: "hello vue"
        },
        methods: {
          currentTime1: function() {
            return Date.now(); // 返回一个时间戳
          }
        },
        computed: { // 计算属性 注意: methods, computed 方法不能重名, 重名之后只会调用 methods 方法
          currentTime2: function() {
            return Date.now();  // 返回一个时间戳
          }
        }
    });
</script>

说明:

  • methods : 定义方法, 调用方法使用 currentTime1(), 需要带括号;
  • computed : 定义计算属性, 调用属性使用 currentTime2, 不需要带括号; 

【注意】methods 和 computed 中的方法不能重名

如果二者方法重名了, 就只会调用到 methods  中的方法.  请看如下示例 : 

访问页面 : 

 

1.1 计算属性的特点

针对上述代码示例, 对比调用 methods 和 computed 方法的变化 : 

1. 控制台调用 methods 中的方法 : 

每次调用 currentTime1, 时间戳都会发生改变.

2. 控制台调用 computed 中的方法 : 

每次调用 currentTime2, 时间戳不会发生变化. 计算出来的结果被缓存在内存中了.

【注意变化】

此时我在 computed 中调用一下 data 中的 msg 数据, 并在控制台中不断调用 computed 中的currentTime2 过程中, 突然修改一下 msg 的值, 再去调用 currentTime2, 此时观察变化 :

当 computed 中其他数据刷新时, currentTime2 的时间戳就会重新计算, 这个和缓存一模一样. 

【结论】

调用方法时, 每次都需要进行计算, 既然有计算过程则必定产生系统开销, 那如果这个结果是不经常变化的的呢 ? 此时就可以考虑将这个结果缓存起来, 采用计算属性可以很方便的做到这一点, 计算属性的主要特征就是为了将经常变化的计算结果进行缓存, 以节约我们的系统开销; 

2. 内容分发

在 Vue.js 中我们使用 <slot> 元素作为承载分发内容的出口, 作者称其为 "插槽", 可以应用在组合组件的场景中.

为什么需要插槽 ? 比如当我们遇到以下场景时 : 

<div id="app">
    <p>列表书籍</p>
    <ul>
        <li>Java</li>
        <li>Linux</li>
        <li>Python</li>
    </ul>
</div>

按照原先的方式, 我们想要拿到 li 中的所有数据, 就得遍历 ul, 可现在 ul 里面隔了 li , 此时再按照之前的方式遍历就会出问题, 于是就需要使用到 "插槽" 来解决

2.1 使用插槽的示例

准备一个待办事项组件 (todo), 该组件由待办标题 (todo-title) 和待办内容 (todo-items) 组成, 但是这三个组件又是互相独立的, 如何使用插槽来实现 ??

1. 定义一个待办事项的组件 : 

<div id="app">
    <todo>
    </todo>
</div>

<script>
    Vue.component("todo",{
        template: '<div>\
                        <div>列表书籍</div>\
                        <ul>\
                            <li>Java</li>\
                        </ul>\
                    </div>'
    });
</script>

2. 让待办事项的标题和值实现动态绑定. 我们给上面的待办事项的标题和值都留出一个插槽.  <slot> 标签

<div id="app">
    <todo>
    </todo>
</div>

<script>
    Vue.component("todo",{
        template: '<div>\
                        <slot name="todo-title"></slot>\
                        <ul>\
                            <slot name="todo-items"></slot>\
                        </ul>\
                    </div>'
    });
</script>

3. 定义 todo-title 的待办标题组件和 todo-items 的待办内容组件.

// 待办标题组件
Vue.component("todo-title",{
    props: ['title'],
    template: '<div>{{title}}</div>'
});
// 待办内容组件
Vue.component("todo-items",{
    props: ['item','index'],
    template: '<li>{{index}}--{{item}}</li>'
});

4. 实例化 Vue, 并初始化数据

var vm = new Vue({
    el: "#app",
    data: {
        title: "跟秦老师学 Vue",
        todoItems: ['你好世界','毛毛学hadoop','毛毛学Linux']
    }

});

5. 将这些值通过插槽插入, 实现组合组件的内容分发.

<div id="app">
    <todo>
        <todo-title slot="todo-title" :title="title"></todo-title>
        <todo-items slot="todo-items" v-for="(item,index) in todoItems" 
            :item="item" :index="index"></todo-items>
    </todo>
</div>

浏览器访问 : 

 由此可见, 插槽在组合组件中实现内容分发起了关键作用. 

3. 自定义事件

既然 Vue 它是双向绑定的, 那我们如何针对上述内容分发的示例, 实现动态的删除呢 ??

 分别在 todo-items 组件和 vm 实例中增加删除方法 : 

Vue.component("todo-items",{
    props: ['item','index'],
    // 只能绑定当前组件的方法
    template: '<li>{{index}}---{{item}} <button @click="remove">删除</button></li>',
    methods: {
        remove: function() {
            alert("删除成功!");
        }
    }
});

var vm = new Vue({
    el: "#app",
    data: {
        title: "秦老师说 Vue",
        todoItems: ['你好世界','毛毛学hadoop','毛毛学Linux']
    },
    methods: {
        removeItems: function (index) {
            this.todoItems.splice(index,1);
        }
    }
});

       但是现在问题是, todo-items 组件中无法绑定 vue 实例中的方法, 一旦我把 @click="remove" 写成 @click="removeItems", 访问页面的时候, 就会报 removeItems 未定义的错误.  

      于是 Vue 就为我们提供了自定义事件的功能帮助我们解决这个问题 , 

使用 this.$emit("自定义事件名", 参数), 具体操作如下 : 

1. View 层模板绑定 Vue 实例中的方法

<div id="app">
    <todo>
        <todo-title slot="todo-title" :title="title"></todo-title>
        <todo-items slot="todo-items" v-for="(item,index) in todoItems" 
            :item="item" :index="index" v-on:remove="removeItems(index)"></todo-items>
    </todo>
</div>

2. todo-Items 组件中使用 this.$emit() 绑定 view 模板中的自定义事件

ue.component("todo-items",{
    props: ['item','index'],
    // 只能绑定当前组件的方法
    template: '<li>{{index}}---{{item}} <button @click="remove">删除</button></li>',
    methods: {
        // this.$emit 自定义事件分发
        remove: function(index) {
            this.$emit('remove',index);
        }
    }
});

此时就能动态的对数据进行删除了.

自定义事件原理图 : 

 


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

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

相关文章

认识 SpringCloud 核心组件

✅作者简介&#xff1a;大家好&#xff0c;我是Cisyam&#xff0c;热爱Java后端开发者&#xff0c;一个想要与大家共同进步的男人&#x1f609;&#x1f609; &#x1f34e;个人主页&#xff1a;Cisyam-Shark的博客 &#x1f49e;当前专栏&#xff1a; 微服务探索之旅 ✨特色专…

Linux进程间通信【共享内存】

✨个人主页&#xff1a; 北 海 &#x1f389;所属专栏&#xff1a; Linux学习之旅 &#x1f383;操作环境&#xff1a; CentOS 7.6 阿里云远程服务器 文章目录 &#x1f307;前言&#x1f3d9;️正文1、什么是共享内存&#xff1f;2、共享内存的相关知识2.1、共享内存的数据结构…

人工智能十大新星揭晓,华人学者占90%

人工智能领域著名杂志 IEEE Intelligent Systems发布了 2022 年度“人工智能十大新星”&#xff08;AIs 10 to Watch&#xff09;名单 &#xff0c;其中有九位都是华人研究者。知识人网小编推荐给大家。 近日&#xff0c;人工智能领域著名杂志 IEEE Intelligent Systems公布了 …

在JavaScript中的栈数据结构(Stack )

文章目录 导文什么是Stack 类&#xff1f;如何创建一个Stack如何修改Stack中的值栈声明方法举例添加移除查看查看栈顶元素检查栈是否为空检查栈的长度 清空栈元素打印栈元素 完整的Stack函数&#xff1a;创建Stack的其他方法-用 ES6 语法声明 Stack 类 使用Stack类在 JavaScrip…

关于GDPR体系文件介绍,介绍GDPR体系文件的内容和意义

随着数字化时代的到来&#xff0c;个人数据保护成为了一个日益受到关注的问题。欧盟于2018年5月25日颁布了“通用数据保护条例”&#xff08;GDPR&#xff09;&#xff0c;旨在加强对欧洲公民个人数据的保护。GDPR对企业和组织的数据保护和处理流程提出了严格的要求&#xff0c…

自助化打印面单教程

我们都知道&#xff0c;这几年快递行业&#xff0c;从传统纸质面单过渡到了电子面单。以往企业寄快递&#xff0c;能够自行填写纸质面单&#xff0c;等待收件员上门收件&#xff0c;现如今&#xff0c;企业寄件能否自行打印电子面单&#xff1f; 首先我们要先对比一下传统面单和…

云智研发笔试编程题(一):图像相似度

题目描述 给出两幅相同大小的黑白图像 (用0-1矩阵) 表示求它们的相似度。若两幅图像在相同位置上的像素点颜色相同&#xff0c;则称它们在该位置具有相同的像素点。两幅图像的相似度定义为相同像素点数占总像素点数的百分比。 输入描述 第一行包含两个整数m和n&#xff0c;表…

C++概述——浅谈C++对C的拓展

纵有疾风起&#xff0c;人生不言弃。本文篇幅较长&#xff0c;如有错误请不吝赐教&#xff0c;感谢支持。 &#x1f4ac;C核心编程一 一.C简介二.第一个程序Hello,world&#xff01;三.C的特点四.C对C的扩展1️⃣作用域运算符::2️⃣C命名空间(namespace)①名字控制②为什么有…

golang性能分析 pprof的使用 graphviz

golang性能分析 pprof的使用 graphviz 1 参考文档2 pprof、Graphviz介绍3 Graphviz下载 安装4 使用 1 参考文档 参考1&#xff1a;golang性能分析&#xff0c;pprof的使用&#xff0c;graphviz&#xff0c;火焰图 参考2&#xff1a;Golang中的pprof分析环境搭建【Windows环境】…

隆重共建开放,共享未来 | 2023 开放原子全球开源峰会 OpenAtom OpenHarmony 分论坛即将启幕

在全球数字化进程快速发展的背景下&#xff0c;OpenAtom OpenHarmony&#xff08;以下简称“OpenHarmony”&#xff09;旨在通过面向全场景、全连接、全智能时代、基于开源的方式&#xff0c;搭建下一代智能终端设备操作系统的框架和平台&#xff0c;为消费、金融、能源、教育、…

光模块失效的原因及预防措施汇总

光模块从生产到使用都必须有规范化的操作方法&#xff0c;任何不规范的动作都可能造成光模块隐性的损伤或者永久的失效&#xff0c;下面就跟着小编来学习一下预防光模块失效的方法吧! 一、光模块失效的主要原因 1、光模块受到静电伤害&#xff08;ESD损伤&#xff09;&#xf…

2023 年最新版 Java 后端最全面试攻略,全面对标 BATJ互联网大厂

前言 小编分享的这份 Java 后端开发面试总结包含了 JavaOOP、Java 集合容器、Java 异常、并发编程、Java 反射、Java 序列化、JVM、Redis、Spring MVC、MyBatis、MySQL 数据库、消息中间件 MQ、Dubbo、Linux、ZooKeeper、 分布式 &数据结构与算法等 25 个专题技术点&#…

爬虫案例-使用Session登录某知名网站(JS逆向AES-CBC加密+MD5加密)

总体概览&#xff1a;使用Session登录该网站&#xff0c;其中包括对password参数进行js逆向破解 &#xff08;涉及加密&#xff1a;md5加密AES-CBC加密&#xff09; 难度&#xff1a;两颗星 目标网址&#xff1a;aHR0cHM6Ly93d3cuZnhiYW9nYW8uY29tLw 下面文章将分为四个部分…

证券公司软件测试面试总结分享!

这家公司是做证券项目的&#xff0c;约的9点钟&#xff0c;路程还是有点遥远&#xff0c;转了一趟公交两趟地铁&#xff0c;精力都花在了路上&#xff0c;感觉有点累&#xff0c;以下是今天得面试流程。 到公司前台给我了一张面试表&#xff0c;写完之后就是等待面试。一共面试…

Java开发手册中为什么禁止使用isSuccess作为布尔类型变量名以及POJO中基本类型与包装类型的使用标准

场景 Java开发手册中关于POJO的布尔类型的变量名的要求是: 【强制】POJO 类中的任何布尔类型的变量&#xff0c;都不要加 is 前缀&#xff0c;否则部分框架解析会引起序列化错误。 说明&#xff1a;在本文 MySQL 规约中的建表约定第一条&#xff0c;表达是与否的变量采用 is…

【新版】系统架构设计师 - 知识产权与标准化

个人总结&#xff0c;仅供参考&#xff0c;欢迎加好友一起讨论 文章目录 架构 - 知识产权与标准化考点摘要保护范围与对象识产权与保护期限知识产权与知识产权人的确定知识产权与侵权判定标准化&#xff08;标准分类与编号&#xff09; 架构 - 知识产权与标准化 考点摘要 保护…

JavaSE-06 【面向对象+封装】

JavaSE-06 [面向对象封装] 第一章 面向对象思想 1.1 面向过程和面向对象 面向过程&#xff1a; 面向过程就是分析出解决问题所需要的步骤&#xff0c;然后用函数把这些步骤一步一步实现&#xff0c;使用的时候一个一个依次调用就可以了面向对象&#xff1a; 面向对象是把构成…

windows服务器自带IIS搭建网站并发布公网访问的详细教程

文章目录 1.前言2.Windows网页设置2.1 Windows IIS功能设置2.2 IIS网页访问测试 3. Cpolar内网穿透3.1 下载安装Cpolar3.2 Cpolar云端设置3.3 Cpolar本地设置 4.公网访问测试5.结语 1.前言 在网上各种教程和介绍中&#xff0c;搭建网页都会借助各种软件的帮助&#xff0c;比如…

关于数据生成二维码保存和解密删除二维码

文章目录 前言一、pom配置依赖二、文件引入1.BufferedImageLuminanceSource2.QRCodeUtil3.MyPicConfig4.UploadUtils三、测试前言 所需文件: MyPicConfig 主要解决上传图片实时刷新BufferedImageLuminanceSource 算法文件QRCodeUtil 生成二维码工具类UploadUtils 主要解决上传…

Python中模块的动态导入和自动安装

前言 在 Python 开发中&#xff0c;正确管理和安装所需的第三方模块是至关重要的&#xff0c;但手动处理模块依赖可能会变得繁琐且容易出错。 为了简化这一过程&#xff0c;Python 提供了动态导入和自动安装模块的能力。本文将介绍如何使用动态导入和自动安装模块的方法&#x…