模块就是向外提供特定功能的 js 程序, 一般就是一个 js 文件。模块编写的作用为复用 js、简化 js 的编写、提高 js 运行效率。
组件用来实现局部(特定)功能效果的代码集合 (html/css/js/image…) ,可以起到复用编码、简化项目编码、提高运行效率的作用。
组件的出现,就是为了拆分Vue实例的代码量的,能够让我们以不同的组件,来划分不同的功能模块,将来我们需要什么样的功能,就可以去调用对应的组件即可。
模块化: 是从代码逻辑的角度进行划分的;方便代码分层开发,保证每个功能模块的职能单一;当应用中的 js 都以模块来编写的, 那这个应用就是一个模块化的应用。
组件化: 是从UI界面的角度进行划分的;前端的组件化,方便UI组件的重用;当应用中的功能都是多组件的方式来编写的, 那这个应用就是一个组件化的应用。
非单文件组件就是一个文件中有多个组件,实际上就是 html 文件。
特点 :
使用步骤:
1、定义组件(创建组件)
使用 Vue.extend(options) 创建,其中 options 和 new Vue(options) 时传入的那个options 几乎一样,但也有点区别。
区别如下:
el 不要写,因为最终所有的组件都要经过一个 vm 的管理,由 vm 中的 el 决定服务哪个容器。
data 必须写成函数,避免组件被复用时,数据存在引用关系。
备注:使用template可以配置组件结构。
2、注册组件
Vue.component('组件名',组件)
3、使用组件(写组件标签)
<school>school>
DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<script src="./lib/vue-2.4.0.js">script>
<title>Documenttitle>
<style>
style>
head>
<body>
<div id="app">
<school>school>
<student>student>
div>
<script>
Vue.config.productionTip = false;
// 编写组件
const school = Vue.extend({
template:`
学校名称 : {{schoolName}}
学校地址 : {{address}}
`,
data() {
return {
schoolName:'qdu',
address:'qingdao'
}
},
methods: {
showName() {
alert(this.schoolName)
}
}
})
const student = Vue.extend({
template:`
学生姓名:{{studentName}}
学生年龄:{{age}}
`,
data() {
return {
studentName:'小伟',
age:18
}
}
});
// 全局注册组件
Vue.component('school', school);
Vue.component('student', student);
var vm = new Vue({
el:'#app',
// 局部注册组件
components:{
school,
student
}
})
script>
body>
html>
注意
关于组件名:
一个单词组成
第一种写法(首字母小写):school
第二种写法(首字母大写):School
多个单词组成:
第一种写法(kebab-case命名):my-school
第二种写法(CamelCase命名):MySchool (需要Vue脚手架支持)
备注:
(1) 组件名尽可能回避 HTML 中已有的元素名称,例如:h2、H2 都不行。
(2) 可以使用 name 配置项指定组件在开发者工具中呈现的名字。
关于组件标签:
school>
备注:不用使用脚手架时,会导致后续组件不能渲染。
一个简写方式:
const school = Vue.extend(options) 可简写为:const school = options
组件的嵌套
DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<script src="./lib/vue-2.4.0.js">script>
<title>Documenttitle>
<style>
style>
head>
<body>
<div id="app">
<app>app>
div>
<script>
Vue.config.productionTip = false;
const student = Vue.extend({
template:`
学生姓名:{{studentName}}
学生年龄:{{age}}
`,
data() {
return {
studentName:'小伟',
age:18
}
}
});
const school = Vue.extend({
template:`
学校名称 : {{schoolName}}
学校地址 : {{address}}
`,
data() {
return {
schoolName:'qdu',
address:'qingdao'
}
},
methods: {
showName() {
alert(this.schoolName)
}
},
components:{
student
}
})
const app = Vue.extend({
template:`
`,
components:{
school
}
})
var vm = new Vue({
el:'#app',
// 局部注册组件
components:{
app
}
})
script>
body>
html>
VueComponent
school 组件本质是一个名为 VueComponent 的构造函数,且不是程序员定义的,是 Vue.extend 生成的。
我们只需要写
或
,Vue 解析时会帮我们创建 school 组件的实例对象,即 Vue 帮我们执行 new VueComponent(options)
。
注意:每次调用Vue.extend,返回的都是一个全新 VueComponent
关于 this 指向
(1) 组件配置中:
data 函数、methods 中的函数、watch 中的函数、computed 中的函数,它们的this均是 VueComponent 实例对象。
(2) new Vue(options) 配置中:
data 函数、methods 中的函数、watch 中的函数、computed 中的函数 它们的this 均是 Vue 实例对象。
VueComponent 的实例对象,以后简称 vc (也可称之为:组件实例对象)。
Vue 的实例对象,以后简称 vm。
注:
VueComponent.prototype.proto === Vue.prototype 这个内置关系让组件实例对象(vc)可以访问到 Vue 原型上的属性、方法。
单文件组件就是一个文件扩展名为 .vue 的 single-file components (单文件组件)的文件。是 Vue.js 自定义的一种文件格式,一个 .vue 文件就是一个单独的组件,在文件内封装了组件相关的代码:html、css、js 并且还可以使用 webpack 或 Browserify 等构建工具。
优点:
在 Vue 项目中,我们使用 Vue.component 来定义全局组件,紧接着用 new Vue({ el: '#container '})
在每个页面内指定一个容器元素。这种方式在很多中小规模的项目中运作的很好,在这些项目里 JavaScript 只被用来加强特定的视图。但当在更复杂的项目中,或者你的前端完全由 JavaScript 驱动的时候,下面这些缺点将变得非常明显:
\
文件扩展名为 .vue 的 single-file components (单文件组件) 为以上所有问题提供了解决方法,并且还可以使用 webpack 或 Browserify 等构建工具。
一个 .vue文件的组成
1. 模板页面
<template> 页面模板 template>
2. JS 模块对象
<script>
export default {
data() {return {}},
methods: {},
computed: {},
components: {}
}
script>
3. 样式
<style>
样式定义
style>
基本使用
1.引入组件
Student.vue
<template>
<div>
<h2>学生姓名: {{name}}h2>
<h2>学生年龄: {{age}}h2>
div>
template>
<script>
export default {
name:'qduStu',
age:18
}
script>
School.vue
<template>
<div class="demo">
<h2>学校姓名: {{name}}h2>
<h2>学校地址: {{address}}h2>
div>
template>
<script>
export default {
data() {
return {
name:'qdu',
address:'qingdao'
}
}
}
script>
<style>
.demo {
background-color: orange;
}
style>
<template>
<div>
<School>School>
<Student>Student>
div>
template>
<script>
import School from './School'
import Student from './Student'
export default {
name:'app',
components:{
School,
Student
}
}
script>
2.映射成标签
main.js
import app from './App.vue'
new Vue({
el:'#app',
components:{app},
})
3.使用组件标签
.html
DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Documenttitle>
head>
<body>
<div id="app">
<app>app>
div>
<script src="./lib/vue-2.4.0.js">script>
<script src="./App.vue">script>
body>
html>
注意:浏览器不会识别此处语法,需要放在手脚架中去执行这些代码