ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

Vue组件化

2022-03-03 09:33:05  阅读:146  来源: 互联网

标签:school Vue name 组件 data hello


Vue组件化

一、模块与组件、模块化与组件化

1.1、模块

  1. 理解: 向外提供特定功能的 js 程序, 一般就是一个 js 文件
  2. 为什么: js 文件很多很复杂
  3. 作用: 复用 js, 简化 js 的编写, 提高 js 运行效率

1.2、组件

  1. 理解: 用来实现局部(特定)功能效果的代码集合(html/css/js/image……)
  2. 为什么: 一个界面的功能很复
  3. 复用编码, 简化项目编码, 提高运行效率

1.3、模块化

​ 当应用中的 js 都以模块来编写的, 那这个应用就是一个模块化的应用。

1.4、组件化

​ 当应用中的功能都是多组件的方式来编写的, 那这个应用就是一个组件化的应用,。

二、非单文件组件

  1. 模板编写没有提示
  2. 没有构建过程, 无法将 ES6 转换成 ES5
  3. 不支持组件的 CSS
  4. 真正开发中几乎不用

2.1、基本使用

<!-- 
		Vue中使用组件的三大步骤:
				一、定义组件(创建组件)
				二、注册组件
				三、使用组件(写组件标签)

		一、如何定义一个组件?
					使用Vue.extend(options)创建,其中options和new Vue(options)时传入的那个options几乎一样,但也有点区别;
					区别如下:
							1.el不要写,为什么? ——— 最终所有的组件都要经过一个vm的管理,由vm中的el决定服务哪个容器。
							2.data必须写成函数,为什么? ———— 避免组件被复用时,数据存在引用关系。
					备注:使用template可以配置组件结构。

		二、如何注册组件?
						1.局部注册:靠new Vue的时候传入components选项
						2.全局注册:靠Vue.component('组件名',组件)

		三、编写组件标签:
						<school></school>
	-->
     <body>
	
		<!-- 准备好一个容器-->
		<div id="root">
			<hello></hello>
			<hr>
			<h1>{{msg}}</h1>
			<hr>
			<!-- 第三步:编写组件标签 -->
			<student></student>
		</div>

		<div id="root2">
			<hello></hello>
		</div>
	</body>

	<script type="text/javascript">
		Vue.config.productionTip = false

		//第一步:创建student组件
		const student = Vue.extend({
			template:`
				<div>
					<h2>学生姓名:{{studentName}}</h2>
					<h2>学生年龄:{{age}}</h2>
				</div>
			`,
			data(){
				return {
					studentName:'张三',
					age:18
				}
			}
		})
		
		//第一步:创建hello组件
		const hello = Vue.extend({
			template:`
				<div>	
					<h2>你好啊!{{name}}</h2>
				</div>
			`,
			data(){
				return {
					name:'Tom'
				}
			}
		})
		
		//第二步:全局注册组件
		Vue.component('hello',hello)

		//创建vm
		new Vue({
			el:'#root',
			data:{
				msg:'你好啊!'
			},
			//第二步:注册组件(局部注册)
			components:{
				student
			}
		})

		new Vue({
			el:'#root2',
		})
	</script>

2.2、注意事项

    <!-- 
			几个注意点:
					1.关于组件名:
								一个单词组成:
											第一种写法(首字母小写):school
											第二种写法(首字母大写):School
								多个单词组成:
											第一种写法(kebab-case命名):my-school
											第二种写法(CamelCase命名):MySchool (需要Vue脚手架支持)
								备注:
										(1).组件名尽可能回避HTML中已有的元素名称,例如:h2、H2都不行。
										(2).可以使用name配置项指定组件在开发者工具中呈现的名字。

					2.关于组件标签:
								第一种写法:<school></school>
								第二种写法:<school/>
								备注:不用使用脚手架时,<school/>会导致后续组件不能渲染。

					3.一个简写方式:
								const school = Vue.extend(options) 可简写为:const school = options
		-->
