五、vue组件与props自定义属性

news2025/4/14 19:38:19

一、vue组件

1.1、什么是组件化开发

组件化开发指的是:根据封装的思想,把页面上可重用的UI结构封装为组件,从而方便项目的开发和维护。

1.2、vue中的组件化开发

vue是一个支持组件化开发的前端框架。
vue中规定:组件的后缀名.vue。之前接触到的 App.vue 文件本质上就是一个 vue 的组件。

1.3、vue组件的三个组成部分

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

  • template -> 组件的模板结构
  • script -> 组件的JavaScript行为
  • style -> 组件的样式

其中,每个组件中必须包含 template 模板结构,而script行为style样式可选的组成部分。

1.3.1、template

vue规定:每个组件对应的模板结构,需要定义到 <template>节点中。

<template>
	<!-- 当前组件的 DOM 结构,需要定义到 template 标签的内部 -->
</template>

注意:

  • template 是 vue 提供的 容器标签,只起到包裹性质的作用,它不会被渲染为真正的 DOM 元素
  • template 中只能包含唯一的根节点

1.3.2、script

vue 规定:开发者可以在 <script>节点中 封装组件的JavaScript业务逻辑
<script> 节点的基本结构如下:

<script>
	// 今后,组件相关的 data 数据、methods 方法等。
	// 都需要定义到 export default 所导出的对象中。
	export default {}
</script>

.vue 组件中的 data 必须是函数
vue规定:.vue组件中的data必须是一个函数不能直接指向一个数据对象
因此在组件中定义data数据节点时,下面的方式是错误的

data: { // 组件中,不能直接让 data 指向一个数据对象(会报错)
	count: 0
}

会导致多个组件实例共用同一份数据的问题,请参考官方给出的示例:
https://v2.cn.vuejs.org/v2/guide/components.html
data 必须是一个函数

1.3.3、style

vue 规定:组件内的 <style> 节点是可选的,开发者可以在<style>节点中编写样式美化当前组件的UI结构
<style> 节点的基本结构如下:

<style>
	h1 {
		font-weight: normal;
	}
</style>

让 style 中支持 less语法
<style>标签上添加lang="less"属性,即可使用 less 语法编写组件的样式:

<style lang="less">
	h1 {
		font-weight: normal;
		span {
			color: red;
		}
	}
</style>

1.3.4、案例

通过 vue-cli生成项目后,编写案例:
在这里插入图片描述
Test.vue

<template>
    <div>
        <div class="test-box">
            <h3>这是用户自定义的 Test.vue --- {{ username }}</h3>
            <button @click="changeName">修改用户名</button>
        </div>
    </div>
</template>

<script>
// 默认导出。这是固定写法
export default {
    // data  数据源
    // 注意:.vue 组件中的 data 不能像之前一样,不能指向对象。
    // 注意:组件中的 data 必须是一个函数
    data() {
        // 这个 return 出去的 { } 中,可以定义数据
        return {
            username: 'admin'
        }
    },
    methods: {
        changeName() {
            // 在组件中, this 就表示当前组件的实例对象
            console.log(this)
            this.username = '张三疯'
        }
    },
    // 当前组件中的侦听器
    watch: {

    },
    // 当前组件中的计算属性
    computed: {

    },
    // 当前组件中的过滤器
    filters: {

    }
}
</script>

<style lang="less">
.test-box {
    background-color: pink;
    h3 {
        color: red;
    }
}
</style>

main.js

// 导入 vue 这个包,得到 Vue 构造函数
import Vue from 'vue'
// 导入 App.vue 根组件,将来要把 App.vue 中模板结构,渲染到 HTML 页面中
// import App from './App.vue'
import Test from './Test.vue'

Vue.config.productionTip = false

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

// Vue实例的 $mount()方法,作用和 el 属性完全一样!

在这里插入图片描述在这里插入图片描述
组件中的 data 必须是一个函数
在这里插入图片描述在这里插入图片描述
单文件组件template中根元素只能有一个
在这里插入图片描述在这里插入图片描述在这里插入图片描述

1.4、组件之间的父子关系

在这里插入图片描述

