尚硅谷Vue_组件化编程

本文详细介绍了Vue2和Vue3中的模块与组件概念,包括模块化与组件化的原理、单文件组件与非单文件组件的区别,以及如何使用Vue.extend进行组件定义、注册和使用。还涉及了webpack工具和Vue脚手架在编译.vue文件中的角色,以及组件的嵌套和VueComponent的内部机制。
摘要由CSDN通过智能技术生成

【前端】尚硅谷Vue2-Vue3全家桶笔记目录贴

1. 模块与组件、模块化与组件化

1.1 模块

1.理解: 向外提供特定功能的 js 程序, 一般就是一个 js 文件(针对js才叫模块化,css和html没有模块化概念)
2.为什么: js 文件很多很复杂
3.作用: 复用 js, 简化 js 的编写, 提高 js 运行效率

1.2 组件

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

1.3 模块化

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

1.4组件化

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

2. 单文件组件和非单文件组件

2.1 非单文件组件

  1. 模板编写没有提示
  2. 没有构建过程, 无法将 ES6 转换成 ES5
  3. 不支持组件的 CSS
  4. 真正开发中几乎不用
  • 基本使用
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>初始Vue</title>
    <!--引入vue-->
    <script type="text/javascript" src="../../vue-dev.js"></script>

    <!--
			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>
		-->
</head>
<body>
<!-- 准备好一个容器 -->
<div id="demo">
    <school></school>
    <hr/>
    <student></student>
    <hr/>
</div>
<div id="demo2">
    <hello></hello>
</div>
<script>

    //第一步:创建school组件
     var school = Vue.extend({
         // el:'#root', //组件定义时,一定不要写el配置项,因为最终所有的组件都要被一个vm管理,由vm决定服务于哪个容器。
        data() { data中用于存储数据,数据供el所指定的容器去使用,值我们暂时先写成一个对象。
            return{
                schoolName: "浙江大学",
                address: "浙江省杭州市"
            }
        },
         methods:{
             tanchuang(){
                 alert(this.schoolName)
             }
         },
         template: `
            <div>
                  <h2>学校名称:{{schoolName}}</h2>
                  <h2>学校地址:{{address}}</h2>
                  <button @click="tanchuang">点我弹窗学校名称</button>
            </div>
         `
    });
    //第一步:创建student组件
    var student = Vue.extend({
        data(){
            return {
                studentName:'张三',
                age:18
            }
        },
        template: `
            <div>
                 <h2>学生姓名:{{studentName}}</h2>
                 <h2>学生年龄:{{age}}</h2>
            </div>
         `
    })
    //第一步:创建hello组件
    var hello = Vue.extend({
        template:`
				<div>
					<h2>你好啊!{{name}}</h2>
				</div>
			`,
        data(){
            return {
                name:'Tom'
            }
        }
    })
    //第二步:全局注册组件
    Vue.component('hello',hello)

    //创建Vue实例,传一个参数,(对象,叫做配置对象)
    new Vue({
        el: '#demo', //el用于指定当前Vue实例为哪个容器服务,值通常为css选择器字符串。
        // data: { data中用于存储数据,数据供el所指定的容器去使用,值我们暂时先写成一个对象。
        //     name11: "尚硅谷2",
        //     age11: 18
        // },
        //第二步:注册组件(局部注册)
        components:{
            school,
            student
        }
    });
    new Vue({
        el:'#demo2'
    })
</script>
</body>
</html>
  • 几个注意点
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script type="text/javascript" src="../../vue-dev.js" ></script>
</head>
<body>
<!--
			几个注意点:
					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
		-->
<!-- 准备好一个容器 -->
<div id="demo">
    <h1>{{msg}}</h1>
    <my-school></my-school>
</div>
<script>
    var s={
        name:"nihao2",
        template:`
        <div>
            <h1>{{schoolName}}</h1>
        </div>
        `,
        data(){
            return{
                schoolName:"浙江大学",
                address:"浙江省"
            }
        }
    };
    new Vue({
        el:'#demo',
        data:{
            msg:'欢迎学习Vue!'
        },
        components:{
            'my-school':s
        }
    })