<body>

    <!-- 准备好容器 -->
    <div id="root">
        <h1>{{msg}}</h1>
        <school></school>
        <!-- <my-school></my-school> -->
    </div>

    <script>
        Vue.config.productionTip = false;// 以阻止 vue 在启动时生成生产提示。

        //创建school组件
        const s = Vue.extend({

            template:`<div>
            
                <h2>学校是:{{schoolName}}</h2>
                <h2>地址在:{{address}}</h2>
            
            </div>`,
            name:'huliu',
            data(){
                return{
                    schoolName:'atzg',
                    address:'武汉'
                }
               
            }
        })

        new Vue({
            el:'#root',
            data:{
                msg:'欢迎学习Vue!'
            },
            components:{
                
                school:s   //一个单词命名
                // 'my-school':s //多个单词命名
            }
        })

       
    </script>
</body>

2.3、组件的嵌套

<body>
    <!-- 准备好容器 -->
    <div id="root">
        <!-- <app></app> -->
     
    </div> 

    <script>
        Vue.config.productionTip = false;// 以阻止 vue 在启动时生成生产提示。
            
      //定义student组件
      const student = Vue.extend({
            name:'student',
            template:`
                <div>
                    <h2>学生姓名:{{studentName}}</h2>
                    <h2>学生年龄:{{age}}</h2>             
                </div>
            `,
            data(){
                return{
                    studentName:'张三',
                    age:18
                }
            }
        })

        //定义school组件
        const school = Vue.extend({
            name:'school',
            template:`
                <div>
                    <h2>学校名称:{{schoolName}}</h2>
                    <h2>学校地址:{{address}}</h2>
                    <student></student>
                </div>
            `,
            data(){
                return{
                    schoolName:'atpower',
                    address:'郑州'
                }
            },
            //注册组件:局部
            components:{
                student
            }
        })
        
        //定义hello组件
        const hello = Vue.extend({
            template:`<h1>{{msg}}</h1>`,
            data(){
                return{
                    msg:'北京欢迎你'
                }
            }
        })

        //定义app组件
        const app = Vue.extend({
            template:`<div>
                <hello></hello>
                <school></school>
            </div>`,
            components:{
                    school,
                    hello,
                
            }
        })

        Vue.component('hello',hello)

        //创建vm
        new Vue({
            template:` <app></app>`,
            el:'#root',
             //注册组件(局部)
            components:{
             app
            }
        })
  
    </script>
</body>


2.4、VueComponent

<!-- 
			关于VueComponent:
						1.school组件本质是一个名为VueComponent的构造函数,且不是程序员定义的,是Vue.extend生成的。

						2.我们只需要写<school/>或<school></school>,Vue解析时会帮我们创建school组件的实例对象,
							即Vue帮我们执行的:new VueComponent(options)。

						3.特别注意:每次调用Vue.extend,返回的都是一个全新的VueComponent!!!!

						4.关于this指向:
								(1).组件配置中:
											data函数、methods中的函数、watch中的函数、computed中的函数 它们的this均是【VueComponent实例对象】。
								(2).new Vue(options)配置中:
											data函数、methods中的函数、watch中的函数、computed中的函数 它们的this均是【Vue实例对象】。

						5.VueComponent的实例对象,以后简称vc(也可称之为:组件实例对象)。
							Vue的实例对象,以后简称vm。
		-->
<body>

    <!-- 准备一个容器 -->
    <div id="root">
        <school></school>
        <hello></hello>
    </div>

    <script>
          Vue.config.productionTip = false;// 以阻止 vue 在启动时生成生产提示。
        //   定义school组件
        const school = Vue.extend({
            name:'school',
            template:`<div>
                <h2>学校名称:{{name}}</h2>
                <h2>学校地址:{{address}}</h2>
                <button @click='showName'>点我提示学校名</button>
            </div>`,
            data(){
                return{
                    name:'atbj',
                    address:'北京'
                }
            },
           methods: {
                showName(){
                    alert(this.name)
                }
           },
        })

        //定义hello组件
        const hello = Vue.extend({
            name:'hello',
            template:`<div>
                <h2>{{msg}}</h2>
            </div>`,
            data(){
                return{
                    msg:'北京欢迎你'
                }
            }
        })

        console.log('@' + school)
        console.log('#' + hello)
        //创建vm
        new Vue({
            el:'#root',
            components:{
                school,hello
            }
        })

    </script>