1.4.1、使用组件的三个步骤

在这里插入图片描述
案例:
打开DEMO-1的项目,并通过npm i命令,下载所依赖的第三方组件。
在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述
配置代码提示

// 导入文件时是否携带文件的扩展名
"path-autocomplete.extensionOnImport": true,
// 配置 @ 的路径提示
"path-autocomplete.pathMappings":{
	"@":"${folder}/src"
}

在这里插入图片描述
在这里插入图片描述在这里插入图片描述

1.4.2、通过 components 注册的是私有子组件

例如:
组件A的 components 节点下,注册了 组件F
则组件F 只能用在组件A 中;不能被用在组件C中。

1.4.3、注册全局组件

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

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

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

在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述

二、组件的props

props是组件的自定义属性,在封装通用组件的时候,合理地使用 props 可以极大的提高组件的复用性!
它的语法格式如下:

export default {
	// 组件的自定义属性
	props: ['自定义属性A', '自定义属性B', '其它自定义属性...'],

	// 组件的私有数据
	data() {
		return { }
	}
}

在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述

2.1、props是只读的

vue规定:组件中封装的自定义属性是只读的,程序员不能直接修改props的值。否则会直接报错:
在这里插入图片描述
要想修改 props的值,可以把props的值转存到 data中,因为data中的数据都是可读可写的!

props: ['init'],
data() {
	return {
		count: this.init // 把 this.init 的值转存到 count
	}
}

在这里插入图片描述在这里插入图片描述
注意:props是只读的,不要直接修改 props的值,否则终端会报错!
在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述

2.2、props的default默认值

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

export default {
	props: {
		init: {
			// 用default属性定义属性的默认值
			default: 0
		}
	}
}

在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述

2.3、props的type值类型

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

export default {
	props: {
		init: {
			// 用default属性定义属性的默认值
			default: 0,
			// 用 type 属性定义属性的值类型
			// 如果传递过来的值不符合此类型,则会在终端报错
			type: Number
		}
	}
}

在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述

2.4、props的require必填项

在声明自定义属性时,可以通过require选项,将属性设置为必填项,强制用户必须传递属性的值。示例代码如下:

export default {
	props: {
		init: {
			// 值类型为 Number 数字
			type: Number,
			// 必填项校验
			required: true
		}
	}
}

在这里插入图片描述在这里插入图片描述

三、组件之间的样式冲突问题

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

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

  1. 单页面应用程序中,所有组件的DOM结构,都是基于唯一的index.html页面进行呈现的。
  2. 每个组件中的样式,都会影响整个 index.html 页面中的DOM元素

在这里插入图片描述在这里插入图片描述

3.1、思考:如何解决组件样式冲突的问题

为每个组件分配唯一的自定义属性,在编写组件样式时,通过属性选择器来控制样式的作用域。示例代码如下:

<template>
  <div class="container" data-v-001>
    <h3 data-v-001>轮播图组件</h3>
  </div>
</template>

<script>
export default {

}
</script>

<style>
/* 通过中括号"属性选择器",来防止组件之间的"样式冲突问题"
    因为每个组件分配的自定义属性是“唯一的” */
.container[data-v-001] {
    border: 1px solid red;
}
</style>

3.2、style节点的 scoped 属性

为了提高开发效率和开发体验,vue为style节点提供了scoped属性,从而防止组件之间的样式冲突问题。
在这里插入图片描述在这里插入图片描述

3.3、/deep/样式穿透

如果给当前组件的 style 节点添加了 scope的属性,则当前组件的样式对其子组件是不生效的。如果想让某些样式对子组件生效,可以使用 /deep/ 深度 选择器
在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述

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

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

相关文章

JavaWeb----Ajax技术

目录 Ajax技术详解 Ajax简介 Ajax 的使用 Ajax 的运行原理 XMLHttpRequest 对象 Ajax 的使用步骤 Ajax请求 ​编辑 Get/Post请求 JSON详解 JSON简介 为什么要使用 JSON JSON 格式的特征 JSON的语法规则 JOSN的数据类型 JACKSON 的使用 Jackson 简介 在项目中引入…