</script>
</body>
</html>
  • 组件的嵌套
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script type="text/javascript" src="../../vue-dev.js"></script>
</head>
<body>
<div id="demo">
</div>
<script>
    var student = Vue.extend(
        {
            template: `
                <div>
                    <h1>学生名称:{{studentName}}</h1>
                    <h1>学生年龄:{{age}}</h1>
                </div>
                `,
            data() {
                return {
                    studentName: "小红",
                    age: 18
                }
            }
        }
    );
    var school = Vue.extend(
        {
            template: `
                <div>
                    <h1>学校名称:{{schoolName}}</h1>
                    <h1>学校地址:{{address}}</h1>
                    <student></student>
                </div>
                `,
            data() {
                return {
                    schoolName: "浙江大学",
                    address: "浙江省"
                }
            },
            components: {
                student
            }
        }
    );
    //定义hello组件
    const hello = Vue.extend({
        template:`<h1>{{msg}}</h1>`,
        data(){
            return {
                msg:'欢迎来到尚硅谷学习!'
            }
        }
    })

    var app = Vue.extend({
        template:`
            <div>
                <school></school>
                <hello></hello>
            </div>
        `,
        components:{
            school,
            hello
        }
    });
    new Vue({
        el: '#demo',
        template:`
            <div>
                <app></app>
            </div>
        `,
        components: {
            app
        }
    })
</script>
</body>
</html>
  • Vuecomponent
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script type="text/javascript" src="../../vue-dev.js"></script>
</head>
<body>
<!--
			关于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。
		-->
<div id="demo">
    <hello></hello>
    <school></school>
</div>
<script>

    var school = Vue.extend(
        {
            template: `
                <div>
                    <h1>学校名称:{{schoolName}}</h1>
                    <h1>学校地址:{{address}}</h1>
                </div>
                `,
            data() {
                return {
                    schoolName: "浙江大学",
                    address: "浙江省"
                }
            }
        }
    );
    var test2=Vue.extend({
        template:`<span>123</span>`,
    })
    //定义hello组件
    const hello = Vue.extend({
        template:`
                <div>
                <h1>{{msg}}</h1>
                <test2></test2>
                </div>
        `,
        data(){
            return {
                msg:'欢迎来到尚硅谷学习!'
            }
        },
        components: {
            test2
        }
    });
    school.a=99;
    console.log(school,school.a);
    console.log(hello);
    var vm = new Vue({
        el: '#demo',
        components: {
            hello,
            school
        }
    });
</script>

</body>
</html>
  • 一个重要的内置关系
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script type="text/javascript" src="../../vue-dev.js"></script>

</head>
<body>
<!--
				1.一个重要的内置关系:VueComponent.prototype.__proto__ === Vue.prototype
				2.为什么要有这个关系:让组件实例对象(vc)可以访问到 Vue原型上的属性、方法。
		-->
<!-- 准备好一个容器-->
<div id="demo">
    <school></school>
</div>

    <script>
        Vue.prototype.x=111;
        var school = Vue.extend(
            {
                template: `
                <div>
                    <h1>学校名称:{{schoolName}}</h1>
                    <h1>学校地址:{{address}}</h1>
                    <button @click="showX">点我展示x</button>
                </div>
                `,
                data() {
                    return {
                        schoolName: "浙江大学",
                        address: "浙江省"
                    }
                },
                methods:{
                    showX(){
                        alert(this.x)
                    }
                }
            }
        );

        var vm = new Vue({
            el: '#demo',
            components: {
                school
            }
        });
        vm.x=110;
        // function Demo() {
        //     this.a=3
        // }
        // Demo.prototype.y=3;
        // Demo.prototype.__proto__.x=4;
        // console.dir(Demo)
        // console.log(new Demo())
        // console.log(new Demo().x)
        // console.log(new Demo().y)
    </script>
</body>
</html>

在这里插入图片描述

2.2 单文件组件

2.2.1 编译.vue结尾文件

1.webpack工具
2. vue脚手架

2.2.2 一个.vue 文件的组成(3 个部分)

<template>
//页面模板
</template>

<script>
//JS 模块对象
export default {
	data() {return {}},
	methods: {},
	computed: {},
	components: {}
}
</script>

<style>
//样式定义
</style>

2.2.3 基本使用

  1. 引入组件
  2. 映射成标签
  3. 使用组件标签
    在这里插入图片描述
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值