【vue】组件化

基本使用(全局组件):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
// 1. 创建组件构造器对象
const cpnC = Vue.extend({
template: `
<div>
<h2>我是标题</h2>
<p>我是内容111111111</p>
<p>我是内容222222222</p>
</div>
`
})

// 2. 注册组件 (全局组件) (使用的标签名, 构造器的名字)
Vue.component('my-cpn', cpnC);

<!-- 3. 使用组件 多次使用 -->
<my-cpn></my-cpn>
<my-cpn></my-cpn>

组件的全局组件和局部组件:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
const app = new Vue({
el: '#app',
data: {
message: '你好啊'
},
//2. 注册组件(局部组件) 只能在app实例中使用,app2中不可以使用
components:{
// 标签名: 组件构造器名
mycpn: cpnC
}
})
const app2 = new Vue({
el: '#app2'
})

父组件和子组件:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
// 创建第一个组件 (第二个组件的子组件)
const cpnC1 = Vue.extend({
template: `
<div>
<h2>我是标题1</h2>
<p>我是内容1</p>
</div>
`
})
// 创建第二个组件 (第一个组件的父组件)
const cpnC2 = Vue.extend({
template: `
<div>
<h2>我是标题2</h2>
<p>我是内容2</p>
<cpn1></cpn1>
</div>
`,
components:{
cpn1: cpnC1
}
})
// root组件(第二个组件的父组件)
const app = new Vue({
el: '#app',
data: {
message: '你好啊'
},
components: {
cpn2: cpnC2
}
})

组件的简写组件:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
// 省略了 Vue.extend({})
// 全局组件(简便语法)
Vue.component('cpn2', {
template: `
<div>
<h2>我是标题2</h2>
<p>我是内容2</p>
</div>
`
})

const app = new Vue({
el: '#app',
data: {
message: '你好啊'
},
// 局部组件(简便语法)
components: {
cpn1: {
template: `
<div>
<h2>我是标题1</h2>
<p>我是内容1</p>
</div>
`
}
}
})

组件模板的分离写法:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
<!-- 1.script标签写法 -->
创建 -> 注册 -> 使用
<script type="text/x-template" id="cpn1">
<div>
<h2>{{title}}</h2>
<p>我是内容1</p>
</div>
</script>

Vue.component('cpn1', {
template: '#cpn1',
data(){
return {
title: '我是标题111'
}
}
})
<cpn1></cpn1>

----------------------------------------------------------

<!-- 2.template 标签写法 -->
创建 -> 注册 -> 使用
<template id="cpn2">
<div>
<h2>我是标题2</h2>
<p>我是内容2</p>
</div>
</template>

Vue.component('cpn2', {
template: '#cpn2'
})

<cpn2></cpn2>

组件中的数据存放(存放在data方法的返回值,对象中):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<template id="cpn1">
<div>
<h2>{{title}}</h2>
<p>{{cont}}</p>
</div>
</template>

Vue.component('cpn1', {
template: '#cpn1',
data(){
return {
title: '我是标题111',
cont: '我是内容111'
}
}
})

<cpn1></cpn1>

为什么组件中的data是一个方法?
多次使用的组件不会共用一个data,因为data是一个方法,多次使用组件会多次调用data方法,每一次调用组件所用的数据是每一次调用data方法返回的对象数据。