本文是早期学习Vue整理的一些阶段性总结,内容主要关于Vue框架中组件的概念和数据传递。

一、组件的相关概念

在Vue学习的时候参考了很多文档和书籍,这些文档和书籍中总是充满各种术语(定语),在这里先把Vue中相关的词汇搞清楚,先搞清楚谁是谁,什么是什么,它们的关系是什么样,然后才能继续后面更深入的内容。涉及到的主要概念如下:

组件:我自己的理解是可以把所有的页面中的所有组成部分都当成是组件,即可以把一切都当成是组件(比如一个简单的button按钮),不同的组件有不同的功能(有很多常用的UI组件库 如iView就提供了各种丰富的组件等),组件也可大可小,大的组件代码较多能够完成丰富的功能实现和展示,小的组件也许就是一个简单的标签而已,组件可以嵌套可以组合等等。理解了这些概念之后,就会发现其实所有的页面都可以由多个组件构成,比如导航组件、商品展示组件、购物车组件等等。

在组件化开发中,页面由多个组件构成,那么这么多的组件它们之间自然不会毫无关系,所以在很多文档中用到了父组件子组件等等术语。组件本身就是一个完整的功能模块,组件的内容可以是固定不变的,也可能需要和动态的数据进行绑定,所以这又涉及到组件中数据的传递

现在我们明白了页面中的一切都可以看做是组件,而且组件可大可小,组件可复杂可简单

HTML中的众多标签比如a标签或者是button标签等等的都可以看做是一个个的组件,他们提供对应的功能也能够复用,但是对于复杂的页面应用开发来说这样的层级太小,仅仅使用单个标签无法完整的定义更复杂的功能模块,在以前的开发中我们是把多个不同的标签组合在一起实现一个稍微复杂的功能模块。现在很多优秀的前端框架中都采用组件化的组织方式,核心的东西并没有改变。

我们把在框架中(Vue)中使用的组件称为自定义组件(区别于系统为我们提供的标签),这些自定义组件的本质其实就是把众多标签以一定的方式组合在一起形成一个整体被称为"组件"。我认为组件开发方式最核心的东西还是代码(功能)复用,把复杂的应用切割成一个个小的更容易管理的模块。

二、Vue框架中的组件

Vue框架中的组件和大多数框架中的组件也没有太大的差别,下面简单说明Vue框架中组件的相关使用。

组件的使用主要有两部分构成

① 组件的注册(指定组件的结构和具体内容等等)

② 组件的使用(在页面中使用)

① 全局注册的组件

全局注册的组件其实是把组件相关的信息写到Vue这个构造函数身上,全局组件在任何Vue实例挂载的标签中都能够使用。

//第一个参数:注册的全局组件的名称
//第二个参数:描述组件内容、数据等信息的选项对象
Vue.component("my-component",{
//组件的配置项,包括组件的内容(template) 组件中的数据等...
})

② 局部注册的组件

局部注册的组件其实是把组件相关的信息写到当前指定的这个Vue实例对象(由全局的Vue构造函数创建得到)身上,局部注册的组件只在当前的这个Vue实例对象挂载的标签中能够使用,有使用范围的限制。

var app2 = new Vue({
el:"#TEST-TWO",
components:{
"my-component-two":{
//在app2实例对象中注册的局部组件,组件名称为my-component-two
//组件的内容为:span标签
},
"my-component-three":{
//在app2实例对象中注册的局部组件,组件名称为my-component-three
//组件的内容为:p标签
}
}
})

③ 组件的具体用法

说明:如果是全局注册的组件那么在页面中所有被挂载到Vue实例对象的标签中均可以使用,局部组件只能在注册的Vue实例,挂载的标签中使用,有使用范围的限制

组件的使用方式:在页面中指定位置以标签对的方式表明此处需要用到的是哪个组件。示例:<my-component-global-one></my-component-global-one>

Vue框架中组件的使用示例

    <!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<script src="../../Vue/vue.min.js"></script> </head>
