Web前端 -----【Vue】(vue组件基础)一文带你了解组件的创建、注册、使用(包括组件的嵌套)

news2024/11/16 0:17:19

目录

前言

什么是组件

为什么使用组件化开发

组件的使用

组件的使用分为三个步骤

创建组件

为什么配置项中的data不能使用直接对象的形式,必须使用function(重点!!!面试喜欢问)

注册组件

使用组件

组件的嵌套


前言

本文介绍Vue组件,本文包括介绍如何创建组件、注册组件以及使用组件。并且包含组件的嵌套等内容

什么是组件

  1. 组件:实现应用中局部功能的代码和资源的集合。凡是采用组件方式开发的应用都可以称为组件化应用
  2. 模块:一个大的js文件按照模块化拆分规则进行拆分,生成多个js文件,每一个js文件叫做模块。凡是采用模块方式开发的应用都可以称为模块化应用
  3. 任何一个组件都可以包含这些资源:HTML、CSS、JS、图片、声音、视频等。从这个角度也可以说明组件是可以包含模块的。

为什么使用组件化开发

  1. 每一个组件都有独立的js,独立的css,这些独立的js和css只供当前组件使用,不存在从横交错,更加便于维护。
  2. 代码复用性增强。组件不仅让js css复用了,html代码片段也复用了(因为要使用组件直接引入组件即可)

组件的使用

组件的使用分为三个步骤

  1. 创建组件
  2. 注册组件
  3. 使用组件

创建组件

Vue.extend({该配置项和new Vue的配置项几乎相同,略有区别})

区别:

  1. 创建Vue组件的时候,配置项不能使用el配置项(但是需要template配置项来配置模板语句)
  2. 配置项中的data不能使用直接对象的形式,必须使用function。

例:

<div class="app">
        <h1>{{msg}}</h1>
        
    </div>
    <script>
        Vue.extend({
            template:`
            <ul>
            <li v-for="(item,index) in users" :key="item.id">
           {{index}}-----{{item.name}}
            </li>
            </ul>
            `,
            data(){
                return {
                    users:[
                    {id:'01',name:'zhangsan'},
                    {id:'02',name:'lisi'},
                    {id:'03',name:'wangwu'},
                ]
                }
            }
        })
        const vm = new Vue({
            el:'.app',
            data:{
                msg:'Vue组件',
                
            }
        })
    </script>
为什么配置项中的data不能使用直接对象的形式,必须使用function(重点!!!面试喜欢问)

如果我们直接使用对象的形式,当每次使用组件时,都是共享一份数据,这样的话就会造成页面数据混乱。应该是每个组件有自己独立的数据data,而我们使用function可以保证每次调用时,return返回的数据对象都不一样,这样就保证了数据的独立性,不会造成页面数据混乱

定义一个data,以对象的形式。a和b都指向data

let data ={

            num:1

         }

         let a = data

         let b = data

我们通过a.num和b.num直接访问

a修改data中的num为2,再通过b查看时,num已经变成了2。当b想使用num的数据时已经被修改了,所以会导致页面数据混乱

同理,将data改为funtion函数,a,b都是调用data函数

function data(){

            return {

                num:1

            }

         }

         let a = data()

         let b = data()

直接访问num

由图可以知道,当a修改data中的num为2时,b调用num依旧为1,互不影响。这样就不会造成页面数据混乱。所以配置项中的data不能使用直接对象的形式,必须使用function。

注册组件

注册组件分为局部注册和全局注册

局部注册:

在配置项当中使用components,语法格式:

components:{

        组件的名字:组件对象

}

全局注册:

Vue.component('组件的名字',组件对象)

使用组件

<组件的名字></组件的名字>

局部注册:

使用受限,只能在el配置项的容器中使用

