Vue第七天---Vue组件

简介: Vue第七天---Vue组件

Vue组件


组件是Vue强大功能之一,运用它可以使代码的维护和复用率提高;它提供·了一种抽象,让我们可以使用独立可复用的代码构建大型项目


1.组件是什么


组件(Component)是对数据和方法的简单封装,Web中的组件其实可以看成是页面的一个组成部分,它是一个具有独立的逻辑和功能的界面,同时又能根据规定的接口规则进行相互融合,最终成为一个完整的应用程序。


页面就是由一个个类似导航、列表、弹窗、下拉菜单这样的组件组成的,页面不过是多个组件的容器;当我们不需要或者替换某个组件时,可以随时删除或者替换,不会影响整个程序的运行。组件化的思想就是将一个巨大、复杂的任务拆分为多个小组件


在Vue中,组件是自定义的元素,Vue可以为它添加特殊功能,因为组件是可复用Vue的实例,所以它与Vue()接收相同的选项,例如data、computed、watch、methods……


2. 组件的创建和使用


组件有三种创建方式

第一种,使用Vue.extend()来创建

var myvue=Vue.extend({})

然后使用Vue.component(‘组件名称’,创建的模板对象)注册组件


<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>组件创建1 demo</title>
    <script src="../../easy_start/js/vue.js" type="text/javascript" charset="UTF-8"></script>
</head>
<body>
<div id="app">
    <myvue></myvue>
</div>
<script type="text/javascript">
    var myvue=Vue.extend({
        template:'<p>这是使用Vue.extend()创建的组件</p>'
    })
    Vue.component('myvue',myvue)
    var vm=new Vue({
        el:"#app",
        data:{},
        methods:{},
    })
</script>
</body>
</html>
复制代码


image.png


第二种,使用Vue.component()来创建


<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>组件创建2 demo</title>
    <script src="../../easy_start/js/vue.js" type="text/javascript" charset="UTF-8"></script>
</head>
<body>
<div id="app">
    <myvue2></myvue2>
</div>
<script type="text/javascript">
    Vue.component('myvue2',{
        template:'<p>这是使用Vue.component()创建的组件</p>'
    })
    var vm=new Vue({
        el:"#app",
        data:{},
        methods:{}
    })
</script>
</body>
</html>
复制代码


image.png

第三种,使用template元素定义组件的html模板结构


<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>组件创建3 demo</title>
    <script src="../../easy_start/js/vue.js" type="text/javascript" charset="UTF-8"></script>
</head>
<body>
<div id="app">
    <myvue3></myvue3>
</div>
<template id="tem">
    <p>这是通过template元素创建的组件</p>
</template>
<script type="text/javascript">
    Vue.component('myvue3',{
        template:"#tem"
    })
    var vm=new Vue({
        el:"#app",
    })
</script>
</body>
</html>
复制代码

image.png

3. 组件注册


组件注册包括全局注册局部注册,组件注册的本质即自定义标签,其实是个小一点的Vue实例,必须在Vue实例化前声明

  1. 全局注册
    要注册全局组件可以使用Vue.component()来进行创建
  2. 局部注册
    全局注册即使已经不再需要某个组件,但是打包后还是会包含在最终的构建结果中
    在Vue实例中,使用components可以局部注册一个组件,注册后组件只在该实例作用域下有效。


<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>组件局部注册 demo</title>
    <script src="../../easy_start/js/vue.js" type="text/javascript" charset="UTF-8"></script>
</head>
<body>
<div id="app">
    <mycomponents></mycomponents>
</div>
<script>
    var vm1={
        template:'<p>这是一个局部组件</p>'
    }
    var vm=new Vue({
        el:"#app",
        components:{
            'mycomponents':vm1
        }
    })
</script>
</body>
</html>
复制代码


image.png


4. 组件嵌套


组件中还可以使用components嵌套组件,组件本身也可以包含组件


var child=Vue.extend({
            template:'<p> child</p>'
        }
    )
    var parent=Vue.extend({
        template:'<p>parent</p>',
        components:{
            'child-component':child
        }
    })
    Vue.component('parent-component',parent)
复制代码


当然也可以不用每次都调用Vue.extend()和Vue.component()方法


<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>组件嵌套 demo</title>
    <script src="../../easy_start/js/vue.js" type="text/javascript" charset="UTF-8"></script>
</head>
<body>
<div id="app">
    <my-parent></my-parent>
</div>
<script>
    var child = {
        template:`
                <div>
                    <h4>这是child组件</h4>
                </div>
                `
    }
    var parent = {
        template:`
                <div style="border:1px solid red">
                    <h4>这是parent组件</h4>
                    <my-child></my-child>
                </div>
                `,
        components:{
            "my-child":child
        }
    }
    new Vue({
        el:"#app",
        components:{
            "my-parent":parent
        }
    })
</script>
</body>
</html>
复制代码


image.png

5.组件切换


组件切换:js动态控制template


