【Vue】Vue组件--上

目录

一、组件基础

二、组件的嵌套关系

1. 基础架构

2. 嵌套 

三、组件注册方式

1. 局部注册:

2. 全局注册:

四、组件传递数据

1. 基础架构

2. 传递多值

3.  动态传递数据

五、组件传递多种数据类型

1. Number

2. Array

3. Object

六、组件传递Props的校验

 1. 默认值

2. 必选项


一、组件基础

        组件最大的优势就是可复用性

        当使用构建步骤时,我们一般将vue组件定义在一个单独的.vue文件当中,这就被叫做单文件组织(SFC)

         组件组成结构 ----> 在components文件当中新建文件MyApp.vue

<template>
    <div class="container">{{ message }}</div>
</template>
<script>
    export default{
        data(){
            return{
                message:'组件基础组成'
            }
        }
    }
</script>
<!-- 让当前样式只在当前组件中生效 ,如果不加scoped那么.container将会是全局样式在任何组件当中使用-->
<style scoped>
    .container{
        font-size: 30px;
        color: red;
    }
</style>

        组件引用结构-----在App.vue当中设置如下属性:

<script>
   //第一步引入组件
   import MyApp  from './components/MyApp.vue';

   export default{
        //第二步:注册组件
        components:{
            MyApp
        }
   }
</script>
<template>
    <!--第三步:显示组件-->
    <MyApp/>
</template>


二、组件的嵌套关系

 

        组件允许我们将UI划分为独立的、可重用的部分,并且可以对每个部分进行单独的思考。在实际应用中,组件常常被组织成层层嵌套的树状结构

        这和我们嵌套HTML元素的方式类似,Vue实现了自己的组件模型,使我们可以在每个组件内封装自定义内容与逻辑。

        新建pages文件夹,并创建以下文件‘

1. 基础架构

Header.vue

<template>
    <h3>Header</h3>
</template>
<style scoped>
    h3{
        width: 100%;
        height: 120px;
        border: 4px solid #333;
        text-align: center;
        line-height: 100px;
        box-sizing: border-box;
    }
</style>

在App.vue当中注册

<script>
  import Header from './components/Header.vue';
  export default{
    data(){

    },
    components:{
      Header
    }
  }
</script>
<template>
  <Header/>
</template>

 Main.vue:

<template>
    <div class="main">
        <h4>Main</h4>
    </div>
    
</template>

<style scoped>
    .main{
        float: left;
        width: 60%;
        height: 400px;
        border: 4px solid #333;
        text-align: center;
        line-height: 100px;
        box-sizing: border-box;
    }
    .main h4{
        text-align: center;
        background-color: beige;
    }
</style>

 Aside.vue:

<template>
    <div class="aside">
        <h4>Aside</h4>
    </div>
    
</template>

<style scoped> 
    .aside{
        float: right;
        width: 30%;
        height: 400px;
        border: 4px solid #333;
        text-align: center;
        line-height: 100px;
        box-sizing: border-box;
    }
</style>

2. 嵌套 

新建Article.vue:

<template>
    <h5>Article</h5>
</template>
<style>
    h5{
        width:80%;
        margin:0 auto;
        text-align: center;
        line-height: 50px;
        box-sizing: border-box;
        margin-top: 20px;
        background:#999;
    }
</style>

main.vue里引用article.vue

<template>
    <div class="main">
        <h4>Main</h4>
        <Article/>
        <Article/>
    </div>
    
</template>
<script>
    import Article from './Article.vue';
    export default{
        components:{
            Article
        }
    }
</script>
<style scoped>
    .main{
        float: left;
        width: 60%;
        height: 400px;
        border: 4px solid #333;
        text-align: center;
        line-height: 100px;
        box-sizing: border-box;
    }
    .main h4{
        text-align: center;
        background-color: beige;
    }
</style>

新建item.vue:

<template>
    <h5>Item</h5>
</template>
<style scoped>
    h5{
        width:80%;
        margin: 0 auto;
        text-align: center;
        line-height: 100px;
        box-sizing: border-box;
        margin-top: 10px;
        background:#999;
    }   
</style>