<div id="demo-one">
<!--全局注册的组件在Vue实例对象挂载的标签中都可以使用-->
<my-component-global-01></my-component-global-01>
<my-component-global-02></my-component-global-02>
</div>
<hr>
<div id="demo-two">
<!--全局注册的组件在Vue实例对象挂载的标签中都可以使用-->
<my-component-global-01></my-component-global-01>
<my-component-global-02></my-component-global-02>
</div>
<hr>
<div id="demo-three">
<my-component-part-01></my-component-part-01>
<my-component-part-02></my-component-part-02>
</div> <body>
<script>
//A 全局注册的组件
Vue.component("my-component-global-01",{
//组件的选项对象
template:"<div>我是全局注册的组件 组件名称为my-component-global-01</div>"
}); Vue.component("my-component-global-02",{
//组件的选项对象
template:"<div>我是全局注册的组件 组件名称为my-component-global-02</div>"
}); //B 局部注册的组件
//创建Vue实例化对象
var app1 = new Vue({
el:"#demo-one"
}); var app2 = new Vue({
el:"#demo-two"
}); var app3 = new Vue({
el:"#demo-three",
components:{
"my-component-part-01":{
//组件的选项对象
template:"<div>局部注册的组件 组件名称为my-component-part-01</div>"
},
"my-component-part-02":{
//组件的选项对象
template:"<div>局部注册的组件 组件名称为my-component-part-02</div>"
}
}
})
</script>
</body>
</html>
说明:在设置组件的template内容的时候更常见的用法是,把其vaue值设置为一个选择器,指向模板中的内容(模板可以通过Vue中的template标签或者是script标签来实现)。

三、父子组件

组件和组件之间可以是包含的关系,如果某个组件中包含另外一个组件,那该组件被称为父组件,被包含的组件相对来说则是子组件

下面通过代码简单介绍父子组件的结构,父子组件还有一个很重要的数据传递问题,即父子组件的通信。

   <!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<script src="../../Vue/vue.min.js"></script>
</head>
<body>
<div id="demoID">
<parent></parent>
<child-three></child-three> <!--<child-one></child-one> 因为组件是在parent父组件中注册的,所以此处不能直接使用-->
</div> <script>
//创建两个子组件构造器(分别为child-one和child-two)
var childOne = Vue.extend({
template:"<input type='color'/>"
});
var childTwo = Vue.extend({
template:"<input type='date'/>"
}); //注册父组件(作为child-one和child-two的父组件)
Vue.component("parent",{ //在父组件中注册child-one和child-two两个子组件,外界无法直接获取
components:{
"child-one":childOne,
"child-two":childTwo
},
template:"<div><child-one></child-one><child-two></child-two></div>"
}); //在外部注册组件(需要注意位置关系)
Vue.component("child-three",childTwo); //创建Vue实例对象并挂载到页面
var app = new Vue({
el:"#demoID"
}) </script>
</body>
</html>

前端开发系列050-基础篇之组件的概念和使用(Vue)的更多相关文章

  1. 从0到1用react+antd+redux搭建一个开箱即用的企业级管理后台系列(基础篇)

    背景 ​ 最近因为要做一个新的管理后台项目,新公司大部分是用vue写的,技术栈这块也是想切到react上面来,所以,这次从0到1重新搭建一个react项目架子,需要考虑的东西的很多,包括目录结构.代码 ...

  2. ESP8266开发之旅 基础篇① 走进ESP8266的世界

    授人以鱼不如授人以渔,目的不是为了教会你具体项目开发,而是学会学习的能力.希望大家分享给你周边需要的朋友或者同学,说不定大神成长之路有博哥的奠基石... QQ技术互动交流群:ESP8266&3 ...

  3. 前端开发:css基础知识之盒模型以及浮动布局。

    前端开发:css基础知识之盒模型以及浮动布局 前言 楼主的蛮多朋友最近都在学习html5,他们都会问到同一个问题 浮动是什么东西?  为什么这个浮动没有效果?  这个问题楼主已经回答了n遍.今天则是把 ...

  4. ESP8266开发之旅 基础篇② 如何安装ESP8266的Arduino开发环境

    授人以鱼不如授人以渔,目的不是为了教会你具体项目开发,而是学会学习的能力.希望大家分享给你周边需要的朋友或者同学,说不定大神成长之路有博哥的奠基石... QQ技术互动交流群:ESP8266&3 ...

  5. ESP8266开发之旅 基础篇③ ESP8266与Arduino的开发说明

    授人以鱼不如授人以渔,目的不是为了教会你具体项目开发,而是学会学习的能力.希望大家分享给你周边需要的朋友或者同学,说不定大神成长之路有博哥的奠基石... QQ技术互动交流群:ESP8266&3 ...

  6. openlayers5-webpack 入门开发系列一初探篇(附源码下载)

    前言 openlayers5-webpack 入门开发系列环境知识点了解: node 安装包下载webpack 打包管理工具需要依赖 node 环境,所以 node 安装包必须安装,上面链接是官网下载 ...

  7. leaflet-webpack 入门开发系列一初探篇(附源码下载)

    前言 leaflet-webpack 入门开发系列环境知识点了解: node 安装包下载webpack 打包管理工具需要依赖 node 环境,所以 node 安装包必须安装,上面链接是官网下载地址 w ...

  8. Prism+MaterialDesign+EntityFramework Core+Postgresql WPF开发总结 之 基础篇

    本着每天记录一点成长一点的原则,打算将目前完成的一个WPF项目相关的技术分享出来,供团队学习与总结. 总共分三个部分: 基础篇主要争对C#初学者,巩固C#常用知识点: 中级篇主要争对WPF布局与美化, ...

  9. 【Windows10 IoT开发系列】配置篇

    原文:[Windows10 IoT开发系列]配置篇 Windows10 For IoT是Windows 10家族的一个新星,其针对不同平台拥有不同的版本.而其最重要的一个版本是运行在Raspberry ...

  10. ESP8266开发之旅 基础篇④ ESP8266与EEPROM

    授人以鱼不如授人以渔,目的不是为了教会你具体项目开发,而是学会学习的能力.希望大家分享给你周边需要的朋友或者同学,说不定大神成长之路有博哥的奠基石... QQ技术互动交流群:ESP8266&3 ...

