layout: post title: “Vue.js组件” date: 2019-11-05 10:26:40
tags:
Vue.js官方教程上的Vue组件相关内容
第12节 组件基础
基本示例
- 组件是可复用的 Vue 实例,把经常重复的功能封装成组件,达到快捷开发的目的(就相当于自定义标签)
 - 创建组件语法格式:
Vue.component(组件名称,{以对象的形式描述组件}) - 因为组件是可复用的 Vue 实例,所以它们与 new Vue 接收相同的选项,例如data、computed、watch、methods以及生命周期钩子等,仅有的例外是el这样根实例特有的选项
 - html示例
    
<div id="components-demo"> <!--4采用html标签的形式对组件进行调用,标签的名称就是组件的名称--> <button-counter title="title1;"></button-counter> <!--组件是可以复用的--> <button-counter title="title2;"></button-counter> </div> - js示例
    
<script type="text/javascript"> // 1定义一个名为 button-counter 的新组件,描述了组件的数据和模板内容 Vue.component('button-counter', { // 2通过props为组件定义属性 props:['title'], data: function() { return { count: 0 } }, // 3创建一个模板时需注意,一个组件的模板必须具备一个根节点 // 绑定一个点击事件 template: '<div><h1>h1...</h1><button v-on:click="count++">{ {title} } You clicked me { { count } } times.</button></div>' }) // 5实例化一个Vue对象 var vm = new Vue({ el:"#components-demo", data:{ } }); </script> 
监听子组件事件
- html示例
    
<div id="components-demo"> <!--5. 在组件的父级可以通过事件绑定的方式去接收到emit函数所触发的事件--> <button-counter title="title1;" @clicknow="clicknow"> <!--8. 在组件的标签内部可以插入一些自定义的html内容--> <h2>h2...</h2> </button-counter> </div> - js示例
    
<script type="text/javascript"> Vue.component('button-counter', { props:['title'], data: function() { return { count: 0 } }, // 7. 在模板内我们可以通过slot标签声明一个组件的插槽,通过插槽可以插入任意的html内容及标签 // 1. 把click++改成一个可执行的JavaScript函数 template: '<div><h1>h1...</h1><button v-on:click="clickfun">{ {title} } You clicked me { { count } } times.</button><slot></slot></div>', // 2. 使用methods属性去声明对应的函数 methods:{ clickfun:function(){ // 3. 在函数内部使用this对象对click变量进行处理,点击button按钮,count+1 this.count++; // 4. 使用this对象的emit方法去触发一个事件 // 语法格式:this.$emit(事件名称,可携带的一些参数); this.$emit('clicknow',this.count); } } }) var vm = new Vue({ el:"#components-demo", data:{ }, // 6. 在页面上使用methods属性去声明clicknow方法 methods:{ // 函数能够正确执行,并可以接收组件内部传递出来的count数据的值 clicknow:function(e){ console.log(e); } } }); </script> 
流程
- 定义一个名为 button-counter 的新组件,描述了组件的数据和模板内容
 - 通过props为组件定义属性
 - 创建一个模板绑定一个点击事件
 - 采用html标签的形式对组件进行调用,标签的名称就是组件的名称
 - 实例化一个Vue对象
 - 把click++改成一个可执行的JavaScript函数
 - 使用methods属性去声明对应的函数
 - 在函数内部使用this对象对click变量进行处理,点击button按钮,count+1
 - 使用this对象的emit方法去触发一个事件
 - 在组件的父级可以通过事件绑定的方式去接收到emit函数所触发的事件
 - 在页面上使用methods属性去声明clicknow方法
 - 在模板内我们可以通过slot标签声明一个组件的插槽,通过插槽可以插入任意的html内容及标签
 - 在组件的标签内部可以插入一些自定义的html内容
 
第13节 组件注册
组件名
- 使用 kebab-case:
Vue.component('my-component-name', { /* ... */ }) - 使用 PascalCase:
Vue.component('MyComponentName', { /* ... */ }) - 直接在 DOM (即非字符串的模板) 中使用时只有
kebab-case是有效的。 
全局注册
- 注册之后可以用在任何新创建的 Vue 根实例 (new Vue) 的模板中
 - 示例
    
// 全局注册button-counter组件 Vue.component('button-counter',{ props:['title'], data:function(){ return{} }, template:'<div><h1>hi...</h1></div>', methods:{ } }) 
局部注册
- 全局注册浪费空间
 - 示例
    
// 局部注册 var vm = new Vue({ el:"#app", data:{ }, methods:{ clicknow:function(e){ console.log(e); } }, // 创建Vue对象的时候,在Vue对象的一个参数,这个参数是对象形式的,在对象内声明一个components属性,在它的内部进行局部注册组件 // 对于components对象中的每个属性来说,其属性名就是自定义元素的名字,其属性值就是这个组件的选项对象。 components:{ test:{ // 把test组件声明成对象的形式,使用template属性进行模板的赋值 template:"<h2>h2...</h2>" // 使用methods去声明组件的方法,使用data声明局部组件的数据 } } }); - 注意局部注册的组件在其子组件中不可用。
 
模块注册
第14节 单文件组件
非模块组件的缺点
- 全局定义 (Global definitions)强制要求每个 component 中的命名不得重复
 - 字符串模板 (String templates)缺乏语法高亮,在 HTML 有多行的时候,需要用到丑陋的 \
 - 不支持 CSS (No CSS support)意味着当 HTML 和 JavaScript 组件化时,CSS 明显被遗漏
 - 没有构建步骤 (No build step)限制只能使用 HTML 和 ES5 JavaScript, 而不能使用预处理器,如 Pug (formerly Jade) 和 Babel
 
使用Vue.js的单文件组件准备工作
- 安装
npm:- npm全称为Node Pakeage Manager,是一个基于Node.js的包管理器,也是整个Node.js社区最流行、支持的第三方模块最多的包管理器
 - 通过安装Node.js就可以完成npm的安装
 npm -v
 - 由于网络原因安装
cnpmnpm install -g cnpm --registry=https://registry.npm.taobao.org
 - 安装
vue-cli- cnpm install -g @vue/cli
 
 - 安装
webpackcnpm install -g webpack- webpack是JavaScript打包器(module bundler)
 
 
使用webpack和browserify等构件工具
总结
- 第12节 组件基础
    
- 什么是组件?
 - 为什么需要封装组件?
 - 怎样创建一个组件?
 - 怎样监听组件事件?
 
 - 第13节 组件注册
    
- 组件如何命名?
 - 怎样全局注册组件?
 - 怎样局部注册组件?
 
 - 第14节 单文件组件
    
- 全局组件和局部组件的缺点有哪些?
 - 怎么解决这些问题呢?需要哪些准备工作?