【Vue笔记】Vue组件的创建、使用以及父子组件数据通信常见的几种方式

news2024/11/18 21:36:49

这篇文章,主要介绍Vue组件的创建、使用以及父子组件数据通信常见的几种方式。

目录

一、Vue组件的使用

1.1、局部组件

1.2、全局组件

1.3、动态组件(组件动态切换)

1.4、缓存组件

(1)如何缓存组件

(2)如何更新组件

1.5、父组件传递数据给子组件

(1)props属性传递数据

(2)props数据类型校验

1.6、子组件回传数据给父组件

1.7、子组件回调父组件方法


一、Vue组件的使用

1.1、局部组件

  • 局部组件:创建的组件只能够在当前Vue实例中使用,作用域更小。
  • 局部组件的注册:
    • 第一步:定义局部组件对象,对象里面使用【template】属性定义组件的模板,当组件里面也可以使用其他Vue的所有属性和方法。
    • 第二步:在Vue实例里面,使用【components】属性注册局部组件。
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>局部组件</title>
</head>
<body>

<div id="app">
    <h3>Vue局部组件</h3>
    <!-- 使用局部组件 -->
    <scope-component></scope-component>
</div>

<div id="app2">
    <h3>Vue局部组件</h3>
    <div>{{ message }}</div>
    <!-- 无法使用第一个实例的局部组件,不会报错,只是不生效 -->
    <scope-component></scope-component>
</div>

<script src="https://cdn.staticfile.org/vue/2.2.2/vue.min.js"></script>
<script>
    // 创建局部组件
    const scopeComponent = {
        template: `<div>
            <h4>这是局部组件</h4>
        </div>`
    };
    // 创建Vue实例对象
    const vm = new Vue({
        el: '#app',
        // 注册局部组件
        components: {
            scopeComponent
        }
    });

    // 创建第二个Vue实例对象
    const vm2 = new Vue({
        el: '#app2',
        data() {
            return {
                message: 'Hello World'
            }
        }
    });
</script>
</body>
</html>

1.2、全局组件

  • 全局组件:创建的组件是直接挂在到整个Web应用程序的Vue实例上面,可以在任意的作用域里面使用创建的全局组件。
  • 全局组件的注册:
    • ​​​​​​​第一步:使用【Vue.component(组件名称,组件配置项)】方法注册全局组件。
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>全局组件</title>
</head>
<body>

<div id="app">
    <h3>Vue全局组件: 第一个vue实例对象</h3>
    <!-- 使用全局组件 -->
    <global-component></global-component>
</div>

<div id="app2">
    <h3>Vue全局组件: 第二个vue实例对象</h3>
    <!-- 可以使用第一个实例的全局组件,全局组件所有Vue实例共享 -->
    <global-component></global-component>
</div>

<script src="https://cdn.staticfile.org/vue/2.2.2/vue.min.js"></script>
<script>
    // 创建全局组件
    const globalComponent = {
        template: `<div>
            <h4>这是全局组件</h4>
        </div>`
    };
    // 注册全局组件
    Vue.component('global-component', globalComponent);
    
    // 创建Vue实例对象
    const vm = new Vue({
        el: '#app'
    });

    // 创建第二个Vue实例对象
    const vm2 = new Vue({
        el: '#app2'
    });
</script>
</body>
</html>

1.3、动态组件(组件动态切换)

Vue中提供了【is】属性,这个属性可以根据传递的【组件名称】动态的切换显示的不同组件的内容,一般来说,都是结合【<component>】标签一起使用,当然,你也可以用在普通的HTML标签上面。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>动态组件</title>
</head>
<body>

<div id="app">
    <h3>Vue动态切换组件</h3>
    <div>
        <button @click="showComp('firstComponent')">显示组件01</button>
        <button @click="showComp('secondComponent')">显示组件02</button>
        <button @click="showComp('thirdComponent')">显示组件03</button>
    </div>
    <!-- 动态切换组件 -->
    <component :is="compName"></component>
</div>

