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
- 由于网络原因安装
cnpm
npm install -g cnpm --registry=https://registry.npm.taobao.org
- 安装
vue-cli
- cnpm install -g @vue/cli
- 安装
webpack
cnpm install -g webpack
- webpack是JavaScript打包器(module bundler)
使用webpack和browserify等构件工具
总结
- 第12节 组件基础
- 什么是组件?
- 为什么需要封装组件?
- 怎样创建一个组件?
- 怎样监听组件事件?
- 第13节 组件注册
- 组件如何命名?
- 怎样全局注册组件?
- 怎样局部注册组件?
- 第14节 单文件组件
- 全局组件和局部组件的缺点有哪些?
- 怎么解决这些问题呢?需要哪些准备工作?