</body>

2.5、一个重要的内置关系

<!-- 
				1.一个重要的内置关系:VueComponent.prototype.__proto__ === Vue.prototype
				2.为什么要有这个关系:让组件实例对象(vc)可以访问到 Vue原型上的属性、方法。
		-->

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-wojtFcwq-1646270206361)(Vue%E7%BB%84%E4%BB%B6%E5%8C%96.assets/image-20220302200624449.png)]

<body>
    <!-- 准备好容器 -->
    <div id="root">
        <school></school>
    </div>

    <script>
        Vue.config.productionTip = false;// 以阻止 vue 在启动时生成生产提示。
        Vue.prototype.x = 99;
        
        //定义school组件
        const school = Vue.extend({
            name:'school',
            template:`
                <div>
                    <h2>学校名称:{{schoolName}}</h2>
                    <h2>学校地址:{{address}}</h2>
                    <button @click="showX">点我输出x</button>
                </div>
            `,
            data(){
                return{
                    schoolName:'atpower',
                    address:'郑州'
                }
            },
            methods: {
                showX(){
                    console.log(this.__proto__.__proto__.x)
                }
            },
          
        })

        // 定义一个构造函数
      /*   function Demo(){
            this.a = 1;
            this.b = 2;
        }
        // 创建一个Demo的实例对象
        const d = new Demo();


        //都指向原型对象(只有一个)
         console.log(Demo.prototype)  //显示原型属性
         console.log(d.__proto__)  //隐式原型属性
         console.log(Demo.prototype===d.__proto__)
		//程序员通过显示原型属性操作原型对象,追加一个x属性,值为99
        Demo.prototype.x=99;
     
        // console.log(d.x)
 */

        // 创建一个vm
       new Vue({
           el:'#root',
           data:{
               mag:'你好'
           },
           components:{
               school
           }
       })

       console.log(school.prototype.__proto__===Vue.prototype)
    </script>
</body>


三、单文件组件

<template>
    <!-- 组件的结构 -->
    <div>
        <h2>学生姓名:{{name}}}</h2>
        <h2>学生年龄:{{age}}</h2>
    </div>
</template>
<<script>
    //组件交互相关的代码(数据、方法等)
    export default({
        name:'Student',
        data(){
            return{
                name:'张三',
                age:18
            }
        },
    })

   
</script>

<template>
    <!-- 组件的结构 -->
    <div class="demo">
        <h2>学校地址:{{schoolName}}</h2>
        <h2>学校地址:{{address}}</h2>
        <button @click="showName">点我提示学校名</button>
    </div>
</template>
<<script>
    //组件交互相关的代码(数据、方法等)
    export default Vue.extend({
        name:'School',
        data(){
            return{
                schoolName:'虚拟学校',
                address:'北京'
            }
        },
        methods: {
            showName(){
                alert(this.schoolName)
            }
        },
    })

   
</script>
<style>

    .demo{
        background-color: aqua;
    }
</style>
<template>
    <div>
        <school></school>
        <student></student>
    </div>
</template>

<script>
    //引入组件
    import Student from './Student.vue'
    import School  from  './School.vue'
 

    export default {
        name:'App',
        components:{
            Student,
            School
         
        }
    }
</script>

<style>

</style>
import App from './App.vue'

new Vue({
    el:'#root',
    components:{App},
 })
``
<!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>Document</title>
    
</head>
<body>
    <div id="root">
        <App></App>
    </div>
    <script src="../js/vue.js"></script>
    <script src="./main.js"></script>
</body>
</html>
<!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>Document</title>
    
</head>
<body>
    <div id="root">
        <App></App>
    </div>
    <script src="../js/vue.js"></script>
    <script src="./main.js"></script>
</body>
</html>

标签:school,Vue,name,组件,data,hello
来源: https://blog.csdn.net/qq_56644693/article/details/123245443

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有