当前位置: 首页 > article >正文

Vue组件的好处和理解、基本使用、注意事项、组件嵌套、VueComponent理解和原型链

目录

  • 1. 组件的好处和理解
  • 2. Vue组件的使用
    • 2.1 Vue中使用组件的三大步骤
    • 2.2 注意事项
  • 4. 组件的嵌套
  • 5. VueComponent的理解
  • 6. VueComponent原型链

1. 组件的好处和理解

传统方式编写应用,存在2大问题:

  1. 依赖关系混乱,不好维护
  2. 代码复用率不高
    传统方式编写应用

组件的好处:

  1. 将每一个小的模块进行封装,便于管理
  2. 其它需要复用的地方直接进行引用,提高了复用率

组件的好处

Vue的模块和组件:

  • 模块:向外提供特定功能的js程序, 一般就是一个js文件。可以复用js, 简化js的编写, 提高js运行效率。从而达到模块化
  • 组件:用来实现应用中局部功能效果的代码(html/css/js)和资源(image/mp3等)集合。可以复用编码, 简化项目编码, 提高运行效率。从而达到组件化
    组件的定义

2. Vue组件的使用

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

  1. 创建组件

使用Vue.extend(options)创建,其中options和new Vue(options)时传入的options几乎一样,但区别如下:

  • el不要写。因为最终所有的组件都要经过一个vm的管理,由vm中的el决定服务哪个容器
  • data必须写成函数。避免组件被复用时,数据存在引用关系
  1. 注册组件
    • 局部注册:使用new Vue的时候传入components选项
    • 全局注册:使用Vue.component('组件名', 组件)
  2. 使用组件。编写组件标签: <school></school>

使用示例:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script type="text/javaScript" src="../js/vue.js"></script>
</head>
<body>

<div id="root">
    <!-- 第三步:编写组件标签。使用组件名 -->
    <school></school>
</div>



<script type="text/javascript">
    // 第一步:创建school组件
    const school = Vue.extend({
        name:'vue-tool-school-name',
        template:`
				<div>
					<h2>学校名称:{{schoolName}}</h2>
					<button @click="showName">点我弹出学校名</button>
				</div>
			`,
        data(){
            return {
                schoolName:'第一中学'
            }
        },
        methods: {
            showName(){
                alert(this.schoolName)
            }
        }
    })

    // 全局注册组件
    // Vue.component('school',school)

    new Vue({
        el:'#root',
        // 第二步:局部注册组件
        components:{
            // 如果组件名和定义的组件相同,可以简写
            school
        }
    })

</script>

</body>
</html>

显示效果如下:
vue组件的基本使用

2.2 注意事项

  • 关于组件名:
    1. 一个单词组成:可以首字母小写(school),或首字母大写(School)
    2. 多个单词组成:可以kebab-case命名('my-school'),或CamelCase命名(MySchool,需要Vue脚手架支持)

组件名尽可能回避HTML中已有的元素名称,例如:h2、H2都不行。
可以使用name配置项指定组件在开发者工具中呈现的名字

  • 关于组件标签:

    1. 可以使用<school></school>
    2. 可以使用<school/>。不用使用脚手架时,多个<school/>只会渲染一个
  • 创建组件的简写方式:const school = Vue.extend(options)可简写为const school = options

4. 组件的嵌套

  1. 先定义school组件
  2. 然后定义app标注组件时,注册和使用school组件
  3. 在vm中注册和使用app组件
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script type="text/javaScript" src="../js/vue.js"></script>
</head>
<body>

<div id="root">

</div>



<script type="text/javascript">

    // 定义school组件
    const school = Vue.extend({
        template:`
				<div>
					<h2>学校名称:{{name}}</h2>
				</div>
			`,
        data(){
            return {
                name:'第一中学',
            }
        }
    })

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

    new Vue({
        template:'<app></app>',
        el:'#root',
        // 注册app组件
        components:{app}
    })

</script>

</body>
</html>

