1 <!DOCTYPE html>
2 <html lang="en">
3 <head>
4 <meta charset="UTF-8">
5 <title>非单文件组件</title>
6 <script src="js/vue.js"></script>
7 </head>
8 <body>
9 <!--
10 Vue中使用组件的三大步骤:
11 一、定义组件(创建组件)
12 二、注册组件
13 三、使用组件(写组件标签)
14 一、如何定义一个组件?
15 使用Vue.extend(options)创建,其中options和new Vue(options)时传入的那个options几乎一样,但也有点区别;
16 区别如下:
17 1.el不要写,为什么? ——— 最终所有的组件都要经过一个vm的管理,由vm中的el决定服务哪个容器。
18 2.data必须写成函数,为什么? ———— 避免组件被复用时,数据存在引用关系。
19 备注:使用template可以配置组件结构。
20 二、如何注册组件?
21 1.局部注册:靠new Vue的时候传入components选项
22 2.全局注册:靠Vue.component('组件名',组件)
23 三、编写组件标签:
24 <school></school>
25 -->
26 <!--
27 几个注意点:
28 1.关于组件名:
29 一个单词组成:
30 第一种写法(首字母小写):school
31 第二种写法(首字母大写):School
32 多个单词组成:
33 第一种写法(kebab-case命名):my-school
34 第二种写法(CamelCase命名):MySchool (需要Vue脚手架支持)
35 备注:
36 (1).组件名尽可能回避HTML中已有的元素名称,例如:h2、H2都不行。
37 (2).可以使用name配置项指定组件在开发者工具中呈现的名字。
38 2.关于组件标签:
39 第一种写法:<school></school>
40 第二种写法:<school/>
41 备注:不用使用脚手架时,<school/>会导致后续组件不能渲染。
42 3.一个简写方式:
43 const school = Vue.extend(options) 可简写为:const school = options
44 -->
45 <div id="root">
46 <hello></hello>
47 <hr>
48 <h1>{{msg}}</h1>
49 <!-- 第三步:编写组件标签 -->
50 <school></school>
51 <hr>
52 <!-- 第三步:编写组件标签 -->
53 <student></student>
54 </div>
55 </body>
56 <script type="text/javascript">
57
58 // 第一步:创建school组件
59 const school = Vue.extend({
60 template:`
61 <div>
62 <h2>学校名称:{{schoolName}}</h2>
63 <h2>学校地址:{{address}}</h2>
64 <button @click="showName">点我提示学校名</button>
65 </div>
66 `,
67 data(){
68 return{
69 schoolName:"京东",
70 address:"北京"
71 }
72 },
73 methods:{
74 showName(){
75 alert(this.schoolName)
76 }
77 }
78 })
79 // 第一步:创建student组件
80 const student = Vue.extend({
81 template:`
82 <div>
83 <h2>学生姓名:{{studentName}}</h2>
84 <h2>学生年龄:{{age}}</h2>
85 </div>
86 `,
87 data(){
88 return{
89 studentName:"张三",
90 age:18
91 }
92 }
93 })
94
95 //第一步:创建hello组件
96 const hello = Vue.extend({
97 template:`
98 <div>
99 <h2>你好啊!{{name}}</h2>
100 </div>
101 `,
102 data(){
103 return {
104 name:'Tom'
105 }
106 }
107 })
108
109 Vue.component('hello',hello)
110
111 new Vue({
112 el:'#root',
113 data: {
114 msg:'你好啊!'
115 },
116 //第二步:注册组件(局部注册)
117 components:{
118 school,
119 student
120 }
121 })
122 </script>
123 </html>
1 <!DOCTYPE html>
2 <html lang="en">
3 <head>
4 <meta charset="UTF-8">
5 <title>非单文件组件2</title>
6 <script src="js/vue.js"></script>
7 </head>
8 <body>
9 <div id="root">
10 <h1>{{msg}}</h1>
11 <app></app>
12 </div>
13 </body>
14 <script type="text/javascript">
15 const student = Vue.extend({
16 template:`
17 <div>
18 <h2>学生姓名:{{name}}</h2>
19 <h2>学生年龄:{{age}}</h2>
20 </div>
21 `,
22 data(){
23 return{
24 name:"张三",
25 age:18
26 }
27 }
28 })
29
30 const school = Vue.extend({
31 template: `
32 <div>
33 <h2>学校名称:{{name}}</h2>
34 <h2>学校地址:{{address}}</h2>
35 <student></student>
36 </div>
37 `,
38 data(){
39 return{
40 name:"京东",
41 address:"北京"
42 }
43 },
44 components:{
45 student
46 }
47 })
48
49 //定义hello组件
50 const hello = Vue.extend({
51 template:`<h1>{{msg}}</h1>`,
52 data(){
53 return {
54 msg:'欢迎来到京东学习!'
55 }
56 }
57 })
58
59 //定义app组件
60 const app = Vue.extend({
61 template:`
62 <div>
63 <hello></hello>
64 <school></school>
65 </div>
66 `,
67 components:{
68 school,
69 hello
70 }
71 })
72
73 new Vue({
74 el:'#root',
75 data: {
76 msg:'你好啊!'
77 },
78 components:{
79 app
80 }
81 })
82 </script>
83 </html>
1 <!DOCTYPE html>
2 <html lang="en">
3 <head>
4 <meta charset="UTF-8">
5 <title>非单文件组件3-VueComponent</title>
6 <script src="js/vue.js"></script>
7 </head>
8 <body>
9 <!--
10 关于VueComponent:
11 1.school组件本质是一个名为VueComponent的构造函数,且不是程序员定义的,是Vue.extend生成的。
12 2.我们只需要写<school/>或<school></school>,Vue解析时会帮我们创建school组件的实例对象,
13 即Vue帮我们执行的:new VueComponent(options)。
14 3.特别注意:每次调用Vue.extend,返回的都是一个全新的VueComponent!!!!
15 4.关于this指向:
16 (1).组件配置中:data函数、methods中的函数、watch中的函数、computed中的函数 它们的this均是【VueComponent实例对象】。
17 (2).new Vue(options)配置中:data函数、methods中的函数、watch中的函数、computed中的函数 它们的this均是【Vue实例对象】。
18 5.VueComponent的实例对象,以后简称vc(也可称之为:组件实例对象)。
19 Vue的实例对象,以后简称vm。
20
21 一个重要的内置关系:VueComponent.prototype.__proto__ === Vue.prototype !!!!!!!!!
22 为什么要有这个关系:让组件实例对象(vc)可以访问到 Vue原型上的属性、方法。
23 -->
24 <div id="root">
25 <h1>{{msg}}</h1>
26 <school></school>
27 <hello></hello>
28 </div>
29 </body>
30 <script type="text/javascript">
31
32 const school = Vue.extend({
33 name:"school",
34 template: `
35 <div>
36 <h2>学校名称:{{name}}</h2>
37 <h2>学校地址:{{address}}</h2>
38 <button @click="showName">点我提示学校名</button>
39 </div>
40 `,
41 data(){
42 return{
43 name:"京东",
44 address:"北京"
45 }
46 },
47 methods: {
48 showName(){
49 console.log('showName',this)
50 }
51 },
52 })
53
54 const test = Vue.extend({
55 template:`<span>jingdong</span>`
56 })
57
58 //定义hello组件
59 const hello = Vue.extend({
60 template:`
61 <div>
62 <h2>{{msg}}</h2>
63 <test></test>
64 </div>
65 `,
66 data(){
67 return {
68 msg:'欢迎来到京东学习!'
69 }
70 },
71 components:{test}
72 })
73
74 // console.log('@',school)
75 // console.log('#',hello)
76
77 const vm = new Vue({
78 el:'#root',
79 data: {
80 msg:'你好啊!'
81 },
82 components:{
83 school,
84 hello
85 }
86 })
87 </script>
88 </html>
1 <!DOCTYPE html>
2 <html lang="en">
3 <head>
4 <meta charset="UTF-8">
5 <title>index</title>
6 </head>
7 <body>
8 <div id="root"></div>
9 <script type="text/javascript" src="../js/vue.js"></script>
10 <script type="text/javascript" src="./main.js"></script>
11 </body>
12 </html>
1 import App from "./App";
2
3 new Vue({
4 el:'#root',
5 template: `<App></App>`,
6 component:{
7 App
8 }
9 })
1 <template>
2 <div>
3 <School></School>
4 <Student></Student>
5 </div>
6 </template>
7
8 <script>
9 import School from "./School";
10 import Student from "./Student";
11
12 export default {
13 name:'App',
14 components:{
15 School,
16 Student
17 },
18 data(){
19 return {
20
21 }
22 }
23 }
24 </script>
1 <template>
2 <div class="demo">
3 <h2>学校名称:{{name}}</h2>
4 <h2>学校地址:{{address}}</h2>
5 <button @click="showName">点我提示学校名</button>
6 </div>
7 </template>
8
9 <script>
10 export default {
11 name:'School',
12 data(){
13 return {
14 name:'京东',
15 address:'北京'
16 }
17 },
18 methods: {
19 showName(){
20 alert(this.name)
21 }
22 },
23 }
24 </script>
25
26 <style>
27 .demo{
28 background-color: orange;
29 }
30 </style>
1 <template>
2 <div>
3 <h2>学生姓名:{{name}}</h2>
4 <h2>学生年龄:{{age}}</h2>
5 </div>
6 </template>
7
8 <script>
9 export default {
10 name:'Student',
11 data(){
12 return {
13 name:'张三',
14 age:18
15 }
16 }
17 }
18 </script>