<div class="app">
        <h1>{{msg}}</h1>
        <mylist></mylist>
    </div>
    <script>
      const myComponent =  Vue.extend({
            template:`
           <ul>
            <li v-for="(item,index) in users" :key="item.id">
           {{index}}-----{{item.name}}
            </li>
            </ul>
            `,
            data(){
                return {
                    users:[
                    {id:'01',name:'zhangsan'},
                    {id:'02',name:'lisi'},
                    {id:'03',name:'wangwu'},
                ]
                }
            }
        })
        const vm = new Vue({
            el:'.app',
            data:{
                msg:'Vue组件',
            },
            components:{
                mylist:myComponent
            }
        })
    </script>

全局注册:

可以在不同的容器中使用

 <div class="app">
        <h1>{{msg}}</h1>
        <mylist></mylist>
    </div>
    <div class="app2">
        <h1>{{msg}}</h1>
        <mylist></mylist>
    </div>
    <script>
      const myComponent =  Vue.extend({
            template:`
           <ul>
            <li v-for="(item,index) in users" :key="item.id">
           {{index}}-----{{item.name}}
            </li>
            </ul>
            `,
            data(){
                return {
                    users:[
                    {id:'01',name:'zhangsan'},
                    {id:'02',name:'lisi'},
                    {id:'03',name:'wangwu'},
                ]
                }
            }
        })
        Vue.component('mylist',myComponent)
        const vm = new Vue({
            el:'.app',
            data:{
                msg:'Vue组件',
            },
        })
        const vm2 = new Vue({
            el:'.app2',
            data:{
                msg:'全局注册',
            },
        })
    </script>

注册时可以在创建组件时,可以省略Vue.extend()

const myComponent = {

            template:`

           <ul>

            <li v-for="(item,index) in users" :key="item.id">

           {{index}}-----{{item.name}}

            </li>

            </ul>

            `,

            data(){

                return {

                    users:[

                    {id:'01',name:'zhangsan'},

                    {id:'02',name:'lisi'},

                    {id:'03',name:'wangwu'},

                ]

                }

            }

        }

        Vue.component('mylist',myComponent)

在注册时,底层会调用Vue.extend()方法,myComponent相当于一个对象传给底层去处理

组件的嵌套

如上图,最上面的就是Vue实例,第二层就是Vue实例挂载的组件,第三层就是组件的嵌套,组件挂载的组件。组件的嵌套就是给创建好的组件继续向下挂载组件,而不是挂载在Vue实例身上

<div class="app">
        <root></root>
    </div>
    <script>
        const x = {
            template:`
            <div>
                <h2>我是组件x</h2>
            </div>
            `
        }
        const y = {
            template:`
            <div>
                <h2>我是组件y</h2>
            </div>
            `
        }
        // 创建组件
        const root = {
            template:`
            <div>
                <h1>我是组件root</h1>
                <x></x>
                <y></y>
            </div>
            `,
            components:{
                x:x,
                y:y
            }
        }
        const vm= new Vue({
            el:'.app',
            components:{
                root:root
            }
        })
    </script>

如上代码,组件的嵌套也是先要遵循三步,创建,注册,使用。在哪个身上注册就要在身上应用。为了便捷,可以将组件名和组件对象同名,在对象中,key:value相同可以省略value,直接key名即可

<div class="app">

        <root></root>

    </div>

    <script>

        const x = {

            template:`

            <div>

                <h2>我是组件x</h2>

            </div>

            `

        }

        const y = {

            template:`

            <div>

                <h2>我是组件y</h2>

            </div>

            `

        }

        // 创建组件

        const root = {

            template:`

            <div>

                <h1>我是组件root</h1>

                <x></x>

                <y></y>

            </div>

            `,

            components:{x,y}

        }

        const vm= new Vue({

            el:'.app',

            components:{root}

        })

    </script>

如图,在Vue实例身上挂载了组件root,在组件身上挂载了x和y两个组件。这样组件的嵌套就完成了

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1250965.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【经验分享】开发问题记录总结(持续更新)