显示效果如下:
组件的嵌套

5. VueComponent的理解

  • 关于school组件

    1. 定义school组件本质是定义一个名为VueComponent的构造函数,且不是程序员定义的,是Vue.extend生成的
    2. 每次调用Vue.extend,返回的都是一个全新的VueComponent构造函数
    3. 每次执行<school/><school></school>,Vue解析时会帮我们执行new VueComponent(options)创建school组件的实例对象,简称vc组件实例对象
  • 关于this指向:

    • 组件配置中:data函数、methods中的函数、watch中的函数、computed中的函数,它们的this均是VueComponent实例对象
    • new Vue(options)配置中:data函数、methods中的函数、watch中的函数、computed中的函数,它们的this均是Vue实例对象vm

6. VueComponent原型链

我们先通过一个简单的js示例,来理解js的原型链

  1. 下面实现了一个构造函数,然后通过构造函数创建了一个实例对象
  2. 构造函数的显示原型属性,和实例对象的隐式原型属性,指向的都是同一个原型对象
  3. 给构造函数的显示原型属性,操作原先对象追加属性x,可以通过实例对象的隐式原型属性访问到x

使用示例:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>


<script type="text/javascript">

    function Demo(){
        // 相当于静态属性
        this.field1 = 1
    }
    
    const demo = new Demo()

    console.log(Demo.prototype === demo.__proto__)    // true

    Demo.prototype.x = 99
    console.log('@',demo.x)    // @ 99
</script>

</body>
</html>

在Vue中,Vue和VueComponent的原型链关系,如下图所示。一个重要的内置关系:VueComponent.prototype.__proto__ === Vue.prototype。这样可以让组件实例对象(vc)可以访问到Vue原型上的属性、方法
VueComponent原型链

VueComponent的原型链使用示例如下。

  1. 通过Vue.prototype.x = 99在Vue的原型对象上追加了属性x
  2. 通过school的实例对象,能直接访问到属性x
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script type="text/javaScript" src="../js/vue.js"></script>
</head>
<body>

<div id="root">
    <school></school>
</div>

<script type="text/javascript">

    Vue.prototype.x = 99

    // 定义school组件
    const school = Vue.extend({
        template:`
				<div>
					<button @click="showX">点我输出x</button>
				</div>
			`,
        methods: {
            showX(){
                console.log(this.x)    // 99
            }
        },
    })

    const vm = new Vue({
        el:'#root',
        components:{school}
    })
</script>

</body>
</html>

http://www.kler.cn/a/281192.html

相关文章:

  • Sweet Home 3D:Mac 与 Win 平台的强大 3D 室内装潢设计软件
  • Protect OpenAI key using Firebase function
  • 单片机的主流编程语言是什么
  • 实现简易 React SSR 框架
  • 最高加速超4倍!不依赖特定模型的统一模型压缩框架CPD发布(卡尔斯鲁厄理工学院)
  • 设计模式反模式:UML图示常见误用案例分析|设计模式|反模式|UML
  • 日本脸书Facebook代运营:如何投放广告与代运营合作全解析
  • NLP -->定义、应用、与职业前景解析
  • 开放式耳机别人能听到吗?不堵耳、不入耳的设计才舒服
  • 快速搭建和运行Spring Boot项目的简易指南
  • 数学建模学习(117):四阶龙格-库塔方法从理论到Python/matlab实践
  • 多线程篇(基本认识 - 线程相关API)(持续更新迭代)
  • 在WSL2中删除文件后,磁盘空间未释放怎么办
  • layui2.9 树组件默认无法修改节点图标,修改过程记录下
  • CentOS 7 更换为国内YUM源详细教程
  • K8s系列之:K8s OPERATOR是什么
  • fastadmin表单中二维数组组件+图片上传
  • 【Java EE】深入探讨 Java 中 Thread 类的使用
  • CTFhub通关攻略-SRRF篇【6-11关】
  • OpenCV小练习:身份证号码识别