懂个锤子Vue 项目工程化进阶⏫:

news2024/11/15 18:24:08

Vue项目工程化进阶⏫:

前言: 紧跟前文,目标学习Vue2.0——3.0: 懂个锤子Vue、WebPack5.0、WebPack高级进阶 涉及的技术栈…

当然既然学习框架的了,HTML+CSS+JS三件套必须的就不说了: JavaScript 快速入门

学习前置链接: 懂个锤子Vue 项目工程化

组件的样式冲突:

在 Vue 开发中,组件样式冲突是一个常见的问题: 为什么会发生组件样式冲突⁉️

我们都知道,组件是由:模板Template\脚本Script\样式Style 组成,每个组件都是有自己的三件套)

但,因为Vue在运行过程中,本质是将多个组件合并成一个:html文件

所以,多个组件样式,相互匹配就发生组件样式冲突:

在这里插入图片描述

解决样式冲突

Vue支持定义全局\局部样式:

默认情况: 组件中的样式会,全局生效 → 很容易造成多个组件之间的样式冲突问题,

  • 全局样式: 默认组件中的样式会作用到全局
  • 局部样式: 可以给组件加上 scoped 属性, 可以让样式只作用于当前组件

在这里插入图片描述

scoped原理

scoped可以让组件样式变成局部样式: 组件都应该有独立的样式

  • scoped: 给当前组件模板的所有元素,都会添加上一个自定义属性data-v-hash值
  • data-v-hash值:用于区分开不通的组件,渲染样式时css选择器 后面,被自动处理,添加上了属性选择器;

组件的 data函数:

在 Vue 组件中,data 函数的主要作用是为每个组件实例提供独立的数据对象:

  • 因为: 一个组件可能会使用多次, 如果通过原始属性定义,多个组件会依赖一个数据源;
  • 通过: date(函数){ return {} } return返回对象,确保每一个组件都是独立的数据源;

**访问组件实例: ** 在 data(){ //函数内部 } 你可以访问组件实例的其他属性和方法;

响应式系统: Vue响应式系统,会将 data 函数 返回的对象包裹起来,

并以 $data 的形式存储在组件实例;数据发生变化,自动更新视图;

<!-- 模板结构 -->
<template>
    <div>
        <P>A组件: 声明成功!</P>
        <button @click="count--">-</button>
            <span>{{ count }}</span>
        <button @click="count++">+</button>
    </div>
</template>

<!-- 脚本结构 -->
<script> 
    export default {
        //原始定义:组件不支持\报错x)
        // data: {
        //     //基本数据类型使用
        //     count:1
        // },
        //组件函数式定义:
        data(){
            //因为: 一个组件可能会使用多次,如果通过原始属性,多个组件会依赖一个数据源;
            //通过: date(函数){ return {} } return返回对象,确保每一个组件都是独立的数据源;
            return {
                count:1
            }
        }
    }
</script>

<!-- 样式结构 -->
<!-- style中的样式,默认是作用到全局的
        scoped可以让样式变成局部样式,组件都应该有独立的样式,推荐scoped 原理)
        scoped给当前组件模板的所有元素,都会添加上一个自定义属性
        data-v-hash值 用于区分开不通的组件,css选择器后面,被自动处理,添加上了属性选择器;
-->
<style scoped>
    div{
        border: 3px solid red;
        margin: 30px;
    }
</style>

在这里插入图片描述

组件的通信📶

Vue.js 是一个基于组件的框架,应用通常由多个组件组成:

组件通信是指在 Vue.js 应用中,不同组件之间传递数据和消息的过程:

组件之间的数据是独立的,无法直接访问其他组件的数据,组件通信的主要目的是:

  • 数据共享:在父子组件之间或兄弟组件之间共享数据;
  • 事件传递:在组件之间传递事件,以响应用户操作或其他事件;

组件之间有哪些关系?

  • 父子关系: 一个组件包含另一个组件

    例如,组件A 包含组件B +组件C,那么 A 和 B、C 是父子关系;

  • 非父子关系: 也有开发者称为兄弟\隔代关系,同一个父组件下的多个子组件之间的关系;

    组件B组件C 都是组件A 的子组件,那么 B 和 C 是兄弟关系;

    组件A 包含组件B组件B 又包含组件D,那么 A 和 D 是隔代关系;

在这里插入图片描述

