• Vue组件化编程详解


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

    在这里插入图片描述
    在这里插入图片描述
    模块

    a.理解: 向外提供特定功能的js程序,一般就是一个JS文件

    b.为什么: js 文件很多很复杂

    c.作用: 复用、简化js的编写,提高js运行效率

    组件

    a.定义: 用来实现局部功能的代码和资源的结合(html/css/js/image…)

    b.为什么: 一个界面的功能很复杂

    c.作用: 复用编码,简化项目编码,提高运行效率

    模块化

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

    组件化

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

    2.非单文件组件

    非单位件组件: 一个文件中包含有n个组件

    单文件组件: 一个文件中只包含有1个组件

    1. 基本使用

    Vue中使用组件的三大步骤:

    1.定义组件

    • 使用Vue.extend(options) 创建,其中 options 和 new Vue(options) 时传入 options 几乎一样,但也有点区别:
      • el 不用写,因为最终所有的组件都要经过一个vm的管理,由vm中的el才决定服务哪个容器
      • data 必须写成函数,避免组件被复用时,数据存在引用关系。

    2.注册组件

    a.局部注册: new Vue() 的时候options 传入 components选项

    b.全局注册: Vue.components(‘组件名’,组件)

    3.使用组件

    编写组件如

    <title>基本使用</title>
    <script type="text/javascript" src="../js/vue.js"></script>
    
    <div id="root">
      <h2>{{msg}}</h2><hr>
      <!-- 第三步:编写组件标签 -->
      <school></school><hr>
      <student></student><hr>
      <hello></hello><hr>
    </div>
    
    <div id="root2">
      <hello></hello>
    </div>
    
    <script type="text/javascript">
      Vue.config.productionTip = false
    
      //第一步:创建school组件
      const school = Vue.extend({
        // el:'#root', //组件定义时,一定不要写el配置项,
        // 因为最终所有的组件都要被一个vm管理,由vm决定服务于哪个容器
        template: `
    				<div class="demo">
    					<h3>学校名称:{{schoolName}}</h3>
    					<h3>学校地址:{{address}}</h3>
    					<button @click="showName">点我提示学校名</button>	
      			</div>
    			`,
        data() {
          return {
            schoolName: '尚硅谷',
            address: '北京昌平'
          }
        },
        methods: {
          showName() {
            alert(this.schoolName)
          }
        },
      })
    
      //第一步:创建student组件
      const student = Vue.extend({
        template: `
    				<div>
    					<h3>学生姓名:{{studentName}}</h3>
    					<h3>学生年龄:{{age}}</h3>
      			</div>
    			`,
        data() {
          return {
            studentName: '张三',
            age: 18
          }
        }
      })
    
      //第一步:创建hello组件
      const hello = Vue.extend({
        template: `
    				<div>	
    					<h3>你好啊!{{name}}</h3>
      			</div>
    			`,
        data() {
          return {
            name: 'cess'
          }
        }
      })
    
      //第二步:全局注册组件
      Vue.component('hello', hello)
    
      //创建vm
      new Vue({
        el: '#root',
        data: {
          msg: '你好啊!'
        },
        //第二步:注册组件(局部注册)
        components: {
          school,
          student
        }
      })
    
      new Vue({
        el: '#root2',
      })
    </script>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90
    • 91
    • 92

    2.组件注意事项

    关于组件名

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

    关于组件的标签

    • 第一种写法:
    • 第二种写法: (需要脚手架支持)
    • 备注: 不适用脚手架时,会导致后续组件不能渲染

    一个简写方式: const school = Vue.extend(options) 可简写为 const school = options, 因为父组件components 引入的时候会自动创建

    <title>几个注意点</title>
    	<script type="text/javascript" src="../js/vue.js"></script>
    
    	<div id="root">
    		<h2>{{msg}}</h2>
    		<school></school>
    	</div>
    
    <script type="text/javascript">
    	Vue.config.productionTip = false
    
    	//定义组件
    	const school = Vue.extend({
    		name: 'atguigu', // 组件给自己起个名字,用于在浏览器开发工具上显示
    		template: `
    				<div>
    					<h3>学校名称:{{name}}</h3>	
    					<h3>学校地址:{{address}}</h3>	
    				</div>
    			`,
    		data() {
    			return {
    				name: '电子科技大学',
    				address: '成都'
    			}
    		}
    	})
    
    	new Vue({
    		el: '#root',
    		data: {
    			msg: '欢迎学习Vue!'
    		},
    		components: {
    			school
    		}
    	})
    </script>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38

    3.组件的嵌套
    在这里插入图片描述

    <title>组件的嵌套</title>
    <script type="text/javascript" src="../js/vue.js"></script>
    
    <div id="root"></div>
    
    <script type="text/javascript">
      Vue.config.productionTip = false
    
      //定义student组件
      const student = Vue.extend({
        name: 'student',
        template: `
    				<div>
    					<h4>学生姓名:{{name}}</h4>	
    					<h4>学生年龄:{{age}}</h4>	
      			</div>
    			`,
        data() {return {name: '尚硅谷',age: 18}}
      })
    
      //定义school组件
      const school = Vue.extend({
        name: 'school',
        template: `
    				<div>
    					<h3>学校名称:{{name}}</h3>	
    					<h3>学校地址:{{address}}</h3>	
    					<student></student>
     			  </div>
    			`,
        data() {return {name: '尚硅谷',address: '北京'}},
        //注册组件(局部)
        components: { student }
      })
    
      //定义hello组件
      const hello = Vue.extend({
        template: `<h3>{{msg}}</h3>`,
        data() {return {msg: '欢迎来到尚硅谷学习!'}}
      })
    
      //定义app组件
      const app = Vue.extend({
        template: `
    				<div>	
    					<hello></hello>
    					<school></school>
      			</div>
    			`,
        components: { school, hello }
      })
    
      //创建vm
      new Vue({
        el: '#root',
        template: '<app></app>',
        //注册组件(局部)
        components: { app }
      })
    </script>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60

    4.VueComponents

    • schol 组件本质是一个名为 VueComponent 的构造函数,且不是程序员定义的,而是 Vue.extend() 生成的
    • 我们需要写或,Vue解析时会帮我们创建school组件的实例对象,即Vue帮我们执行的 new VueComponent(options)
    • 每次调用 Vue.extend, 返回的都是一个全新的 VueComponent ,即不同组件是不同的对象。
    • 关于this指向
      • 组件配置中 data 函数、methods函数 、watch函数、computed中的函数,他们的this均是 VueComponent 实例对象。
      • new Vue(options) 配置中: data函数、methods函数、watch函数、computed中的函数,他们是this均是 Vue实例对象。
    • VueComponent 的实例对象,以后简称 vc (组件实例对象) Vue 的实例对象,以后简称vm
    <title>VueComponent</title>
    <script type="text/javascript" src="../js/vue.js"></script>
    
    <div id="root">
      <school></school>
      <hello></hello>
    </div>
    
    <script type="text/javascript">
      Vue.config.productionTip = false
    
      // 定义school组件
      const school = Vue.extend({
        name: 'school',
        template: `
    				<div>
    					<h2>学校名称:{{name}}</h2>	
    					<h2>学校地址:{{address}}</h2>	
    					<button @click="showName">点我提示学校名</button>
      			</div>
    			`,
        data() {return {name: '尚硅谷',address: '北京'}},
        methods: {showName() {console.log('showName', this)}},
      })
    
      const test = Vue.extend({
        template: `<span>atguigu</span>`
      })
    
      // 定义hello组件
      const hello = Vue.extend({
        template: `
    				<div>
    					<h2>{{msg}}</h2>
    					<test></test>	
      			</div>
    			`,
        data() {return {msg: '你好啊!'}},
        components: { test }
      })
    
      // console.log('@',school)
      // console.log('#',hello)
    
      // 创建vm
      const vm = new Vue({
        el: '#root',
        components: { school, hello }
      })
    </script>
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51

    5.一个重要的内置关系
    在这里插入图片描述

    3 单文件组件

    School.vue

    <template>
        <div id='Demo'>
            <h2>学校名称:{{name}}</h2>
            <h2>学校地址:{{address}}</h2>
            <button @click="showName">点我提示学校名</button>
        </div>
    </template>
    
    <script>
        export default {
            name:'School',
            data() {
                return {
                    name:'UESTC',
                    address:'成都'
                }
            },
            methods: {
                showName(){
                    alert(this.name)
                }
            },
        }
    </script>
    
    <style>
        #Demo{
            background: orange;
        }
    </style>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30

    Student.vue

    <template>
        <div>
            <h2>学生姓名:{{name}}</h2>
            <h2>学生年龄:{{age}}</h2>
        </div>
    </template>
    
    <script>
        export default {
            name:'Student',
            data() {
                return {
                    name:'cess',
                    age:20
                }
            },
        }
    </script>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    App.vue

    <template>
        <div>
            <School></School>
            <Student></Student>
        </div>
    </template>
    
    <script>
        import School from './School.vue'
        import Student from './Student.vue'
    
        export default {
            name:'App',
            components:{
                School,
                Student
            }
        }
    </script>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    main.js

    import App from './App.vue'
    
    new Vue({
        template:`<App></App>`,
        el:'#root',
        components:{App}
    })
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    index.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>单文件组件练习</title>
    </head>
    <body>
        <div id="root"></div>
        <script src="../../js/vue.js"></script>
        <script src="./main.js"></script>
    </body>
    </html>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
  • 相关阅读:
    markdown语法大全_Markdown超详细介绍
    ERP编制物料清单 华夏
    【C++】设计模式之工厂模式
    Spring Cloud Alibaba Gateway 入门:简介与基本配置教程
    Springboot集成redis--不同环境切换
    Spark Streaming
    技术分享 | AlertManager 源码解析
    java基于微信小程序的智能停车场管理系统+ssm+uinapp+Mysql+计算机毕业设计
    resultmap
    Vue 2与Vue 3生命周期钩子的对比分析
  • 原文地址:https://blog.csdn.net/fd2025/article/details/125326646