Vue--》详解vue组件及其组件化的使用

news2024/11/25 5:04:10

目录

Vue组件

非单文件组件

单文件组件

组件的组成部分

组件中定义methods方法

vue-cli中组件的使用步骤

vue-cli中注册全局组件

组件的props属性

props中的常用属性

组件间的样式冲突


Vue组件

vue是一个支持组件化开发的前端框架。什么是组件化开发?组件化开发是指:根据封装的思想,把页面上可重用的UI结构封装为组件,从而方便项目的开发与维护。vue中规定:组件的后缀名是.vue。用vue-cli搭建自动生成的App.vue文件本质上就是一个vue组件。

组件

定义:用来实现局部(特定)功能效果的代码集合(html/css/js/images...)

作用:一个界面的功能很复杂,组件能复用编码,简化项目编码,提高运行效率

组件化

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

非单文件组件

非单文件组件:一个文件中包含有n个组件,说白了就是借助vue框架链接书写,这种开发方式日常项目用的很少,在此讲解仅作了解即可。

要想使用组件,应该知道其使用的步骤是啥,如下:

一、定义组件(创建组件)

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

el不要写:最终所有的组件都要经过一个vm的管理,由vm中的el决定服务哪个容器。

data必须写成函数:避免组件被复用时,数据存在引用关系。

二、注册组件

局部注册:靠new Vue的时候传入components选项

全局注册:靠Vue.component('组件名',组件)

三、使用组件(书写组件标签)

<组件名></组件名>

<body>
    <div id="root">
        <!-- 第三步:编写组件标签 -->
        <school></school>
        {{msg}}
        <hr>
        <student></student>
        <hello></hello>
    </div>
    <script src="../Vue.js/vue.js"></script>
    <script>
        Vue.config.productionTip = false; //阻止 vue 在启动时生成生产提示

        // 第一步:创建school组件
        const school = Vue.extend({
            template:`
                <div>
                    <h2>学校名称:{{schoolName}}</h2>    
                    <h2>学校地址:{{address}}</h2>
                </div>
            `,
            data(){
                return {
                    schoolName:'清华',
                    address:'北京'
                }
            }
        });
        
        // 第一步:创建student组件
        const student = Vue.extend({
            template:`
                <div>
                    <h2>学生姓名:{{studentName}}</h2>    
                    <h2>学生性别:{{studentSex}}</h2>    
                    <button @click="showName">点击弹窗显示学生姓名</button>
                </div>
            `,
            data(){
                return {
                    studentName:'张三',
                    studentSex:'男'
                }
            },
            methods: {
                showName(){
                    alert(this.studentName)
                }
            },
        })

        // 第一步:创建全局组件Hello
        const hello = Vue.extend({
            template:`
                <div>hello {{name}}</div>
            `,
            data(){
                return {
                    name:'world'
                }
            }
        })

        // 第二步:注册全局组件
        Vue.component('hello',hello)
        
        const vm = new Vue({
            data:{
                msg:'hello world'
            },
            // 第二步:注册组件
            components: {
                school,
                student
            },
        })
        vm.$mount('#root')
    </script>
</body>

单文件组件

单文件组件:一个组件都是以 .vue 结尾的文件,便于文件数据的管理,在日常项目开发中经常使用这种方式。

组件的组成部分

每个 .vue 组件都由三部分构成,分别是:

template:组件的模板结构

script:组件的JavaScript行为

style:组件的样式

<!-- 书写页面结构 -->
<template>
  <div class="Vue">
    Vue--{{username}}
  </div>
</template>
<!-- 书写JS行为 -->
<script>
  // 固定写法:默认导出!
  export default {
    // 在组件中 data 必须是个函数
    data() {
      return {
        // 这个 return 出去的{},可以定义数据
        username:'组件'
      }
    },
  }
</script>
<!-- 书写组件的样式 -->
<style>
  .Vue{
    color:#008c8c;
  }
</style>

组件中定义methods方法

在vue组件中定义的methods方法和调用vue库时使用方式一致,如下:

<!-- 书写页面结构 -->
<template>
  <div class="Vue">
    Vue--{{username}}
   <button @click="changeName">点击改变名字</button>
  </div>