aside.vue里引用item.vue:

<template>
    <div class="aside">
        <h4>Aside</h4>
        <Item/>
        <Item/>
    </div>
    
</template>
<script>
    import Item from './Item.vue';
    export default{
        components:{
            Item
        }
    }
</script>
<style scoped> 
    .aside{
        float: right;
        width: 30%;
        height: 400px;
        border: 4px solid #333;
        text-align: center;
        line-height: 100px;
        box-sizing: border-box;
    }
</style>

最终效果:


三、组件注册方式

        一个Vue组件在使用前需要先被“注册”,这样Vue才能在渲染模板时找到其对应的实现。组件注册有两种方式:全局注册和局部注册

1. 局部注册

        前边讲的方案就是局部注册

2. 全局注册

我们这里使用Header.vue来进行全局注册,

:那么首先在App.vue当中取消局部注册。

:在main.js当中设置全局注册方式

:最终在哪里需要就在哪里引入

全局注册虽然很方便,但有以下几个问题

        1.全局注册,但并没有被使用的组件无法在生产打包时被自动移除(也叫“tree-shaking”)。如果你全局注册了一个组件,即使它并没有被实际使用,它仍然会出现在打包后的JS文件中

        2.全局注册在大型项目中使项目的依赖关系变得不那么明确。在父组件中使用子组件时,不太容易定位子组件的实现。和使用过多的全局变量一样,这可能会影响应用长期的可维护性

局部注册需要使用components选项。


四、组件传递数据

        组件与组件之间不是完全独立的,而是有交集的,那就是组件与组件之间是可以传递数据的传递数据的解决方案就是props

1. 基础架构

        首先我们新建一个Parent.vue

<template>
    <h3>Parent</h3>
</template>
<script>
    export default{
        data(){
            return{
            }
        } 
    }
</script>

其次我们再新建Child.vue

<template>
    <h3>Child</h3>
</template>
<script>
    export default{
        data(){
            return{
            }
        }
    }
</script>

我们让Parent.vue给Child.vue传值,不过在此之前我们先让Parent成为Child的父组件。

 

2. 传递多值

也可以传递多个值

 

3.  动态传递数据

 

注意事项:

        props 传递数据,只能从父级传递到子级,不能反其道而行


五、组件传递多种数据类型

        通过props传递数据,不仅可以传递字符串类型的数据,还可以是其他类型,例如:数字、对象、数组等。但实际上任何类型的值都可以作为props的值被传递。

1. Number

parent.vue:

<template>
    <h3>Parent</h3>
    <Child :title="message" :age="age"></Child>
</template>
<script>
    import Child from './Child.vue'
    export default{
        data(){
            return{
                message:"我是动态的数据!!!",
                age:20
            }
        },
        components:{
            Child
        }
    }
</script>

Child.vue:

<template>
    <h3>Child</h3>
    <p>{{ title }}</p>
    <p>{{ age }}</p>
</template>
<script>
    export default{
        data(){
            return{

            }
        },
        props:["title","age"]
    }
</script>

2. Array

parent.vue:

<template>
    <h3>Parent</h3>
    <Child :title="message" :age="age" :names="names"></Child>
</template>
<script>
    import Child from './Child.vue'
    export default{
        data(){
            return{
                message:"我是动态的数据!!!",
                age:20,
                names:["张三","李四","王五"]
            }
        },
        components:{
            Child
        }
    }
</script>

child.vue:

<template>
    <h3>Child</h3>
    <p>{{ title }}</p>
    <p>{{ age }}</p>
    <ul>
        <li v-for="(item,index) of names" :key="index">{{ item }}</li>
    </ul>
</template>
<script>
    export default{
        data(){
            return{

            }
        },
        props:["title","age","names"]
    }
</script>

3. Object

parent.vue:

<template>
    <h3>Parent</h3>
    <Child :title="message" :age="age" :names="names" :userInfo="userInfo"></Child>
</template>
<script>
    import Child from './Child.vue'
    export default{
        data(){
            return{
                message:"我是动态的数据!!!",
                age:20,
                names:["张三","李四","王五"],
                userInfo:{
                    name:"admin",
                    age:20
                }
            }
        },
        components:{
            Child
        }
    }