<script src="https://cdn.staticfile.org/vue/2.2.2/vue.min.js"></script>
<script>
    // 创建局部组件
    const firstComponent = {
        data() {
            return {
                message: ''
            }
        },
        template: `<div style="height: 100px;width: 300px;background: antiquewhite;">
            <h4>这是firstComponent组件</h4>
            <input type="text" v-model="message">
        </div>`
    };
    const secondComponent = {
        data() {
          return {
              message: ''
          }
        },
        template: `<div style="height: 100px;width: 300px;background: antiquewhite;">
            <h4>这是secondComponent组件</h4>
            <input type="text" v-model="message">
        </div>`
    };
    const thirdComponent = {
        data() {
            return {
                message: ''
            }
        },
        template: `<div style="height: 100px;width: 300px;background: antiquewhite;">
            <h4>这是thirdComponent组件</h4>
            <input type="text" v-model="message">
        </div>`
    };

    // 创建Vue实例对象
    const vm = new Vue({
        el: '#app',
        components: {
            firstComponent,
            secondComponent,
            thirdComponent
        },
        data() {
            return {
                compName: firstComponent
            }
        },
        methods: {
            showComp(val) {
                this.compName = val;
            }
        }
    });
</script>
</body>
</html>

动态切换组件的效果如下所示:

1.4、缓存组件

动态组件在切换的过程中,每一次切换都是重新创建一个组件,有些时候,其实没有必要重新创建新的组件,可以利用已经创建的组件显示就可以,所以Vue官方也考虑到了这一点,提供了一个【<keep-alive>】标签,这个标签的作用就是:将已经的组件缓存起来,下一次显示这个组件的时候,不会重新创建,而是直接使用缓存中的组件。

(1)如何缓存组件

如何使用【<keep-alive>】标签缓存组件???

  • 我们只需要在显示组件的位置,使用【<keep-alive>】标签将其包裹起来就可以完成组件的缓存功能。
<!-- 缓存组件 -->
<keep-alive>
    <!-- 动态切换组件 -->
    <component :is="compName"></component>
</keep-alive>
  • 通过上面的步骤,再次访问我们的组件,可以发现,之前已经创建的组件,再次切换的时候,该组件会保持之前的状态。

  • 从上图可以看到,我们在组件输入框里输入一些内容,然后再次切换到这个组件,这个输入框的内容是不会被刷新掉,而是保持之前组件的状态,这个就是组件被缓存起来了。

(2)如何更新组件

组件缓存虽然可以减少DOM的渲染,但是有时候,我们可能会有一些需求,那就是在组件切换的时候,其中某个组件需要更新,而其他组件不需要更新,那么应该如何更新那一个组件呢???

Vue也考虑到了这一点,所以提供了钩子函数,如果需要更新某个缓存组件的部分内容,可以在【activitated()】钩子函数里面进行数据的更新操作。

  • 【activitated()】钩子函数:每一次访问组件的时候,这个钩子函数都会执行一次。
const secondComponent = {
    // 在 onActivated 钩子函数中,更新对应的数据
    activated() {
        // 在这个函数里面,可以根据实际需要进行业务处理操作
        this.message = ''
    },
    data() {
      return {
          message: ''
      }
    },
    template: `<div style="height: 100px;width: 300px;background: antiquewhite;">
        <h4>这是secondComponent组件</h4>
        <input type="text" v-model="message">
    </div>`
};

1.5、父组件传递数据给子组件

Web应用程序拆分成了一个一个的Vue组件,那么Vue组件之间的数据交互就成了一个问题,好在Vue官方也给我们通过了非常好用的父子组件通信的机制,下面介绍父组件如何传递数据给子组件。

注意:props是单向数据流的,也就是说,数据只能够从父组件传递到子组件,而不能够从子组件传递到父组件。

(1)props属性传递数据

  • Vue中,父组件要给子组件传递数据,是通过【props】属性来实现。
  • 父组件:在父组件里面,通过在子组件标签上,使用对应的属性名称传递数据。
  • 子组件:在子组件里面,通过定义【props】属性,指定需要接收的数据名称。
  • props可以是一个字符串数组,数组中的每一个元素表示父组件传递过来的一个数据变量名称
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>父组件传递数据子组件</title>
</head>
<body>

<div id="app">
    <h3>Vue组件通信(父组件传递数据子组件)</h3>
    <first-component :custom-data="message"></first-component>
</div>

<script src="https://cdn.staticfile.org/vue/2.2.2/vue.min.js"></script>
<script>
    // 创建局部组件
    const firstComponent = {
        // 通过props定义父组件的数据
        props: ['customData'],
        template: `<div style="height: 100px;width: 300px;background: antiquewhite;">
            <h3>这是firstComponent组件</h3>
            <h4>这是父组件传递的数据:{{ customData }}</h4>
        </div>`
    };

    // 创建Vue实例对象
    const vm = new Vue({
        el: '#app',
        components: {
            firstComponent
        },
        data() {
            return {
                message: 'this is data of parent.'
            }
        }
    });
