一、非单文件组件

  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、index.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>

2、main.js

1 import App from "./App";
2 
3 new Vue({
4     el:'#root',
5     template: `<App></App>`,
6     component:{
7         App
8     }
9 })

3、App.vue

 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>

4、School.vue

 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>

5、Student.vue

 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>

 

posted on 2023-07-08 15:39  晨曦生辉耀匕尖  阅读(5)  评论(0编辑  收藏  举报