</script>

child.vue:

<template>
    <h3>Child</h3>
    <p>{{ title }}</p>
    <p>{{ age }}</p>
    <ul>
        <li v-for="(item,index) of names" :key="index">{{ item }}</li>
    </ul>
    <p>{{ userInfo.name }}</p>
    <p>{{ userInfo.age }}</p>
</template>
<script>
    export default{
        data(){
            return{

            }
        },
        props:["title","age","names","userInfo"]
    }
</script>


六、组件传递Props的校验

        Vue组件可以更细致地声明对传入的props的校验要求。

以下例子为接收  String  类型传输  number  控制台警告:

<script>
import ComponentB from './ComponentB.vue';
export default{
    data(){
    return{
      title:20
    }
  },
    components:{
      ComponentB
    }
}
</script>
<style>
</style>
<template>
    <h3>ComponentA</h3>
    <ComponentB :title="title"/>
  </template>
<template>
    <h3>ComponentB</h3>
    <p>{{ title }}</p>
</template>
<script>
export default{
    data(){
        return{
           
        }
    },
    props:{
        title:{
            type:String
        }
    }
}
</script>

 

 可以接收多种类型

props:{
   title:{
       type:[String,Number,Array,Object]
   }
}

 1. 默认值

        模拟情况:传递数据的时候并没有真实传递。

         数字和字符串可以直接default,但是如果是数组和对象,必须通过工厂函数返回默认值。

 

<template>
    <h3>ComponentA</h3>
    <ComponentB :title="title" :age="age" :names="names"/>
</template>

<script>

import ComponentB from './ComponentB.vue';

export default{
    data(){
        return{
            title:"测试",
            //age:20,
            //names:["Tom","Bob"]
        }
    },
    components:{
        ComponentB
    }
}
</script>
________________________________________________________________________________
<template>
    <h3>ComponentB</h3>
    <p>{{ title }}</p>
    <p>{{ age }}</p>
    <ul>
        <li v-for="(name,index) of names" :key="index">{{ name }}</li>
    </ul>
</template>

<script>
export default{
    data(){
        return{

        }
    },
    props:{
        title:{
            type:[String,Number,Array,Object]
        },
        age:{
            type:Number,
            default:0
        },
        //数字和字符串可以直接default,但是如果是数组和对象,必须通过工厂函数返回默认值
        names:{
            type:Array,
            default(){
                return ["xxx"]
            }
        }
    }
}
</script>

2. 必选项

        没有传值就会提示警告。

 

<template>
  <h3>ComponentA</h3>
  <ComponentB :title="title" :age="age" :names="names"/>
</template>

<script>

import ComponentB from './ComponentB.vue';

export default{
  data(){
      return{
          // title:"测试",
          age:20,
          names:["Tom","Bob"]
      }
  },
  components:{
      ComponentB
  }
}
</script>
<template>
    <h3>ComponentB</h3>
    <p>{{ title }}</p>
    <p>{{ age }}</p>
    <ul>
        <li v-for="(name,index) of names" :key="index">{{ name }}</li>
    </ul>
</template>

<script>
export default{
    data(){
        return{

        }
    },
    props:{
        title:{
            type:[String,Number,Array,Object],
            required:true
        },
        age:{
            type:Number,
            default:0
        },
        //数字和字符串可以直接default,但是如果是数组和对象,必须通过工厂函数返回默认值
        names:{
            type:Array,
            default(){
                return ["xxx"]
            }
        }
    }
}
</script>

注意:

        props 是只读的,不允许修改父元素传递过来的数据。

<template>
    <h3>ComponentB</h3>
    <p>{{ title }}</p>
    <p>{{ age }}</p>
    <ul>
        <li v-for="(name,index) of names" :key="index">{{ name }}</li>
    </ul>
    <button @click="update">update</button>
</template>