随机推荐

  1. Python科学计算系列2—不等式和不等式组

    1.一元二次不等式求解 例1:求下列不等式的解 代码如下: from sympy import symbols, solve x = symbols('x') f = x ** 2 + x - 6 p ...

  2. [笔记]关于JavaScript定时器如何清除和重启

    定时器的清除和重启方法: // var t=setInterval(fun1,500) //fun1是你的函数 var fun1=function(){ //写入你的函数; } clearInterv ...

  3. .net core项目代码提交忽略文件.gitignore的配置

    根据语言自动生成 1. 访问 .gitignore.io 首先,访问 https://www.gitignore.io/.这是一个非常有用的网站,可以根据你的开发环境自动生成 .gitignore 文 ...

  4. xl2411p 显示器分辨率问题 IPS\TN

    本来是想玩游戏来着,后来也没能玩起: 留下了个显示器明基xl2411p,昨天扒出来用起来吧. 玩游戏没毛病的,毕竟都是图片不存在文字的渲染问题,日常办公用起来就难受了,TN屏真是难受的了. 本来24寸 ...

  5. 企业级分布式MCP方案

    飞书原文档链接地址:https://ik3te1knhq.feishu.cn/wiki/D8kSwC9tFi61CMkRdd8cMxNTnpg 企业级分布式 MCP 方案 背景:现阶段 MCP Cli ...

  6. 重载(Overloading)与重写(Override)的区别?

    重载(Overloading)与重写(Override)的区别? No. 区别 重载 重写 1 英文单词 Overloading Override 2 发生范围 发生在一个类里面 发生在继承关系中 3 ...

  7. 工具 | ApplicationScanner

    0x00 简介 ApplicationScanner是一款APP客户端安全项检测工具. 下载地址: ApplicationScanner下载: ApplicationScanner下载 0x01 功能 ...

  8. 【MOOC】华中科技大学计算机组成原理慕课答案-第六章-中央处理器(一)

    单选 1 一定不属于冯•诺依曼机体系结构必要组成部分的是()(单选) A. CPU B. RAM C. ROM √D. Cache 计算机中的ROM主要是用来存储一些系统信息,或者启动程序BIOS程序 ...

  9. 使用win10 wsl子系统将 rust 程序静态编译为linux可执行文件

    chapter Ⅰ 事情起因 最近在学习rust, 想把一部分java服务迁移至rust编写,但由于公司服务器都是linux系统,所以在找windows下交叉编译为linux可执行文件的方法,把bin ...

  10. 面试官说又逮到一个不会用Git的

    这里这写简要,要看具体的步骤及解释清移步:https://www.bilibili.com/read/cv10510952 如果是自己创建仓库写代码上传(demo是自己仓库的自定义名字): git i ...