</script>
</body>
</html>

(2)props数据类型校验

  • 前面说了,props可以是一个字符串数组,其实,它也可以是一个对象,并且可以给props属性设置每一个属性的数据类型、默认值。
  • props采用对象的格式,对应中的每一个属性又是一个对象,每一个属性对象可以定义【type】和【default】两个属性值,分别表示:数据类型和默认值。
  • type属性常见的数据类型有:String、Number、null、Boolean、Object、Array、Function、Promise(注意:type可以是数组,包含多个数据类型,只要满足其中一个即可)。
  • default属性:对于Object、Array、Function类型,需要使用一个工厂方法来设置默认值,其余的直接设置默认值即可。
// 创建局部组件
const firstComponent = {
    // 通过props定义父组件的数据
    props: {
        customData: {
            type: Number,
            default: 520
        },
        userName: {
            type: [String, null],
            default: ''
        },
        objectType: {
            type: Object,
            default: function () {
                return new Object()
            }
        },
        arrayType: {
            type: Array,
            default: function () {
                return []
            }
        },
        funType: {
            type: Function,
            default: function () {
                return null
            }
        }
    }
};

1.6、子组件回传数据给父组件

子组件如果需要将数据传递到父组件,那么只能够通过触发事件的形式来实现。大致思想是:子组件通过【$emit()】方法,向父组件抛出一个事件,父组件监听这个事件,一旦子组件抛出事件之后,那么父组件就可以执行这个事件,从而获取到子组件传递的数据。

  • 【$emit()方法】:Vue中提供了【$emit(事件名称,参数[可以多个])】方法,这个方法作用:向父组件发出一个事件。
  • 注意事项:
    • ​​​​​​​$emit()方法中,第一个参数定义的事件名称,只能够使用小写,不能使用大写驼峰命名法规则(否则不生效)

案例代码如下所示:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>子组件传递数据父组件</title>
</head>
<body>

<div id="app">
    <h3>Vue组件通信(子组件传递数据父组件)</h3>
    <!--
        子组件传递数据给父组件
        父组件监听:handleEmitClick 事件(采用中划线命名)
     -->
    <first-component @getdata="getData"></first-component>
</div>

<script src="https://cdn.staticfile.org/vue/2.2.2/vue.min.js"></script>
<script>
    // 创建局部组件
    const firstComponent = {
        methods: {
            sendData() {
                this.$emit('getdata', '这是子组件传递的数据')
            }
        },
        template: `<div style="height: 100px;width: 300px;background: antiquewhite;">
            <h3>这是firstComponent组件</h3>
            <div><button @click="sendData">子组件回传数据($emit)</button></div>
        </div>`
    };

    // 创建Vue实例对象
    const vm = new Vue({
        el: '#app',
        components: {
            firstComponent
        },
        methods: {
            // 父组件触发的事件
            getData(item) {
                console.log(item)
            }
        }
    });
</script>
</body>
</html>

1.7、子组件回调父组件方法

父组件和子组件除了通过【$emit()】方法来进行数据交互,其实还可以通过回调事件来进行数据交互。大致思想是:父组件将一个函数Function作为一个props属性传递给子组件,然后在子组件执行这个Function函数即可,这个过程本质就是子组件执行父组件中的函数。

  • 父组件将一个Function函数作为props属性传递给子组件执行。
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>子组件回调父组件方法</title>
</head>
<body>

<div id="app">
    <h3>Vue组件通信(子组件回调父组件方法)</h3>
    <!--
        子组件传递数据给父组件
        父组件监听:handleEmitClick 事件(采用中划线命名)
     -->
    <first-component :get-data="getData"></first-component>
</div>

<script src="https://cdn.staticfile.org/vue/2.2.2/vue.min.js"></script>
<script>
    // 创建局部组件
    const firstComponent = {
        props: {
          getData: {
              type: Function,
              default: null
          }
        },
        methods: {
            sendData() {
                // 回调父组件方法
                this.getData('这是子组件传递的数据')
            }
        },
        template: `<div style="height: 100px;width: 300px;background: antiquewhite;">
            <h3>这是firstComponent组件</h3>
            <div><button @click="sendData">子组件回调父组件方法</button></div>
        </div>`
    };

    // 创建Vue实例对象
    const vm = new Vue({
        el: '#app',
        components: {
            firstComponent
        },
        methods: {
            // 父组件触发的事件
            getData(item) {
                console.log(item)
            }
        }
    });