<script>
export default{
    data(){
        return{

        }
    },
    props:{
        title:{
            type:[String,Number,Array,Object],
            required:true
        },
        age:{
            type:Number,
            default:0
        },
        //数字和字符串可以直接default,但是如果是数组和对象,必须通过工厂函数返回默认值
        names:{
            type:Array,
            default(){
                return ["xxx"]
            }
        }
    },
    methods:{
        update(){
            console.log(this.title);
            this.title="新数据"
        }
    }
}
</script>

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

鸿蒙UI开发——键盘弹出避让模式设置

1、概 述 我们在鸿蒙开发时&#xff0c;不免会遇到用户输入场景&#xff0c;当用户准备输入时&#xff0c;会涉及到输入法的弹出&#xff0c;我们的界面针对输入法的弹出有两种避让模式&#xff1a;上抬模式、压缩模式。 下面针对输入法的两种避让模式的设置做简单介绍。 2、…

python Streamlit和AKShare 实现的股票数据查询系统

1. 系统概述 这是一个基于Streamlit和AKShare的股票数据查询系统&#xff0c;提供了便捷的股票数据查询和可视化功能。系统支持按板块筛选股票、多股票代码查询、数据导出等功能。 1.1 主要功能 股票代码直接输入查询按板块筛选和选择股票历史数据和实时行情查询财务报表数据…

蓝桥杯备赛:顺序表和单链表相关算法题详解(上)

目录 一.询问学号&#xff08;顺序表&#xff09; 1.题目来源&#xff1a; 2.解析与代码实现&#xff1a; &#xff08;1&#xff09;解析&#xff1a; &#xff08;2&#xff09;代码实现&#xff1a; 二.寄包柜&#xff08;顺序表&#xff09; 1.题目来源&#xff1a; …

数据结构-ArrayLIst-一起探索顺序表的底层实现

各位看官早安午安晚安呀 如果您觉得这篇文章对您有帮助的话 欢迎您一键三连&#xff0c;小编尽全力做到更好 欢迎您分享给更多人哦 大家好&#xff0c;我们今天来学习java数据结构的第一章ArrayList&#xff08;顺序表&#xff09; 1.ArrayList的概念 那小伙伴就要问了线性表到…

RabbitMQ(四)

SpringBoot整合RabbitMQ SpringBoot整合1、生产者工程①创建module②配置POM③YAML④主启动类⑤测试程序 2、消费者工程①创建module②配置POM③YAML文件内配置&#xff1a; ④主启动类⑤监听器 3、RabbitListener注解属性对比①bindings属性②queues属性 SpringBoot整合 1、生…

初始Java4

目录 一.继承 1.定义&#xff1a; 2.继承的语法&#xff1a; 3.子类访问父类 4.子类构造方法 5.super与this 6.继承方法 7.final关键字 &#xff08;1&#xff09;.变量不变 &#xff08;2&#xff09;.方法不变 &#xff08;3&#xff09;.类不可继承 8.继承与组合…

极限竞速 地平线5“d3dx12_43.dll”文件丢失或错误导致游戏运行异常如何解决?windows系统DLL文件修复方法

d3dx12_43.dll是存放在windows系统中的一个重要dll文件&#xff0c;缺少它可能会造成部分软件不能正常运行。当你的电脑弹出提示“无法找到d3dx12_43.dll”或“计算机缺少d3dx12_43.dll”等错误问题&#xff0c;请不用担心&#xff0c;我们将深入解析DLL文件错误的成因&#xf…

Leecode刷题C语言之超过阈值的最小操作数②

执行结果:通过 执行用时和内存消耗如下&#xff1a; // 最小堆的节点结构体 typedef struct {long long* heap;int size;int capacity; } MinHeap;// 初始化最小堆 MinHeap* createMinHeap(int capacity) {MinHeap* minHeap (MinHeap*)malloc(sizeof(MinHeap));minHeap->s…

[Qt]常用控件介绍-按钮类控件-QPushButton、QRedioButton、QCheckBox、QToolButton控件

目录 1.QPushButton按钮 介绍 属性 Demo&#xff1a;键盘方向键控制人物移动 2.Redio Button按钮 属性 clicked、pressed、released、toggled区别 单选按钮的分组 Demo&#xff1a;点餐小程序 3.CheckBox按钮 属性 Demo&#xff1a;获取今天的形成计划 4.ToolBu…