对应的组件通信方案有哪几类? 这里简单介绍,常用的几种;

  • Props 和 $emit:用于父子组件之间的通信;
  • provide 和 inject:用于祖先组件和后代组件之间的通信;
  • 事件总线(Event Bus):通过创建一个空的 Vue 实例作为中央事件总线,用它来触发和监听事件,实现任意组件间的通信;
  • Vuex:用于全局状态管理,适用于大型应用,通过 Vuex 的 store 来管理全局状态,实现组件间的通信;

父子组件通信:

父—>子通信:

Props 是父组件向子组件传递数据的机制,

父组件通过在子组件标签上绑定属性来传递数据,子组件通过声明 props 来接收这些数据;

在这里插入图片描述

  • Prop 定义\使用: 父组件在子组件上,注册的一些 自定义属性:<组件名 :属性名='传递值' ></组件名>
  • 子组件通过:props 获取父组件的数据,props:['属性名']props中的属性可以像data中数据一样使用;

props 详解\校验:

Props 作用: 向子组件传递数据,可以传递任意数量、可以传递任意类型

在这里插入图片描述

props 校验是确保传递给组件的数据符合预期的一种机制: 通过定义 props 的类型和验证规则,提高组件可靠性和可维护性;

'props': {
	'校验属性名1': '类型', 		// Number String Boolean ...
    '校验属性名2': {
		type: '类型', 			// Number String Boolean ...
		required: true, 	 	 // 是否必填
		default: '默认值', 	   // 默认值
		validator (value) {
			// 自定义校验逻辑
			return 是否通过校验;
		};
	}
},

在这里插入图片描述

data & props 区别:

在 Vue.js 中,propsdata 都是用于管理组件数据的重要机制,但它们有一些显著的区别:

  • data:用于组件内部管理数据,组件可以自由修改

  • props:用于父组件向子组件传递数据,子组件只能读取,不能修改

    单向数据流: 父级 props 的数据更新,会向下流动,影响子组件,这个数据流动是单向的

    父组件更新 props,子组件会接收到最新的数据,但子组件不能直接修改 props 的值,子组件修改值报错

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

检测到props 中数据修改报错,Vue直接抛出异常! 那么如何修改父组件的数据呢?

子—>父通信:

👆这就涉及到子——父 通信了,那么如何: 子—>父通信:

BaseCount.vue: 子组件通过调用 $emit 方法触发一个@自定义事件

并传递需要发送的数据:this.$emit('自定义事件名', 传递给父组件数据)

<!-- 模板结构 -->
<template>
  <div class="base-count">
    <button @click="handleSub">-</button>
      <span>{{ count }}</span>
    <button @click="handleAdd">+</button>
  </div>
</template>
<!-- 脚本结构 -->
<script>
export default {
  //子组件data数据
  data(){ return { dcount:0 } },
  props: {
    //props获取父组件数据;
    count: { type: Number, },
  },
  methods: {
    handleSub() {
      //子组件通过调用 $emit 方法触发一个自定义事件,并传递需要发送的数据
      this.$emit('changeCount', this.count - 1)
    },
    handleAdd() {
      this.$emit('changeCount', this.count + 1)
    },
  },
}
</script>
<!-- 样式结构 -->
<style></style>

App.vue: 父组件通过在:子组件标签上自定义监听事件,并绑定一个函数来接收处理数据;

<子组件 :属性名='传递值' @自定义监听事件="处理函数" >,当子组件调用:this.$emit('自定义事件名', 传递父组件数据)