</template>
<!-- 书写JS行为 -->
<script>
  // 固定写法:默认导出!
  export default {
    // 在组件中 data 必须是个函数
    data() {
      return {
        // 这个 return 出去的{},可以定义数据
        username:'组件'
      }
    },
    methods:{
      changeName(){
        if(this.username=='组件'){
          this.username = 'zujian'
        }else{
          this.username = '组件'
        }
      }
    },
    // 当前组件中的侦听器
    watch:{},
    // 当前组件中的计算属性
    computed:{},
    // 当前组件中的过滤器
    filters:{}
  }
</script>
<!-- 书写组件的样式 -->
<style>
  .Vue{
    color:#008c8c;
  }
</style>

vue-cli中组件的使用步骤

项目中除了根组件还可以自定义其他组件使用。组件在被封装好之后,彼此之间是相互独立的,不存在父子关系,在使用组件的时候,根据彼此的嵌套关系,形成了父子关系、兄弟关系

那么如何在项目中使用其他自定义组件呢?看如下的组件使用步骤:

<template>
  <div class="app-container">
    <h2>vue组件</h2>
    <Left></Left>
    <Right></Right>
  </div>
</template>

<script>

  import Left from '@/components/Left.vue'
  import Right from '@/components/Right.vue'

  // 固定写法:默认导出!
  export default {
    components:{
      Left,
      Right
    },  
  }

</script>

<style>
  .app-container{
    color:#008c8c;
  }
</style>

我们在App.vue注册使用Left和Right组件,但是在Left中是不能用Right组件的,如果想用又得重新在Left中注册Right组件,能不能简化这种方式呢?

vue-cli中注册全局组件

在vue项目的 main.js 入口文件中,通过 Vue.component() 方法,可以注册全局组件,如下:

// 导入需要全局注册的组件
import Global from '@/components/Global.vue'

// 参数1:字符串格式,表示组件的“注册名称”
// 参数2:需要被全局注册的那个组件
Vue.component('Myglobal',Global)

能够设置为全局组件的,一定是频繁使用的组件。

import Vue from 'vue'
import App from './App.vue'

// 导入需要被全局注册的那个组件
import Global from '@/components/Global.vue'
Vue.component('Myglobal',Global)

Vue.config.productionTip = false

// 创建 Vue 的实例对象
new Vue({
  // 把render函数指定的组件,渲染到 HTML 页面中。
  render: h => h(App),
}).$mount('#app')

组件的props属性

props是组件的自定义属性,允许使用者通过自定义属性,为当前组件指定初始值,在封装全局(通用)组件的时候,合理地使用props可以极大的提高组件的复用性。 其语法格式如下:

<script>
    export default{
        // 自定义属性,props中的数据可以直接在模板结构被使用
        props:['init'],
        data(){
            return {
                Global:this.init
            }
        }
    }
</script>

vue规定:组件中封装的自定义属性是只读的,程序员不能直接修改 props 的值。否则会直接报错:

如果要想修改 props 的值,可以把 props 的值转存到 data 中,因为 data 中的数据是可读可写的。

props:['init'],
data(){
    return {
        Global:this.init
    }
}

props中的常用属性

在声明自定义属性时,可以通过 default属性 来定义属性的默认值,代码如下:

export default{
    props:{
        init:{
            // 如果外界使用该组件时,没有传递init属性,则默认值生效
            default:0
        }
    }
}

在声明自定义属性时,可以通过 type属性 来定义属性的值类型,代码如下:

export default{
    props:{
        init:{
            // 用default属性定义属性的默认值
            default:0,
            // 用type属性定义属性的值类型,如果传递过来的值不符合此类型,则会在终端报错
            type:Number //还可以是其他类型:字符串、数组、布尔、对象等等
        }
    }
}

在声明自定义属性时,可以通过 required属性 来规定是否是必填项,代码如下:

props:{
    init:{
        // 用default属性定义属性的默认值
        default:0,
        // 用type属性定义属性的值类型,如果传递过来的值不符合此类型,则会在终端报错
        type:Number,
        // 必填项校验,如果使用该组件没有使用 init 属性就会报错
        required:true
    }
},

组件间的样式冲突

默认情况下,写在 .vue 组件中的样式会全局生效,因此很容易造成多个组件之间的样式冲突问题

导致组件之间冲突的根本原因是:

1)单页面应用程序中,所有组件的DOM结构,都是基于唯一的index.html页面呈现的

2)每个组件中的样式,都会影响整个index.html页面的DOM结构

如果想防止组件与组件之间的样式污染,需要在style标签加一个 scoped 属性。

scoped的属性原理是给样式一个唯一标识来书写属性:

那么如何在父组件中修改子组件的样式呢?在子组件修改我们的样式显然是不明智的,不便于后期的灵活修改,所以我们如何在父组件中修改子组件呢?如下:

PS/deep/  是之前的写法,虽然弃用但还是能用的,现在的写法是 ::v-deep ,当然随便你怎么用吧,能达到效果就行。

注意:在日常开发中,我们一般是使用第三方组件库的时候,如果想修改其默认样式在父组件的文件下,我们就需要用到 /deep/ 也就是 ::v-deep 这个属性。

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

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

相关文章

那些年我们遇到过的奇葩面试官

做了几年软件开发&#xff0c;我们都或多或少面试过别人&#xff0c;或者被别人面试过。大家最常吐槽的就是面试造火箭&#xff0c;进厂拧螺丝。今天就来吐槽一下那些奇葩&#xff08;gou&#xff09;一样的面试官 A 那是在我刚工作1年的时候&#xff0c;出去面试前端开发。 那…

虚拟筛选、高通量实验筛选化合物库

Kynurenine Pathway Library (含12,300种化合物) 靶向犬尿氨酸代谢途径关键酶的新型化合物库 KynureninePathway (犬尿氨酸途径, KP)是色氨酸代谢的主要途径&#xff0c;参与多个病理、生理过程。研究发现阿尔茨海默病、帕金森氏症等多种神经退行性疾病中的 KP 代谢产物水平…

hevc 继续色度半像素差值

1 前面已经讲了亮度的半像素差值&#xff0c;接下来讲一下色度的半像素差值。 亮度分量的运动估计已经精确到了1/4的精度&#xff0c;并且速度分量的分辨率是亮度分量的一般&#xff0c;所以色度插值需要精确到1/8的精度&#xff0c;色度分数像素插值按照基于离散余玄变换的4抽…

写代码有这20个好习惯,可以减少90%非业务的bug

每一个好习惯都是一笔财富&#xff0c;本文整理了写代码的20个好习惯&#xff0c;每个都很经典&#xff0c;养成这些习惯&#xff0c;可以规避多数非业务的bug&#xff01;希望对大家有帮助哈&#xff0c;谢谢阅读&#xff0c;加油哦~ 修改完代码&#xff0c;记得自测一下 「改…

C++初探 5-2(while循环 do while循环 输入 二维数组)

目录 注 while循环 for 与 while 编写延时循环 do while循环 基于范围的for循环&#xff08;C11&#xff09; 循环和文本输入 使用原始的cin进行输入 使用cin.get(char)进行补救 使用不同的cin.get( ) 文件尾条件 另一个cin.get( )版本 嵌套循环和二维数组 初始化…

长视频又添新变数

配图来自Canva可画 互联网广告市场依旧没有等来春天。据QuestMobile数据显示&#xff0c;2021下半年&#xff0c;中国互联网广告市场规模为3578.2亿元&#xff0c;而在2022年上半年这一数值下降至2903.6亿元&#xff0c;且同比增长率为-2.3%。 反应到具体的互联网平台上&…

[附源码]java毕业设计流浪动物救助网站

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

Zookeeper系列——概述

Zookeeper系列——概述Zookeeper官方文档模型结构模型的特点节点的类型持久节点(PERSISTENT)持久顺序节点(PERSISTENT_SEQUENTIAL)临时节点(EPHEMERAL)临时顺序节点(EPHEMERAL_SEQUENTIAL)安装Zookeeper启动进入容器连接zookeeper的cli配置文件&#xff08;zoo_sample.cfg&…

基于微信小程序的足浴城消费系统设计与实现-计算机毕业设计源码+LW文档

小程序开发说明 开发语言&#xff1a;Java 框架&#xff1a;ssm JDK版本&#xff1a;JDK1.8 服务器&#xff1a;tomcat7 数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09; 数据库工具&#xff1a;Navicat11 开发软件&#xff1a;eclipse/myeclipse/idea Mav…

m基于simulink的WCDMA通信链路仿真

目录 1.算法概述 2.仿真效果预览 3.核心MATLAB代码预览 4.完整MATLAB程序 1.算法概述 W-CDMA由ETSI NTT DoCoMo作为无线介面为他们的3G网路FOMA开发。后来NTTDocomo提交给ITU一个详细规范作为一个象IMT-2000一样作为一个候选的国际3G标准。国际电信联盟(ITU) 最终接受W-CDM…