寒假第一次牛客周赛 Round 76回顾

AC数&#xff1a;2&#xff08;A、C&#xff09; B 思路&#xff1a; 等价于求&#xff1a; 数量最多的字符 #include<stdio.h> int main() {int n,num;int a[26]{0};//用于存储字母 a 到 z 的出现次数。scanf("%d",&n);char s[n];scanf("%s",s)…

StyleGaussian: Instant 3D Style Transferwith Gaussian Splatting 论文解读

目录 一、概述 二、相关工作 1、辐射场 2、3D编辑 3、风格迁移 三、StyleGaussian 1、特征嵌入 2、风格迁移 3、解码 四、实验 1、不同backbone下的量化和定性指标 2、解码器设计上的测试 3、内容损失平衡 4、风格平滑插值 一、概述 提出了StyleGaussian&#x…

基于django实现类似ebay的电子商务系统全英文

完整源码项目包获取→点击文章末尾名片&#xff01;

win32汇编环境,窗口程序中组合框的应用举例

;运行效果 ;win32汇编环境,窗口程序中组合框的应用举例 ;比如在窗口程序中生成组合框&#xff0c;增加子项&#xff0c;删除某项&#xff0c;取得指定项内容等 ;直接抄进RadAsm可编译运行。重点部分加备注。 ;以下是ASM文件 ;>>>>>>>>>>>>…

Docker 镜像制作原理 做一个自己的docker镜像

一.手动制作镜像 启动容器进入容器定制基于容器生成镜像 1.启动容器 启动容器之前我们首先要有一个镜像&#xff0c;这个镜像可以是从docker拉取&#xff0c;例如&#xff1a;现在pull一个ubuntu镜像到本机。 docker pull ubuntu:22.04 我们接下来可以基于这个容器进行容器…

微信小程序获取openid

2025年1月15日&#xff1a; 1、现在云服务器上安装nodejs&#xff0c;然后写个get接口&#xff1a; const express require(express); const app express();app.get(/getOpenid,(req,res)>{res.send("success"); })app.listen(3000,()>{console.log(server…

ASP.NET Core - 配置系统之配置添加

ASP.NET Core - 配置系统之配置添加 2. 配置添加 2. 配置添加 配置系统可以读取到配置文件中的信息&#xff0c;那必然有某个地方可以将配置文件添加到配置系统中。之前的文章中讲到 ASP.NET Core 入口文件中&#xff0c;builder(WebApplicationBuilder 对象) 中有一个 Config…

C#中通道(Channels)的应用之(生产者-消费者模式)

一.生产者-消费者模式概述 生产者-消费者模式是一种经典的设计模式&#xff0c;它将数据的生成&#xff08;生产者&#xff09;和处理&#xff08;消费者&#xff09;分离到不同的模块或线程中。这种模式的核心在于一个共享的缓冲区&#xff0c;生产者将数据放入缓冲区&#x…

ArcSegment绘制及计算

ArcSegment绘制及计算 给定起始点、终止点和 bulge 值计算弧线中心点和半径&#xff0c;绘制ArcSegment。 import math def calculate_arc_center_and_radius(x1, y1, x2, y2, bulge):angle4*math.atan(bulge)# 计算弦中点mid_x (x1 x2) / 2mid_y (y1 y2) / 2# 计算弦长的…

【高可用自动化体系】自动化体系

架构设计的愿景就是高可用、高性能、高扩展、高效率。为了实现架构设计四高愿景&#xff0c;需要实现自动化系统目标&#xff1a; 标准化。 流程自助化。 可视化&#xff1a;可观测系统各项指标、包括全链路跟踪。 自动化&#xff1a;ci/cd 自动化部署。 精细化&#xff1a…

FakeLocation 1599 | 内部旧版

前言:FakeLocation又更新了,在某安上面看见一些&#xff0c;大概问题就是地图没了&#xff0c;然后有更难搞了 任务一 我们先去看看地图是怎么个事情 这里用的是百度地图就没有了哈 高德地图是有的 任务二 null 选择成功了&#xff0c;虽然是null 任务三 地图位置 虽然不显示了…