</script>
</body>
</html>

到此,Vue中组件的创建和父子组件数据通信就介绍完啦。

综上,这篇文章结束了,主要介绍Vue组件的创建、使用以及父子组件数据通信常见的几种方式。

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

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

相关文章

微服务技术--Nacos与Eureka

eureka注册中心 远程调用的问题 消费者该如何获取服务提供者具体信息&#xff1f; 服务提供者启动时向eureka注册自己的信息eureka保存这些信息消费者根据服务名称向eureka拉取提供者信息 如果有多个服务提供者&#xff0c;消费者该如何选择&#xff1f; 服务消费者利用负载均…

区块链技术1---密码学基础

摘要&#xff1a;BTC属于加密货币&#xff0c;其中必然涉及到密码学的知识&#xff0c;而比特币比较开放&#xff0c;交易记录&#xff0c;交易金额甚至是底层源代码都是对外开放&#xff0c;那么加密使用在何处&#xff1f;这里就来谈一谈1&#xff1a;哈希哈希函数是密码学的…

client-go实战之六:时隔两年,刷新版本继续实战

欢迎访问我的GitHub 这里分类和汇总了欣宸的全部原创(含配套源码)&#xff1a;https://github.com/zq2599/blog_demos 系列文章链接 client-go实战之一&#xff1a;准备工作client-go实战之二:RESTClientclient-go实战之三&#xff1a;Clientsetclient-go实战之四&#xff1a;…

JavaWeb开发(三)3.3——Spring Bean详解

一、Bean的概念 由 Spring IoC 容器负责创建、管理所有的Java对象&#xff0c;这些管理的对象称为 Bean&#xff0c;Bean 根据 Spring 配置文件中的信息创建。 二、基于XML方式管理bean对象 eg&#xff1a; <?xml version"1.0" encoding"UTF-8"?&…

【B-树、B+树、B* 树】多叉平衡搜索树,解决“IO次数”与“树高”问题~

目录 一、为什么会出现B-树&#xff1f; 面试题&#xff1a; 二、什么是B-树&#xff1f; 2.1、B,B-树,B*树 导航 三、B-树的模拟实现 3.1、插入结点分析 3.1.1、根节点的分裂 3.1.2、继续插入数据&#xff0c;分裂子节点 3.2.3、再次插入数据&#xff0c;导致根节点继…

tomcat和apache有什么区别?如何将内网发布到互联网访问?

tomcat、 apache是比较常用的搭建服务器的中间件&#xff0c;它们之间还是有一些区别差异的&#xff0c;我们通常会根据本地应用场景来选择合适的中间件来搭建服务器。在内网本地部署搭建服务器后&#xff0c;还可以通过快解析端口映射方法&#xff0c;将内网应用地址发布到互联…

Android原生检测Selinux的三种方法

本文介绍 3 种检测 Android 设备 SELinux 状态的方法, Java 层检测Selinux已经没有太多意义,因为不是很靠谱,随便一个hook代码就能绕过,所以我要告诉你如何在 C 层完成检测。这几种方法在效率和抵抗mock SELinux State 的技术方面都不相同,因此在使用之前你需要知道每种方…

Windows server——部署DNS服务

作者简介&#xff1a;一名云计算网络运维人员、每天分享网络与运维的技术与干货。 座右铭&#xff1a;低头赶路&#xff0c;敬事如仪 个人主页&#xff1a;网络豆的主页​​​​​​ 目录 前言 本章重点 一.DNS概述 1.DNS的诞生 二.DNS的功能 使用域名访问具有以下优点…

【大厂高频真题100题】《二叉树的序列化与反序列化》 真题练习第23题 持续更新~

二叉树的序列化与反序列化 序列化是将一个数据结构或者对象转换为连续的比特位的操作,进而可以将转换后的数据存储在一个文件或者内存中,同时也可以通过网络传输到另一个计算机环境,采取相反方式重构得到原数据。 请设计一个算法来实现二叉树的序列化与反序列化。这里不限…

c语言 图形化贪吃蛇 多种功能 无需安装第三方库 课设 (附代码)