ESP32-WROOM-32 ESP32 wifi模块基本参数与引脚定义

基本参数&#xff1a; WiFi描述标准FCC/CE/TELEC/KCC/SRRC/NCC协议 802.11 b/g/n/e/i (802.11n&#xff0c;速度高达150Mbps) A-MPDU和A-MSDU聚合&#xff0c;支持0.4μS防护间隔 频率范围2.4GHz~2.5GHz(2400M~2483.5M)蓝牙描述协议符合蓝牙v4.2BR/EDR和BLE标准射频 具有-98dB…

nosql课后答案

文章目录第一章 绪论1. NoSQL和关系型数据库在设计目标上有何主要区别&#xff1f;2. 简要总结一下NoSQL数据库的技术特点。第二章 NoSQL数据库的基本原理1. 描述分布式数据管理的特点。2 什么是CAP原理&#xff1f;CAP原理是否适用于单机环境&#xff1f;3. 简述BASE理论的具体…

杨紫开直播被吐槽脸胖、脖子粗、嘴唇厚,这就是明星开美颜的原因

自从发明了美颜&#xff0c;人人都变成了美女&#xff0c;不过这样的话也有弊端&#xff0c;那就是真真假假虚虚实实难以辨别。爱美之心人皆有之。尤其是娱乐圈的明星&#xff0c;在直播的时候更是开启十级美颜&#xff0c;以至于整个人都变形了。 当然也有不开美颜的明星&…

【技术分享】计算机视觉常见的十种图像标注方法

文章目录1.语义分割2.矩形框标注3.多边形标注4.关键点标注5.立方体标注6.3D点云标注7.2D/3D融合标注8.目标追踪9.OCR转写10.属性识别1.语义分割 语义分割是指根据物体的属性&#xff0c;对复杂不规则图片进行进行区域划分&#xff0c;并标注对应上属性&#xff0c;以帮助训练图…

工业互联网MES解决方案-最新全套文件

工业互联网MES解决方案-最新全套文件一、建设背景生产企业面临的问题&#xff1a;二、思路架构MES系统的实现对企业的影响&#xff1a;三、建设方案四、获取 - 工业互联网MES全套最新解决方案合集一、建设背景 MES&#xff08;生产制造执行系统&#xff09;在整个企业生产过程…

《FFmpeg Basics》中文版-08-模糊,锐化和其他去噪

正文 包含各种噪声的视频输入可以使用去噪滤波器和选项来增强。 在视频编码之前&#xff0c;去噪是视频预处理的一部分。 模糊视频效果 模糊效果用于提高图像&#xff08;视频帧&#xff09;中某些类型的噪声的质量&#xff0c;其中每个输出像素值是根据相邻像素值计算的。 …

java项目-第138期ssm就业信息管理系统-java毕业设计_计算机毕业设计

java项目-第138期ssm就业信息管理系统-java毕业设计_计算机毕业设计 【源码请到资源专栏下载】 今天分享的项目是《ssm就业信息管理系统》 该项目分为管理员和普通用员2个角色。 普通用户有就业信息、就业统计2个功能 管理员用户有就业信息、 就业统计&#xff1a;按专业统计 …

AVR单片机及其编译软件

内容包括AVRStudio及WinAVR介绍&#xff0c;软件下载地址&#xff0c;编译环境设置&#xff0c;IAR for AVR的使用&#xff0c;AVR单片机的介绍。紫色文字是超链接&#xff0c;点击自动跳转至相关博文。持续更新&#xff0c;原创不易&#xff01; 目录&#xff1a; 一、AVRSt…

用Python脚本能获取Wifi密码么?能。

注意&#xff0c;本文不是破解 WIFI 密码&#xff0c;当然你把程序发给别人再获取对方密码&#xff0c;那是社会工程学。 文章目录⛳️ 实战场景与 subprocess 模块介绍⛳️ Python 获取本地 Wifi 密码⛳️ 实战场景与 subprocess 模块介绍 这篇博客给大家带来一个小小的案例&…

魏副业而战:做闲鱼比打工强

我是魏哥&#xff0c;与其在家躺平&#xff0c;不如魏副业而战&#xff01; 学员小D做闲鱼又赚了122元&#xff0c;并在社群中晒了收入截图&#xff0c;大家纷纷点赞。 小D说&#xff0c;做闲鱼比打工强&#xff0c;一边聊天&#xff0c;一边赚钱&#xff0c;很喜欢这种赚钱方…