Scala011--Scala中的常用集合函数及操作Ⅱ

在上一篇文章中我已经接触并认识了几个常用的集合函数&#xff1a;foreach,sorted,sortBy,sortWith,flatten,map,flatMap。 接下来在这一篇文章中我将继续学习剩下的几个集合函数。 目录 一&#xff0c;filter函数 ​编辑 练习题1&#xff1a;如何过滤出大于2的奇数&#…

PyCharm+PyQT5之二第一个QT程序

Tools菜单或者右键打开external tools的 QTdesigner,如下图&#xff0c;在PyQt5中最常用的窗口有三种&#xff0c;即Main Window Widget Dialog&#xff0c; Main Window 也就是主窗口&#xff0c;他要为用户提供一个带有菜单栏、工具栏和状态栏的窗口。 Widget:通用窗口&#…

零基础入门金融风控之贷款违约预测挑战赛——简单实现

零基础入门金融风控之贷款违约预测挑战赛 赛题理解 赛题以金融风控中的个人信贷为背景&#xff0c;要求选手根据贷款申请人的数据信息预测其是否有违约的可能&#xff0c;以此判断是否通过此项贷款&#xff0c;这是一个典型的分类问题。通过这道赛题来引导大家了解金融风控中…

Linux中less和more的区别

总结下more和less的区别(less is more)&#xff1a; 1、less可以按键盘上下方向键显示上下文内容&#xff0c;more不能通过上下方向键控制显示&#xff08;但是可以用b实现向上翻页&#xff0c;空格键实现向下翻页&#xff09; 2、less不必读整个文件&#xff0c;加载速度会比…

数码视讯Q5、Q7_晶晨S905L/M/M2_nandemmc通刷_完美精简线刷固件

数码视讯Q5、Q7_晶晨S905L/M/M2_nand&emmc通刷_完美精简线刷固件 固件特点&#xff1a; 1、修改dns&#xff0c;三网通用&#xff1b; 2、开放原厂固件屏蔽的市场安装和u盘安装apk&#xff1b; 3、无开机广告&#xff0c;无系统更新&#xff0c;不在被强制升级&#xf…

一道有趣的最长子序列问题

一道有趣的最长子序列问题 – 潘登同学的金融经济学笔记 文章目录一道有趣的最长子序列问题 -- 潘登同学的金融经济学笔记来源求解递推公式算法实现来源 前几天在刷视频的时候&#xff0c;发现了这样一道题 所谓子序列就是一个序列 ai1,ai2,⋯,aina_{i1},a_{i2},\cdots,a_{in}…

【5w字】SpringBoot源码分析

Spring Boot源码分析 文章目录Spring Boot源码分析启动类分析SpringBootConfigurationEnableAutoConfigurationComponentScanSpringBoot启动流程1. 准备SpringApplication获取当前 web 应用类型设置初始化器设置监听器推导主应用程序类2. Spring Boot的运行创建计时器并启动设置…

开源工具 | ASV-Subtools更新:runtime模块重磅发布

ASV-Subtools更新 - runtime模块重磅发布 - ASV-Subtools是厦门大学智能语音实验室&#xff08;XMUSPEECH&#xff09;于2020年6月推出的一套高效、易于扩展的声纹识别开源工具&#xff0c;该工具是基于Kaldi与Pytorch开发的&#xff0c;充分结合了Kaldi 在语音信号和后端处理…

Fe3+-多巴胺修饰Pluronic的多功能性水凝胶/多巴胺修饰聚丙烯微孔膜表面的研究

下面整理了Fe3-多巴胺修饰Pluronic的多功能性水凝胶/多巴胺修饰聚丙烯微孔膜表面&#xff0c;和小编一起来看&#xff01; Fe3-多巴胺修饰Pluronic多功能性水凝胶 利用对硝基苯基氯酸甲酯作为聚合物Pluronic F127端羟基活化剂,与盐酸多巴胺直接反应制备末端多巴胺修饰的Pluron…

【web课程设计网页规划与设计】基于HTML+CSS+JavaScript火车票网上预订系统网站(4个页面)

