本文是早期学习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. CocoaPods+Gitee 制作私有库过程以及错误总结

    前言 最近由于要做组件化,所以就顺便看了看私有库的制作,整体上制作的过程是比较简单的,但有一些点你注意到的话会在制作过程会少去很多的麻烦,在网上搜的制作过程的文章是一大把,但当你真的遇到一些问题的时候 ...

  2. Spring的基础结构和核心接口

    目录 1.BeanDefinition 2.BeanDefinitionReader 3.BeanDefinitionRegistry 4.BeanFactory 5.ApplicationConte ...

  3. zookeeper选主机制

    Zookeeper选主机制 一.Server工作状态 每个Server在工作过程中有四种状态: LOOKING:竞选状态,当前Server不知道leader是谁,正在搜寻. LEADING:领导者状态 ...

  4. EFCore Study(番外1)——单向导航属性

    一.单向导航属性场景 1.比如公司OA系统有很多相关的审批流程,比如离职(Leave).请假(relex).加班,每个流程都有多级审批人,每个审批人都是User 一个人(User)--多个审批流程的多 ...

  5. 1K star!这个开源项目让短信集成简单到离谱,开发效率直接翻倍!

    嗨,大家好,我是小华同学,关注我们获得"最新.最全.最优质"开源项目和高效工作学习方法 "让简单的事情回归简单的本质" -- SMS4J 项目宣言 SMS4J ...

  6. SpringBoot项目创建的三种方式

    目录 1 通过官网创建 2 通过IDEA脚手架创建 2.1 IDEA新建项目 2.2 起Group名字,选择Java版本,点击Next 2.3 选择Web依赖,选择Spring Web,确认Sprin ...

  7. P10856 【MX-X2-T5】「Cfz Round 4」Xor-Forces题解

    题意: 给定一个长度为 \(n=2^k\) 的数组 \(a\),下标从 \(0\) 开始,维护 \(m\) 次操作: 给定 \(x\),设数列 \(a'\) 满足 \(a'_i=a_{i\oplus ...

  8. dashboard部署

    1.下载dashboard资源请单 wget  https://raw.githubusercontent.com/kubernetes/dashboard/v1.10.1/src/deploy/re ...

  9. C语言一点五编程实战:纯 C 的模块化×继承×多态框架

    本文将大量涉及C语言高级操作,如函数指针.结构体指针.二级指针.指针频繁引用解引用.typedef.static.inline和C语言项目结构等知识,请确保自己不会被上述知识冲击,如果没有这顾虑,请尽 ...

  10. Flutter视频压缩技术:如何在应用中优化视频文件的质量和大小?

    @charset "UTF-8"; .markdown-body { line-height: 1.75; font-weight: 400; font-size: 15px; o ...