父组件监听事件触发,并执行对应处理函数,函数内部可以获取子组件传递的数据: 处理函数(value){ //内部执行相应处理 }

<!-- 模板结构 -->
<template>
  <div id="app" style="border: 3px solid #000; margin: 10px">
    App 父组件
    <!-- 加减组件 -->
    <!-- 父组件通过在子组件标签上监听自定义事件,并绑定一个触发函数 -->
    <BaseCount :count="count" @changeCount="handleChange" ></BaseCount>
  </div>
</template>

<!-- 脚本结构 -->
<script>
import BaseCount from './components/BaseCount.vue'
export default {
  name: 'App',
  data(){ 
    return { count:1, } 
  },
  components: {
    BaseCount
  },
  methods:{
    handleChange(newVal){
      //函数获取: 子组件传递的数据,给其赋值count;
      this.count = newVal;
    }
  }
}
</script>
<!-- 样式结构 -->
<style></style>

在这里插入图片描述

  1. 用户点击:+\- 触发对应的子组件函数,
  2. 子组件函数内部执行:this.$emit('父组件自定义监听函数',传递值) 给父组件传递修改后的值;
  3. 父组件,事先定义子组件时: 设置,自定义监听函数,并绑定对应处理函数;
  4. 父组件,监听@自定义函数执行,并触发函数
  5. 获取子组件传递最新值,重新赋值: count
  6. 子组件页面同步数据更新;

非父子组件通信:

event bus 事件总线

在 Vue.js 中,事件总线(Event Bus)是一种用于实现非父子组件之间通信的机制

它允许我们在 Vue 应用中 创建一个全局的事件中心 ,组件通过该 事件中心来:发送\接收事件 ,实现数据的传递和共享

创建事件总线:

首先,我们需要创建一个事件总线:

  • 通常是在主文件如 main.js,中创建一个新的 Vue 实例,并将其挂载到 Vue 的原型上,以便所有组件都可以访问;
  • 还有另一种方式是直接在组件中创建和使用事件总线, 这种方法适用于局部通信需求,不需要全局事件总线;
//全局工具包
//utils/EventBus.js
import Vue from 'vue';
const EventBus = new Vue();
export default EventBus;       	//对外暴漏公共实例;	

//main.js
//const EventBus = new Vue();
//Vue.prototype.$bus = EventBus;
//将一个新的 Vue 实例即EventBus)挂载到Vue的原型上,并命名为 $bus
//这样,所有的 Vue 组件都可以通过 this.$bus 访问这个事件总线;

发送事件:

在需要发送事件的组件中,通过 实例.$emit 方法发送事件,并传递数据;

<template>
  <div class="base-b">
    <div>我是B组件(发布方)</div>
    <button @click="sendMsgFn">发送消息1</button>
	<button @click="sendMsgFn2">发送消息2</button>
  </div>
</template>

<script>
//引入局部事件总线
import Bus from '../utils/EventBus'
export default {
  methods: {
    //通过 `$bus.$emit` 方法发送事件,并传递数据;
    sendMsgFn() { Bus.$emit('sendMsg', '引入局部事件总线') },
    sendMsgFn2() { this.$bus.$emit('sendMsg2', 'this.$Bus全局事件总线') },
  },
}
</script>
<style scoped><!-- 省略Css样式 --></style>	

监听事件:

在需要接收事件的组件中,通过 $bus.$on 方法监听事件,并处理接收到的数据;

<template>
  <div class="base-a">
    我是A组件(接受方)
    <p>{{msg}}</p>  
  </div>
</template>

<script>
import Bus from '../utils/EventBus'
export default {
  data() { return { msg: '', } },
  created() {
    Bus.$on('sendMsg', (msg) => { this.msg = msg });		//接受局部事件总线消息
    this.$bus.$on('sendMsg2', (msg) => { this.msg = msg });	//接受全局事件总线消息
  },
}
</script>
<style scoped><!-- 省略Css样式 --></style>	

在这里插入图片描述

注意事项

事件移除:在组件销毁前,应该移除事件监听,以避免内存泄漏和重复监听,

全局事件总线: 虽然事件总线使用方便,但在大型应用中可能会导致难以维护的“灾难”,

因此需要谨慎使用,对于复杂的状态管理,推荐使用 Vuex:

provide & inject 跨层级共享数据

在 Vue.js 中,provideinject 是一种高级的数据传递机制:

主要用于解决组件树中深层组件间通信的问题,特别是当不直接存在父子关系时

它们允许父组件提供一个值,而任何后代组件都可以通过 inject 来接收这个值;如:上图D—A的隔代通信;

根组件发送消息:

父组件使用 provide 提供数据: 父组件通过 provide(){ return { 发送数据 } } 选项将数据提供给子组件及其后代组件;

<template>
  <div id="app" style="border: 3px solid #000; margin: 10px">
    App 父组件
    <Son3></Son3>
  </div>
</template>

<script>
import Son3 from './components/Son3.vue';
export default {
  name: 'App',
  components: { Son3, },
  data() { return { color: 'pink', userInfo: { name: 'zs', age: 18, }, } },
  //父组件使用 provide 提供数据:
  provide() {
    return {
      // 简单类型是非响应式的
      color: this.color,
      // 复杂类型 是响应式的
      userInfo: this.userInfo,
    }
  },
}
</script>

后代组件接受消息:

子组件使用 inject 接收数据: 子组件通过 inject: ['匹配数据名', '匹配数据名','...'] 选项注入这些数据;

<template>
  <div class="grandSon">
    我是GrandSon
    {{ color }} -{{ userInfo.name }} -{{ userInfo.age }}
  </div>
</template>

<script>
export default {
  //子组件使用 inject 接收数据:
  inject: ['color', 'userInfo'],
}
</script>

在这里插入图片描述

响应式数据、问题:

需要注意的是,provide 提供的简单类型数据(如字符串、数字)是非响应式的,

而复杂类型数据(如对象、数组)是响应式的,这意味着子组件可以监听到复杂类型数据的变化;

版本管理:

本代码已经使用Git进行管理: 公众号回复:Vue项目工程化

在这里插入图片描述

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

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

相关文章

最新EI期刊信息查询系统(如何查询EI期刊?这里已解决)

直接点击下面的链接 https://www.elsevier.com/products/engineering-village/databases/compendex 进入官网界面 这个列表就是EI索引的全部期刊列表

linux进程控制——进程创建、运行、exit终止——详解解析!

前言&#xff1a;本篇进入新章节——进程控制。 本章节和上一章节同样都是讲解进程&#xff0c; 但是内容上却比上一章内容好理解的多。上一章内容都是进程的概念性相关&#xff0c; 那个时候我们对于进程的理解还处于小白状态&#xff0c; 所以很多东西很抽象&#xff0c; 不好…

快速排序的优化--前后指针

前后指针思想 我们前面文章讲的核心思想是haroe的核心思想&#xff0c;将keyi另一边的指针先移动&#xff0c;找比keyi小的&#xff0c;然后不动&#xff0c;再让keyi这边的指针移动&#xff0c;找比keyi大的&#xff0c;但是这种方法的局限性就是需要让keyi另一边的指针先移动…

止损与趋势交易的艺术在昂首平台尽情绽放

在昂首平台上&#xff0c;我们认识到交易不仅仅是数字游戏&#xff0c;更是一门艺术&#xff0c;需要投资者智慧和策略。正如做生意一样。会以125的价格买入商品&#xff0c;然后再以250的价格卖出。没人会不切实际想着以0元的价格购买商品再以高价卖出。 交易同样需要合理的成…

云仓技术带来的物流变革影响

1、实时可视性&#xff1a; 云仓技术使物流公司能够实时跟踪和监控货物在供应链中的位置和状态。这种实时可视性提供了更好的货物追踪和管理能力&#xff0c;同时也提高了客户服务的质量。 ———————————————————— 2、仓储优化&#xff1a; 云仓技术可以…

【管理咨询宝藏145】多元化经营大型集团组织架构优化提升方案

【管理咨询宝藏145】多元化经营大型集团组织架构优化提升方案 【格式】PDF版本 【关键词】组织架构、人力资源、组织管控 【核心观点】 - 随着多元业务的发展&#xff0c; 公司逐步由百亿级企业向干亿级企业转变&#xff0c; 人才布局将面临一系列挑战 - 挑战1 :为支撑公司多业…

前端工程化-vue项目开发流程

vue项目创建参考该文&#xff1a; 前端工程化-vue项目创建-CSDN博客 组件就是页面的意思&#xff1b; 默认的App.vue根组件如下图 我们可以修改为如下图所示&#xff0c;注意script的选择&#xff0c; <html>中的标签&#xff0c;此处是放在<template>中&#…

[php7系列]--php7里的返回类型声明和标量类型声明及不要用isset判断数组是否定义某个KEY-最好使用array_key_exists

一、[php7系列]--php7里的返回类型声明和标量类型声明 php7里增加了返回类型声明和标题类型声明&#xff0c;可以理解为对一个方法的输入输出进行了类型验证&#xff0c;在PHP7之前&#xff0c;方法里的数组、对象参数是有类型声明的&#xff0c;但其它的整数、字符串等类型声明…

Idea设置自动导包

Idea设置自动导包 【File】→【Setting】(或使用快捷键【Crlt Shift S】)打开Setting设置。 点击【Editor】→【General】→【Auto Import】。勾选自定导包的选项&#xff0c;并确定&#xff0c;如下&#xff1a;

心大陆AI科学养育,共情陪伴孩子的幸福童年!

3-8岁是宝宝的关键期&#xff0c;在这个阶段也是父母最费心的时候&#xff1a;孩子吃饭、洗澡、睡觉总爱拖延、玩玩具三分钟热度、上课小动作多、语言能力弱&#xff0c;讲话不连贯容易暴怒、天性好奇&#xff0c;总有十万个为什么等等...... 这些情况在儿童早期发育阶段爸爸妈…

优思学院|如何透过客户忠诚度分析决定六西格玛改善项目?

客户忠诚度分析提供了一个框架&#xff0c;从而便于公司理解客户不再忠诚的原因&#xff0c;并做出相应的改善。客户忠诚度不仅是要关注现有的客户&#xff0c;还应包括已失去的客户。客户忠诚度研究有助于公司发现使客户转向竞争对手的有关客户服务、产品或可靠性等的一些问题…

论文阅读:A Survey on Evaluation of Large Language Models-鲁棒性相关内容

A Survey on Evaluation of Large Language Models 只取了鲁棒性相关的内容 LLMs&#xff1a;《A Survey on Evaluation of Large Language Models大型语言模型评估综述》理解智能本质(具备推理能力)、AI评估的重要性(识别当前算法的局限性设 对抗鲁棒性是衡量大型语言模型&…

C语言进阶 11.结构体

C语言进阶 11.结构体 文章目录 C语言进阶 11.结构体11.1. 枚举11.2. 结构类型11.3. 结构与函数11.4. 结构中的结构11.5. 类型定义11.6. 联合11.7. PAT11-0. 平面向量加法(10)11-1. 通讯录的录入与显示(10) 11.1. 枚举 常量符号化: 用符号而不是具体的数字表示程序中的数字 cons…

基于FPGA的数字信号处理(19)--行波进位加法器

1、10进制加法是如何实现的&#xff1f; 10进制加法是大家在小学就学过的内容&#xff0c;不过在这里我还是帮大家回忆一下。考虑2个2位数的10进制加法&#xff0c;例如&#xff1a;15 28 43&#xff0c;它的运算过程如下&#xff1a; 个位两数相加&#xff0c;结果为5 8 1…

Linux系统配置STM32的开发环境(代码编辑,编译,下载调试)

常见的stm32开发都是直接使用keil-MDK工具的&#xff0c;这是个集成开发环境&#xff0c;包含了代码编辑&#xff0c;编译&#xff0c;下载&#xff0c;调试&#xff0c;等功能&#xff0c;而且keil还是个图形化操作工具&#xff0c;直接可以点击图标案件就可以实现编译下载啥的…

实现物理数据库迁移到云上

实现物理数据库迁移到云上 以下是一个PHP脚本,用于实现物理数据库迁移到云上的步骤: <?php// 评估和规划 $databaseSize = "100GB"; $performanceRequirements = "high"; $dataComplexity = "medium";$cloudProvider = "AWS"; …

Python小工具之httpstat网络分析

一、简介 Python httpstat是一个基于Python的命令行工具&#xff0c;用于测量HTTP请求的性能和状态信息。它能够向目标服务器发送HTTP请求&#xff0c;并显示详细的统计信息&#xff0c;包括DNS解析时间、建立连接时间、TLS/SSL握手时间、首字节时间、总时间等。这些信息对于排…

AI写作有用?未成年不准看巴黎奥运会!——早读(逆天打工人爬取热门微信文章解读)

早上动力AI该作的念头&#xff0c;发觉改完&#xff0c;狗屁不是 引言Python 代码第一篇 洞见 最残忍的社会现实&#xff1a;你能挣多少钱&#xff0c;都是被设计好的第二篇 啦啦啦 开剪辑啦结尾 引言 呀 我们正年轻着 最近觉得有点烦 因为自己有点堕怠 但是呢 越烦越急躁 导致…

网络协议一 : 搭建tomacat,intellij IDEA Ultimate 的下载,安装,配置,启动, 访问

需要搭建的环境 1.客户端--服务器开发环境 客户端&#xff1a;浏览器&#xff08;HTMLCSSJS&#xff09; 服务器&#xff1a;JAVA 1.安装JDK&#xff0c;配置JAVA_HOME 和 PATH 2.安装Tomcat 3.安装IDE--intellij IDEA Ultimate 是旗舰版的意思。 2.TOMCAT 的下载和解…

基于嵌入-对比学习的联邦知识图谱补全

1 引言 1.1 现存问题 在联邦学习中&#xff0c;跨客户端的数据异质性(即非相同分布的数据)是主要挑战&#xff0c;因为当数据异质性存在时&#xff0c;本地目标可能与全局目标不同。 如图所示&#xff0c;School KG中的三元组表示Bob和Jack的学术信息&#xff0c;而ecommerc…