vue组件化
1、什么是组件化?
2、vue的组件化思想
3、注册组件的基本步骤
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
</head>
<body>
<div id="app">
<my-cpn></my-cpn>
<my-cpn></my-cpn>
<my-cpn></my-cpn>
</div>
<script src="../js/vue.js"></script>
<script>
// 1、创建组件构造器
const cpnC = Vue.extend({
template: `
<div>
<h1>标题</h1>
<h2>内容</h2>
<h2>内容</h2>
<hr></hr>
</div>
`
})
// 2、注册组件
Vue.component('my-cpn',cpnC);
const app = new Vue({
el: '#app',
data: {
message:'你好'
},
methods: {
}
});
</script>
</body>
</html>
4、注册组件步骤解析
5、全局组件与局部组件
5.1、全局组件
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
</head>
<body>
<div id="app">
<cpn></cpn>
<cpn></cpn>
<cpn></cpn>
</div>
<div id="app2">
<cpn></cpn>
</div>
<script src="../js/vue.js"></script>
<script>
// 1、创建组件构造器
const cpnC = Vue.extend({
template:`
<div>
<h1>标题</h1>
<p>内容</p>
</div>
`
})
//2、注册组件(全局组件,意味着可以在多个vue的实例下使用)
Vue.component('cpn',cpnC)
const app = new Vue({
el: '#app',
data: {
message:'你好'
},
methods: {
}
});
const app2 = new Vue({
el: '#app2',
data: {
message:'你好'
},
methods: {
}
});
</script>
</body>
</html>
5.2、局部组件
6、父组件与子组件
6.1、父子组件的写法
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
</head>
<body>
<div id="app">
<cpn2></cpn2>
</div>
<script src="../js/vue.js"></script>
<script>
// 1、创建子组件
const cpnC1 = Vue.extend({
template: `
<div>
<h1>标题1</h1>
<p>子组件1内容</p>
</div>
`
})
// 1、创建父组件
const cpnC2 = Vue.extend({
template:`
<div>
<h1>标题2</h1>
<p>子组件2内容</p>
<cpn1></cpn1>
</div>
`,
components: {
cpn1: cpnC1
}
})
const app = new Vue({
el: '#app',
data: {
message:'你好'
},
methods: {
},
components:{
cpn2: cpnC2
}
});
</script>
</body>
</html>
6.2、父子组件的错误用法
6.3、注册组件的语法糖写法
- 注册全局组件语法糖写法
- 注册局部组件语法糖写法
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
</head>
<body>
<div id="app">
<cpn1></cpn1>
<cpn2></cpn2>
</div>
<script src="../js/vue.js"></script>
<script>
// 全局组件注册的语法糖写法
// 1、创建组件构造器
// const cpn1 = Vue.extend();
// 2、注册全局组件语法糖写法
Vue.component('cpn1',{
template: `
<div>
<h1>标题(全局组件)</h1>
<h1>内容(全局组件)</h1>
</div>
`
})
const app = new Vue({
el: '#app',
data: {
message:'你好'
},
methods: {
},
// 注册局部组件语法糖写法
components: {
cpn2: {
template: `
<div>
<h1>标题(局部组件)</h1>
<h1>内容(局部组件)</h1>
</div>
`
}
}
});
</script>
</body>
</html>
7、组件模板抽离的两种写法
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
</head>
<body>
<div id="app">
<cpn1></cpn1>
</div>
<!-- 1、将模板代码写到script标签中 -->
<!-- <script type="text/x-template" id="cpnC1">
<div>
<h1>标题</h1>
<p>内容</p>
</div>
</script> -->
<!-- 2、写道template标签中 -->
<template id="cpnC1">
<div>
<h1>标题</h1>
<p>内容</p>
</div>
</template>
<script src="../js/vue.js"></script>
<script>
// 注册组件
Vue.component('cpn1',{
template: '#cpnC1'
})
const app = new Vue({
el: '#app',
data: {
message:'你好'
},
methods: {
}
});
</script>
</body>
</html>
8、组件可以访问vue实例吗
9、组件数据的存放
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
</head>
<body>
<div id="app">
<cpn1></cpn1>
</div>
<!-- 1、将模板代码写到script标签中 -->
<!-- <script type="text/x-template" id="cpnC1">
<div>
<h1>标题</h1>
<p>内容</p>
</div>
</script> -->
<!-- 2、写道template标签中 -->
<template id="cpnC1">
<div>
<h1>{{title}}</h1>
<p>内容</p>
</div>
</template>
<script src="../js/vue.js"></script>
<script>
// 注册组件
Vue.component('cpn1',{
template: '#cpnC1',
data(){
return {
title: 'abc'
}
}
})
const app = new Vue({
el: '#app',
data: {
message:'你好'
},
methods: {
}
});
</script>
</body>
</html>
10、为什么组件data必须是函数
10.1、不是函数的情况
组件data不是函数的情况,代码如下。当点击了页面任何一个按钮,其他两个组件也会受到影响。
当data不是函数时:
可以看如下函数的创建过程:
10.2、是函数的情况
data是函数的情况,点击按钮时,只会影响该组加,不会影响其他区组件。
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
</head>
<body>
<div id="app">
<cpn></cpn>
<cpn></cpn>
<cpn></cpn>
</div>
<template id="cpn1">
<div>
<h1>计数器:{{counter}}</h1>
<button @click="increment">+</button>
<button @click="decrement">-</button>
</div>
</template>
<script src="../js/vue.js"></script>
<script>
// const obj = {
// counter:0
// }
Vue.component('cpn',{
template: '#cpn1',
data(){
return {
counter: 0
}
},
// data(){
// return obj
// },
methods: {
increment(){
this.counter++
},
decrement(){
this.counter--
}
}
})
const app = new Vue({
el: '#app',
data: {
message:'你好'
},
methods: {
}
});
</script>
</body>
</html>