Vue组件化编程
1 对组件的理解
2 非单文件组件
2.1 基本使用
2.2 几个注意点
2.3 组件的嵌套
2.4 VueComponent构造函数
2.5 一个重要的内置关系
3 单文件组件
1 对组件的理解
组件:实现应用中局部功能代码和资源的集合。
优点:文件好维护;依赖关系不混乱;复用率高。
模块与组件: (1.1)模块理解:向外提供特定功能的 js 程序, 一般就是一个 js 文件 (1.2)使用模块原因:js 文件很多很复杂 (1.3)模块作用:复用 js, 简化 js 的编写, 提高 js 运行效率 (2.1)组件理解:用来实现局部(特定)功能效果的代码集合(html/css/js/image……) (2.2)使用组件原因:一个界面的功能很复杂 (2.3)组件作用:复用编码, 简化项目编码, 提高运行效率
模块化与组件化: (1)当应用中的 js 都以模块来编写的, 那这个应用就是一个模块化的应用。 (2)当应用中的功能都是多组件的方式来编写的, 那这个应用就是一个组件化的应用。
2 非单文件组件
定义:一个文件中包含有n个组件
2.1 基本使用
Vue中使用组件的三大步骤: 1> 定义组件(创建组件) 2> 注册组件 3> 使用组件(写组件标签)
如何定义一个组件? 1> 使用Vue.extend(options)
创建,其中options和new Vue(options)时传入的那个options几乎一样,但也有点区别; 2>区别如下: ① el不要写,为什么? ——— 最终所有的组件都要经过一个vm的管理,由vm中的el决定服务哪个容器。 ② data必须写成函数,为什么? ———— 避免组件被复用时,数据存在引用关系。 3> 备注:使用template可以配置组件结构。
如何注册组件? 1> 局部注册:靠new Vue的时候传入components选项 2> 全局注册:靠Vue.component('组件名',组件)
编写组件标签:
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> 基本使用 title>
< script src = " ../JS/vue.js" > script>
head>
< body>
< div id = " root" >
< hello> hello>
< hr/>
< school> school>
< hr/>
< student> student>
div>
< div id = " root2" >
< hello> hello>
div>
body>
< script>
Vue. config. productionTip = false
const school = Vue. extend ( {
template : `
学校名称:{{schoolName}}
学校地址:{{address}}
点我提示学校名
` ,
data ( ) {
return {
schoolName : '霍格沃茨魔法学院' ,
address : '苏格兰高地'
}
} ,
methods : {
showName ( ) {
alert ( this . schoolName)
}
}
} )
const student = Vue. extend ( {
template : `
学生姓名:{{studentName}}
学生年龄:{{age}}
` ,
data ( ) {
return {
studentName : '小王' ,
age : 18
}
}
} )
const hello = Vue. extend ( {
template : `
你好啊!{{name}}
` ,
data ( ) {
return {
name : 'Tom'
}
}
} )
Vue. component ( 'hello' , hello)
new Vue ( {
el : '#root' ,
components : {
school,
student
}
} )
new Vue ( {
el : '#root2' ,
} )
script>
html>
2.2 几个注意点
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> 几个注意点 title>
< script src = " ../JS/vue.js" > script>
head>
< body>
< div id = " root" >
< h1> {{msg}} h1>
< school> school>
div>
body>
< script>
Vue. config. productionTip = false
const school = Vue. extend ( {
name : 'xuexiao' ,
template : `
学校名字:{{schoolName}}
学校地址:{{address}}
` ,
data ( ) {
return {
schoolName : '霍格沃兹魔法学院' ,
address : '苏格兰高地'
}
}
} )
new Vue ( {
el : '#root' ,
data : {
msg : '欢迎学习Vue!'
} ,
components : {
school
}
} )
script>
html>
2.3 组件的嵌套
app为一人(vm)之下,万人(所有其他组件)之上
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> 组件的嵌套 title>
< script src = " ../JS/vue.js" > script>
head>
< body>
< div id = " root" >
div>
body>
< script>
Vue. config. productionTip = false
const student = Vue. extend ( {
template : `
学生姓名:{{name}}
学生年龄:{{age}}
` ,
data ( ) {
return {
name : '小王' ,
age : 18
}
}
} )
const school = Vue. extend ( {
template : `
学校名字:{{name}}
学校地址:{{address}}
` ,
data ( ) {
return {
name : '霍格沃兹魔法学院' ,
address : '苏格兰高地'
}
} ,
components : {
student
}
} )
const hello = Vue. extend ( {
template : `
{{msg}}
` ,
data ( ) {
return {
msg : '欢迎来到小王的博客!'
}
}
} )
const app = Vue. extend ( {
template : `
` ,
components : {
school,
hello
}
} )
new Vue ( {
template : `
` ,
el : '#root' ,
components : {
app
}
} )
script>
html>
2.4 VueComponent构造函数
school组件本质是一个名为VueComponent
的构造函数,且不是程序员定义的,是Vue.extend
生成的。
我们只需要写
或
,Vue解析时会帮我们创建school组件的实例对象,即Vue帮我们执行的:new VueComponent(options)
。
特别注意:每次调用Vue.extend
,返回的都是一个全新的VueComponent
!
关于this指向: 1> 组件配置中:data函数、methods中的函数、watch中的函数、computed中的函数,它们的this均是VueComponent实例对象(vc) 。 2> new Vue(options)
配置中:data函数、methods中的函数、watch中的函数、computed中的函数,它们的this均是Vue实例对象(vm) 。
VueComponent
的实例对象,以后简称vc(也可称之为:组件实例对象)。 Vue
的实例对象,以后简称vm。
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> VueComponent title>
< script src = " ../JS/vue.js" > script>
head>
< body>
< div id = " root" >
< school> school>
< hello> hello>
div>
body>
< script>
Vue. config. productionTip = false
const school = Vue. extend ( {
template : `
学校名字:{{name}}
学校地址:{{address}}
点我提示学校名
` ,
data ( ) {
return {
name : '霍格沃兹魔法学院' ,
address : '苏格兰高地'
}
} ,
methods : {
showName ( ) {
console. log ( 'showName' , this )
}
}
} )
const test = Vue. extend ( {
template : ` atguigu `
} )
const hello = Vue. extend ( {
template : `
{{msg}}
` ,
data ( ) {
return {
msg : '你好啊!'
}
} ,
components : { test}
} )
const vm = new Vue ( {
el : '#root' ,
components : {
school,
hello
}
} )
script>
html>
2.5 一个重要的内置关系
一个重要的内置关系:VueComponent.prototype.__proto__ === Vue.prototype
为什么要有这个关系:让组件实例对象(vc)可以访问到 Vue原型上的属性、方法。
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> 一个重要的内置关系 title>
< script src = " ../JS/vue.js" > script>
head>
< body>
< div id = " root" >
< school> school>
div>
body>
< script>
Vue. config. productionTip = false
Vue . prototype. x = 99
const school = Vue. extend ( {
template : `
学校名字:{{name}}
学校地址:{{address}}
点我输出x
` ,
data ( ) {
return {
name : '霍格沃兹魔法学院' ,
address : '苏格兰高地'
}
} ,
methods : {
showX ( ) {
console. log ( this . x) ;
}
}
} )
const vm = new Vue ( {
el : '#root' ,
data : {
msg : '你好'
} ,
components : {
school
}
} )
script>
html>
3 单文件组件
定义:一个文件中只包含有一个组件。
快捷键:输入< + v
再按Enter
School.vue:
学校名字:{{name}}
学校地址:{{address}}
点我提示学校名
学生姓名:{{name}}
学生年龄:{{age}}
import App from './App.vue' // 引入App.vue
// 创建vm
new Vue ({
el:'#root',
template:` `, // 此处写了 index.html容器中就不需要再写
components:{
App
}
})
练习一下单文件组件的语法