&#x1f389;精彩专栏推荐 &#x1f4ad;文末获取联系 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业&#xff1a; 【&#x1f4da;毕设项目精品实战案例 (10…

Part4_场景_第52章 场景描述第53章 柏林I:BVG场景第54章 柏林II:CEMDAP-Matsim-Cadyts方案

第52章 场景概述 本书的最后一部分总结了MATSIM场景,如图52.1中的地图所示,并在http://matsim.org/scolutions中列出。 尽管存在基于免费和公共数据的真实场景,如圣地亚哥或科特布斯场景(第84或66章),但由于数据隐私问题,许多场景是不公开的。 然而,了解适用于情景创建…

【STM32备忘录】二、FSMC做LCD控制器,使用stm32cube配置示例

文章目录1. FSMC框图2. 配置示例(1) cube配置(2) 代码参考*疑问1. FSMC框图 如果屏幕接口8位数据宽度访问&#xff0c;地址线FSMC_A[25:0], 一共26位&#xff0c;一个块22667108864Byte64MB&#xff0c;如果屏幕接口16位数据宽度访问&#xff0c;地址线FSMC_A[25:0], 一共26位&…

远程访问数据库,快解析助力疫情防控远程办公

当前&#xff0c;国内疫情形势不容乐观&#xff0c;企业的经营发展再一次面临巨大挑战。虽然“远程办公”早已不是新鲜词&#xff0c;但依然有大量企业没有做好随时切换到远程办公的准备。如遇疫情风险&#xff0c;企业运营很容易陷入瘫痪。 企业一般在内网部署服务器、视频监…

【Java并发入门】01 并发编程Bug的源头

一、根本原因 「CPU、内存、磁盘之间的速度差异」 为了能同时执行多个任务&#xff0c;CPU 发展出时间片轮转、多核等CPU 要从内存中读数据太慢了&#xff0c;所以给自己设置了缓存CPU 读磁盘更慢了&#xff0c;所以可以让该线程阻塞 二、直接原因 缓存导致的可见性问题 C…

函数 function

一、创建函数方法 1.基本语法 函数是引用数据类型 1.1有函数名称的叫具名函数 function 函数名称&#xff08;&#xff09;{ }&#xff1b; 调用函数&#xff1a; 函数名&#xff08;&#xff09;&#xff1b; <script>function fnl( ){var a 2;var b 5…

教你快速搭建微服务环境

目录 一、项目搭建 1.父项目搭建 2.子项目的搭建 二、项目展示 一、项目搭建 1.父项目搭建 步骤&#xff1a; 1 选择maven项目作为父项目&#xff0c;修改为1.8之后直接点击next 2 定义父项目的名称&#xff0c;修改Artifct Coordinates ---> GroupId 然后点击finsh就可…

现代营销杂志现代营销杂志社现代营销编辑部2022年第11期目录

财务金融《现代营销》投稿&#xff1a;cnqikantg126.com 我国中小企业货币资金管理分析 安宁; 1-3 企业财务管理转型路径探讨 秦春; 4-6 互联网背景下电商企业税务风险研究 何秋梅; 7-9 目标成本管理在企业经济管理中的应用分析 艾蕾梅; 10-12 关于我国发展…

CentOS7.9集群部署(配置hosts、集群免密、时间同步)

在上一篇我们介绍了如何在windows下安装虚拟机&#xff0c;在虚拟机上安装CentOS7.9&#xff0c;并且在系统安装完成后配置了固定ip和系统时间。 在食用本篇之前&#xff0c;如果上述操作没有做过&#xff0c;可以先移步 windows安装VMware虚拟机(附带CentOS7部署) 但是在分布式…

文献阅读总结(3)Neural Graph Collaborative Filtering

1、Introduction 左图u1&#xff0c;右图从左图的u1开始展开 图反应的信息&#xff1a; 1、从路径u1->i2->u2,可以反映出u1和u2的相似性&#xff1b; 2、u1和i4之间有两条路径&#xff0c;而u1和i5之间只有一条路径&#xff0c;可以反应u1对i4的兴趣比u1对i5的兴趣更高…