目录 工具开发 界面类继承某自定义界面类时&#xff0c;出现布局混乱或者所有控件集中在左上角&#xff1f; 在继承自定义界面之后&#xff0c;以诸如 on_xxx_clicked() 模式设计的槽函数失效了? 使用pugi接口取出文本数据后&#xff0c;为什么该变量无法进行字符串比较&…

华硕V4050E笔记本安装Win10不识别硬盘解决方法

笔记本硬件参数&#xff1a; ASUS VivoBook14 V4050E 型 号 V4050EP1135-0DAKXQ2X10 制造日期 2020-12 12M C P U 11th Gen Intel(R)Core(TM)i5-1135G72.4GHz 2.42GHz 4核心 8线程 L2&#xff1a;5MB L3&#xff1a;8MB 内 存 16.0GB &#xff08;8Gb X2 320…

多目标水母搜索算法(MOJS)求解微电网优化MATLAB

一、微网系统运行优化模型 微电网优化模型介绍&#xff1a; 微电网多目标优化调度模型简介_IT猿手的博客-CSDN博客 二、多目标水母搜索算法MOJS 多目标水母搜索算法&#xff08;Multi-Objective Jellyfish Search algorithm&#xff0c;MOJS&#xff09;由Jui-Sheng Chou等…

持续增长的背后,艾比森用泛微-千里聆RPA机器人为业务加速

&#xff08;艾比森全球总部&#xff09; 艾比森集团始创于2001年&#xff0c;是全球知名的至真LED显示应用与服务提供商。目前旗下设有深圳总部&#xff0c;艾比森东江智造中心&#xff0c;以及艾比森美国、德国、日本、迪拜、俄罗斯、墨西哥、巴西、中国香港等18家海内外公司…

css中flex两列布局(一列自适应其他固定)

问题 最近写一个布局的时候&#xff0c;遇到一个问题。如下图的布局。在没有图片的时候布局是正常的&#xff0c;如果有图片且设置了width:100%;height: 100%; 则会出现图片将自适应布局撑开的情况。 我的解决方式是让图片不缩放&#xff0c;图片外层再添加一个div元素。形如…

linux rpm安装软件卸载 以卸载mysql为例

查看rpm包 rpm -qa | grep 内容 卸载rpm rpm -e --nodeps rpm名称

「最优化基础知识2」一维搜索,以及python代码

最优化基础知识&#xff08;2&#xff09; 无约束优化问题&#xff0c;一维搜索 一、一维搜索 一维搜索的意思是在一个方向上找到最小点。 用数学语言描述&#xff0c;X*Xk tPk&#xff0c;从Xk沿着Pk方向行走t到达最小点X*。 1、收敛速度&#xff1a; 线性收敛&#xff1…

zookeeper 单机伪集群搭建简单记录

1、官方下载加压后&#xff0c;根目录下新建data和log目录&#xff0c;然后分别拷贝两份&#xff0c;分别放到D盘&#xff0c;E盘&#xff0c;F盘 2、data目录下面新建myid文件&#xff0c;文件内容分别为1&#xff0c;2&#xff0c;3.注意文件没有后缀&#xff0c;不能是txt文…

kolla-ansible 部署OpenStack云计算平台

目录 一、环境 二、安装及部署 三、测试 一、环境 官方文档&#xff1a;https://docs.openstack.org/kolla-ansible/yoga/user/quickstart.html rhel8.6 网络设置&#xff1a; 修改网卡名称 网络IP&#xff1a; 主机名&#xff1a; 网络时间协议 配置软件仓库 vim docke…

ubuntu 使用webrtc_ros 编译linux webrtc库

ubuntu 使用webrtc_ros 编译linux webrtc库 webrtc_ros 使用WebRTC流式传输ROS图像主题 该节点提供了一个WebRTC对等方&#xff0c;可以将其配置为流ROS图像主题并接收发布到ROS图像主题的流。 该节点托管一个提供简单测试页面的Web服务器&#xff0c;并提供可用于创建和配置W…