前言 类贪吃蛇是利用c语言模仿并实现经典游戏贪吃蛇&#xff0c;使其在窗口有贪吃蛇活动的规定范围&#xff0c;并完成一系列包括但不限于模仿蛇的移动&#xff0c;方向控制&#xff0c;吃到食物加分&#xff0c;撞上墙壁及蛇头碰到蛇身死亡等游戏功能。 附加功能&#xff1a…

软件测试复习03:动态测试——白盒测试

作者&#xff1a;非妃是公主 专栏&#xff1a;《软件测试》 个性签&#xff1a;顺境不惰&#xff0c;逆境不馁&#xff0c;以心制境&#xff0c;万事可成。——曾国藩 文章目录逻辑覆盖法&#xff1a;最常用程序插桩技术基本路径法点覆盖边覆盖边对覆盖主路径覆盖符号测试错误…

前端leaflet框选下载bing遥感图

微软必应bing遥感图。bing地图比百度遥感图清晰很多&#xff0c;19级&#xff0c;百度是18级&#xff0c;同样的18级&#xff0c;bing地图比百度也清晰很多。所以没有必要用百度地图了。不过bing地图仅用于学习&#xff0c;商用要付费。参考了https://xiaozhuanlan.com/topic/6…

CV+Deep Learning——网络架构Pytorch复现系列——Detection(二:RtinaNet)更换backbones

上一话 CVDeep Learning——网络架构Pytorch复现系列——Detection(一&#xff1a;SSD:Single Shot MultiBox Detector 4.推理Detect)https://blog.csdn.net/XiaoyYidiaodiao/article/details/128683973?spm1001.2014.3001.5501 复现Object Detection&#xff0c;会复现的网络…

设计模式-门面模式

医院的例子 现代的软件系统都是比较复杂的&#xff0c;设计师处理复杂系统的一个常见方法便是将其"分而治之"&#xff0c;把一个系统划分为几个较小的子系统。如果把医院作为一个子系统&#xff0c;按照部门职能&#xff0c;这个系统可以划分为挂号、门诊、划价、化…

Web--Jedis

# Redis 1. 概念&#xff1a; redis是一款高性能的NOSQL系列的非关系型数据库 1.1.什么是NOSQL NoSQL(NoSQL Not Only SQL)&#xff0c;意即“不仅仅是SQL”&#xff0c;是一项全新的数据库理念&#xff0c;泛指非关系型的数据库。 随着互联网web2.0网…

Arch Linux 来报道!!!

导读Ubuntu 的制造商 Canonical 早已和微软进行合作&#xff0c;让我们体验了极具争议的 Bash on Windows。外界对此也是褒贬不一&#xff0c;许多 Linux 重度用户则是质疑其是否有用&#xff0c;以及更进一步认为 Bash on Windows 是一个安全隐患。 Unix 的 Bash 是通过 WSL (…

LabVIEW使用VI脚本创建和打开VI

LabVIEW使用VI脚本创建和打开VI按照下列步骤&#xff0c;可以创建一个VI&#xff0c;该VI使用VI脚本创建和打开VI。创建VI前&#xff0c;需先了解VI脚本的基本内容。必须启用VI脚本&#xff0c;才能显示VI脚本选板&#xff0c;使用相关属性和方法。1. 选择文件新建VI&#xff0…

第1章 ESP32-VSCODE环境搭建

ESP32-VSCODE环境搭建 环境安装 在Windows中安装ESP-IDF在vscode中安装Espressif IDF插件开始配置Espressif IDF插件 在vscode最上方点击&#xff1a;查看->命令面板&#xff0c;输入esp-idf:config&#xff0c;选择ESP-IDF:Configure ESP-IDF extension 选择EXPRESS Sele…

java07-面向对象2

一&#xff1a;面向对象的第二个特征&#xff1a;继承&#xff0c;关键字extends 1.继承的好处&#xff1a; 1&#xff09;减少代码的冗余&#xff0c;提高代码的复用​​​​​性。 2&#xff09;便于功能的扩展 3&#xff09;为之后多态性的使用&#xff0c;提供了前提 …

【阶段三】Python机器学习27篇:机器学习项目实战:数据降维:主成分分析PCA、基本原理与PCA模型:人脸识别

本篇的思维导图: 数据降维:主成分分析PCA 建立模型分析特征数据时,很可能会面临特征数据维度过大的问题。例如,根据已有的信用卡持有人信息及其违约数据来建立信用卡违约预测模型时,数据可能包含申请人的收入、年龄、性别、婚姻状况、工作单位等数百个维度的特征。…