<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>组建切换 demo</title>
    <script src="../../easy_start/js/vue.js" type="text/javascript" charset="UTF-8"></script>
</head>
<body>
<div id="app">
    <div class="container">
        <button @click="comp='zujian1'">点击组件1</button>
        <button @click="comp='zujian2'">点击组件2</button>
    </div>
    <aaa :is="comp"></aaa>
</div>
<script>
    var app=new Vue({
        el:"#app",
        data:{
            comp:'zujian2',
        },
        components:{
            zujian1:{
                template:'<h1>组件1</h1>'
            },
            zujian2:{
                template:'<h1>组件2</h1>'
            }
        }
    })
</script>
</body>
</html>
复制代码


image.png


6.组件中的data和methods


  1. 组件可以拥有自己的数据
  2. 组件中的data和实例的data有不同之处,实例中的data可以是一个对象,而组件中的data必须是一个方法
  3. 组件中的data除了是一个方法,还必须返回一个对象
  4. 组件中的data和实例中的data使用方法一样
  5. 组件中的methods的定义和使用与实例中的一样


<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>组件中的data和methods demo</title>
    <script src="../../easy_start/js/vue.js" type="text/javascript" charset="UTF-8"></script>
</head>
<body>
<div id="app">
    <myvue></myvue>
</div>
<script type="text/javascript">
    Vue.component('myvue',{
        template:'<p>这是全局组件-{{msg}} {{msg1}}</p>',
        data:function(){
            return {
                msg:'这是组件的data',
                msg1:'组件中的msg1'
            }
        }
    })
    new Vue({
        el:"#app",
        data:{
            msg:"这是实例中的data数据"
        }
    })
</script>
</body>
</html>
复制代码


image.png

目录
相关文章
|
3天前
|
JavaScript
Vue基础知识总结 4:vue组件化开发
Vue基础知识总结 4:vue组件化开发
|
3天前
|
存储 JavaScript
Vue 状态管理工具vuex
Vue 状态管理工具vuex
|
9天前
|
缓存 JavaScript UED
Vue 中实现组件的懒加载
【10月更文挑战第23天】组件的懒加载是 Vue 应用中提高性能的重要手段之一。通过合理运用动态导入、路由配置等方式,可以实现组件的按需加载,减少资源浪费,提高应用的响应速度和用户体验。在实际应用中,需要根据具体情况选择合适的懒加载方式,并结合性能优化的其他措施,以打造更高效、更优质的 Vue 应用。
|
8天前
|
JavaScript
如何在 Vue 中使用具名插槽
【10月更文挑战第25天】通过使用具名插槽,你可以更好地组织和定制组件的模板结构,使组件更具灵活性和可复用性。同时,具名插槽也有助于提高代码的可读性和可维护性。
13 2
|
8天前
|
JavaScript
Vue 中的插槽
【10月更文挑战第25天】插槽的使用可以大大提高组件的复用性和灵活性,使你能够根据具体需求在组件中插入不同的内容,同时保持组件的结构和样式的一致性。
12 2
|
8天前
|
前端开发 JavaScript 容器
在 vite+vue 中使用@originjs/vite-plugin-federation 模块联邦
【10月更文挑战第25天】模块联邦是一种强大的技术,它允许将不同的微前端模块组合在一起,形成一个统一的应用。在 vite+vue 项目中,使用@originjs/vite-plugin-federation 模块联邦可以实现高效的模块共享和组合。通过本文的介绍,相信你已经了解了如何在 vite+vue 项目中使用@originjs/vite-plugin-federation 模块联邦,包括安装、配置和使用等方面。在实际开发中,你可以根据自己的需求和项目的特点,灵活地使用模块联邦,提高项目的可维护性和扩展性。
|
9天前
|
JavaScript 前端开发 UED
vue 提高 tree shaking 的效果
【10月更文挑战第23天】提高 Vue 中 Tree shaking 的效果需要综合考虑多个因素,包括模块的导出和引用方式、打包工具配置、代码结构等。通过不断地优化和调整,可以最大限度地发挥 Tree shaking 的优势,为 Vue 项目带来更好的性能和用户体验。
|
9天前
|
缓存 JavaScript UED
Vue 中异步加载模块的方式
【10月更文挑战第23天】这些异步加载模块的方式各有特点和适用场景,可以根据项目的需求和架构选择合适的方法来实现模块的异步加载,以提高应用的性能和用户体验
|
9天前
|
JavaScript 测试技术 UED
解决 Vue 项目中 Tree shaking 无法去除某些模块
【10月更文挑战第23天】解决 Vue 项目中 Tree shaking 无法去除某些模块的问题需要综合考虑多种因素,通过仔细分析、排查和优化,逐步提高 Tree shaking 的效果,为项目带来更好的性能和用户体验。同时,持续关注和学习相关技术的发展,不断探索新的解决方案,以适应不断变化的项目需求。
|
JavaScript
Vue的非父子组件之间传值
全局事件总线 一种组件间通信的方式,适用于任意组件间通信