torch.nn.batchnorm1d,torch.nn.batchnorm2d,torch.nn.LayerNorm解释:

批量归一化是一种加速神经网络训练和提升模型泛化能力的技术。它对每个特征维度进行标准化处理&#xff0c;即调整每个特征的均值和标准差&#xff0c;使得它们的分布更加稳定。 Batch Norm主要是为了让输入在激活函数的敏感区。所以BatchNorm层要加在激活函数前面。 1.torch.…

万字解析设计模式之策略模式、命令模式

一、策略模式 1.1概述 先看下面的图片&#xff0c;我们去旅游选择出行模式有很多种&#xff0c;可以骑自行车、可以坐汽车、可以坐火车、可以坐飞机。 策略模式&#xff08;Strategy Pattern&#xff09;是一个行为型设计模式&#xff0c;它定义了一组算法家族&#xff0c;分…

ubuntu22.04 安装 jupyterlab

JupyterLab Install JupyterLab with pip: pip install jupyterlabNote: If you install JupyterLab with conda or mamba, we recommend using the conda-forge channel. Once installed, launch JupyterLab with: jupyter lab

C/C++ 运用Npcap发送UDP数据包

Npcap 是一个功能强大的开源网络抓包库&#xff0c;它是 WinPcap 的一个分支&#xff0c;并提供了一些增强和改进。特别适用于在 Windows 环境下进行网络流量捕获和分析。除了支持通常的网络抓包功能外&#xff0c;Npcap 还提供了对数据包的拼合与构造&#xff0c;使其成为实现…

83基于matlab 的时钟时间识别GUI

基于matlab 的时钟时间识别GUI。图像去除背景-转化为二值化图像-找出对应的直线边缘-找到秒针、分针、时针对应的直线&#xff0c;并算出斜率、角度-判断时间&#xff0c;分针与时针 &#xff08;度数&#xff09;。数据可更换自己的&#xff0c;程序已调通&#xff0c;可直接运…

Shell编程基础 – 变量(Variables)

Shell编程基础 – 变量&#xff08;Variables&#xff09; Shell Scripting Essentials – Variables Bash变量作为shell脚本的重要组成部分&#xff0c;提供了在Unix/Linux命令行界面操作和保存数据的方法。 本文简要介绍Bash Shell脚本变量的基础知识以及应用&#xff0c;包…

Python中classmethod的妙用

更多Python学习内容&#xff1a;ipengtao.com 在Python中&#xff0c;classmethod装饰器为开发者提供了一种强大的工具&#xff0c;使得类方法的定义和使用更加灵活。本文将深入探讨classmethod的妙用&#xff0c;通过丰富的示例代码展示其在不同场景下的实际应用。 类方法与实…

Visual Studio 中文注释乱码解决方案

在公司多人开发项目中经常遇到拉到最新代码&#xff0c;发现中文注释都是乱码&#xff0c;很是emjoy..... 这是由于编码格式不匹配造成的&#xff0c;如果你的注释是 UTF-8 编码&#xff0c;而文件编码是 GBK 或者其他编码&#xff0c;那么就会出现乱码现象。一般的解决办法是…

【鬼鬼鬼iiARPG开发记录】

鬼鬼鬼ARPG开发记录 一、创建项目1、创建3D(URP)项目2、导入新的输入系统&#xff08;input system&#xff09;3、勾选Enter Play Mode Options 二、导入资源1、创建若干文件夹 一、创建项目 1、创建3D(URP)项目 2、导入新的输入系统&#xff08;input system&#xff09; …

lvm 扩容根分区失败记录

lvm 扩容根分区失败记录 1、问题描述2、错误描述3、解决方法重启系统进入grub界面&#xff0c;选择kernel 2.x 启动系统。然后同样的resize2fs命令扩容成功。 1、问题描述 根分区不足。 系统有2个内核版本&#xff0c;一个是kernel 2.x&#xff0c;另一个是kernel 4.x。 这次l…