Vue2学习(04)

目录

一、组件的三大组成部分

二、组件的样式冲突scoped

三、scoped原理

​编辑 四、data是一个函数

五、组件通信

六、props详解

七、非父子通信

1.eventbus事件总线(可以一传多)--->作用是在非父子组件之间,进行简易的消息传递(复杂场景--->vuex)

2.provide和inject

八、.sync修饰符

九、ref和refs

十、vue异步更新和$nextTick

十一、自定义指令


一、组件的三大组成部分

结构<template>---vue2只能有一个根元素

样式<style>---默认是全局样式,影响所有组件;局部样式:scoped下的样式,只作用于当前组件

逻辑<script>---el是根实例所独有的,data是一个函数,其他配置项不变

二、组件的样式冲突scoped

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

全局样式:默认组件中的样式会作用到全局

局部样式:可以给组件加上scoped属性可以让样式只作用于当前组件

三、scoped原理

给当前组件模板的所有元素,都会添加上一个自定义属性data-v-hash值,可以利用hash值区分开不同的组件,CSS选择器后面被自动处理,添加了属性选择器div[data-v-hash值](必须是当前组件的元素,才会有这个自定义属性,才会被这个样式作用到---当前组件内的标签都会被添加data-v-hash值的属性)


<style lang="less" scoped>
.footer-container {
  background-color: white;
  height: 50px;
  border-top: 1px solid #f8f8f8;
  display: flex;
  justify-content: flex-end;
  align-items: center;
  padding: 0 10px;
  position: fixed;
  bottom: 0;
  left: 0;
  width: 100%;
  z-index: 999;
}
</style>

 四、data是一个函数

一个组件的data选项,必须是一个函数---保证每个组件实例维护独立的一份数据对象

  data(){
    return{
      数据对象
    }

五、组件通信

1.概念:是指组件与组件之间的数据传递,组件的数据是独立的,无法直接访问其他组件的数据,想用其他组件的数据就要用到组件通信。

2.组件关系分类:

父子关系---props和$emit

非父子关系---provide&inject和eventbus

3.父子通信流程图

父组件通过props将数据传递给子组件

子组件利用$emi通知父组件修改更新

  • 父传子
  • --->给子组件以添加属性的方式传值---->动态属性传值--->:属性名 = "表达式"
  • --->子组件内部通过props接收--->数组接收多个传值---->props: ['属性名']
  • --->模板中直接使用--->模板字符串{{}}渲染--->{{ 属性名 }}
  • 子传父
  • --->$emit触发事件,给父组件发送消息通知--->子组件监听事件--->this.$emit('事件名','内容')
  • 父组件监听事件--->@事件名 = '父级监听事件'
  • 提供处理函数,形参中获取参数--->this.属性名 = 形参

六、props详解

定义:子组件上注册的一些自定义属性

作用:    向子组件传递数据

特点:  可以传递任意数据,任意类型的prop

props校验:  为组件中的prop指定严正要求,不符合要求,控制台会有错误提示

  props: {
	  校验的属性名: {
		  type:类型,--->Number,String,Object,Array,Function,Boolean,
		  required:true, //是否必填
		  default:默认值, //默认值和是否必填选择其一即可
		  vaildator(value){
			  // 自定义校验逻辑
			  return 是否通过校验
		  }
	  }
  }

单向数据流

父组件的prop更新,会单向的向下流动影响到子组件从而影响到视图

prop和data单向数据流的特点:

  • 共同点:都可以给组件提供数据
  • 区别:data的数据是自己的,可以随意更改;prop的数据是外部的,不能直接更改,要遵循单向数据流的原则(谁的数据谁负责) 

七、非父子通信

1.eventbus事件总线(可以一传多)--->作用是在非父子组件之间,进行简易的消息传递(复杂场景--->vuex)

步骤:

  • 创建一个都能访问到的事件总线(空vue实例)---作为媒介
  • 接收方的组件监听bus实例事件---$on('事件名')
  • 发送方的组件触发bus实例事件---$emit('事件名')

2.provide和inject

作用:跨层级共享数据

步骤:

  •  父组件provide提供数据---->provide () { return {数据} }
  • 子孙组件inject取值使用---->inject: []
  • 简单类型传递的非响应式,复杂类型传递的响应式数据

八、v-model原理

原理:v-model本质上是一个语法糖, 例如利用在输入框上就是value属性和input事件的合写(应用与不同的表单元素,设置的dom属性和绑定的事件稍有不同)

作用:提供数据的双向绑定

1.v-model:

  • 数据变,视图跟着变---> :value
  • 视图变,数据跟着变--->@input (监听事件,监听输入框的输入)

注意$emit用在模板中的时候,获取事件的形参,input和click事件的形参是e事件对象

在行内中想要拿到当前事件的形参(事件对象)---->$event.target

2.表单类组件封装和v-model简化代码

2.1表单类组件封装

  • 父传子:数据应该是父组件props传递过来的,v-model拆解绑定数据
  • 子传父:监听输入,子传父传值给父组件修改

e.target触发事件的事件源,$emit获取事件的形参,下拉菜单的绑定事件是change,因为数据不是子组件的,所以不能使用v-model直接修改,否则会报错

2.2父组件v-model简化代码,实现子组件和父组件数据的双向绑定

  • 子组件中props通过value接收,事件触发$emit(value和input事件两者缺一不可)
  • 父组件中:v-model给组件直接绑定数据

八、.sync修饰符

作用:可以实现子组件与父组件数据的双向绑定,简化代码

特点:prop属性名可以自定义,非固定为value

本质是 :属性名和@事件:属性名合写

:属性.sync === :属性+@事件:属性名

九、ref和refs

作用:利用ref和refs可以获取dom元素或者组件实例

特点:查找范围--->当前组件内(更加精确稳定)

querySelector的查找范围是整个页面(容易出现找错的情况)

例如:获取dom

步骤:

  • 目标标签----添加ref属性
  • 恰当时机mounted内部(操作dom的生命周期函数)通过this.ref.ref属性值来获取目标标签
<div ref="chartRef">我是渲染图表的容器</div>
mounted () {  console.log(this.$refs.chartRef)}

十、vue异步更新和$nextTick

vue是异步更新dom以便于提升性能

$nextTick是等dom更新后,才会触发执行此方法里面的函数体

<template>
  <div class="app">
    <div v-if="isShowEdit">
      <input type="text" v-model="editValue" ref="inp" />
      <button>确认</button>
    </div>
    <div v-else>
      <span>{{ title }}</span>
      <button @click="editFn">编辑</button>
    </div>
  </div>
</template>

<script>
export default {
  data() {
    return {
      title: '大标题',
      isShowEdit: false,
      editValue: '',
    }
  },
  methods: {
    editFn() {
        // 显示输入框
        this.isShowEdit = true  
        // 获取焦点
        this.$refs.inp.focus() 
    }  },
}

十一、自定义指令

内置指令:v-html,v-model,v-for...等

每个指令都有自己各自独立的功能,自定义指令可以封装一些dom操作,扩张额外的功能,比如说v-focus自动聚焦,v-loading控制加载,v-lazy图片懒加载...

1.自定义指令-注册的语法

全局注册的语法:

  vue.directive('指令名',{
    inserted(el){
      //可以对el标签扩展额外的功能
      el.focus
    }
  })

局部注册的语法:

directives: {
  指令名: {
    inserted(el) {
      // 可以对el标签扩展额外的功能
      el.focus
    }
  }
}

使用:v-指令名

2.自定义指令-指令的值 

语法:在绑定指令时,可以通过"等号"的形式为指令绑定具体的参数值-----v-指令名 = "指令值"

通过binding、value可以拿到指令值,指令值修改会触发update函数

update指令的值修改时触发---提供的值变化后,dom更新的逻辑

十二、插槽

作用:让组件内部的一些结构支持自定义

1.默认插槽(组件内定制一处结构)

插槽的基本语法:

  • 组件内需要定制的结构部分,改用<slot></slot>占位
  • 使用组件时,<MyDialog>在这里传入结构替换slot</MyDialog>
<div class="box">
    <slot> 也可以在这里输入默认的内容(也称为后备内容) </slot>
</div>
<MyDialog>
'输入内容,在这里输入可以替换slot整体;如果不输入内容则默认使用后备内容'
</MyDialog>

2.具名插槽(可以定义多处结构)

slot有了name属性之后就是具名插槽,通过template将其包裹成一个整体----分发结构

语法:

  • 多个slot使用name属性区分名字----<slot name= "名字"> </slot> 
  • template配合v-slot:名字来分发对应标签(可以简写为#名字)
    //第一种写法
    <MyDialog>
        <template v-slot:名字></template>
    </MyDialog>
    
    //简写语法
    <MyDialog>
        <template #名字></template>
    </MyDialog>

3.作用域插槽(插槽传参的语法)

定义:在定义slot插槽的同时,是可以传值的,给插槽上可以绑定数据,将来使用组件时可以用

语法:

  • 给slot标签以添加属性的方式传值
  • 所有被添加的属性都会被收集到一个对象之中
  • 在template中通过 `#插槽名=obj`接收,默认插槽名为default,具名插槽则为`#具名插槽=obj`--obj是变量名可以自定义,也可以对obj进行结构

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

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

相关文章

西瓜书总结——决策树原理+ID3决策树的模拟实现

西瓜书总结——决策树原理ID3决策树的模拟实现 前言1. 决策树结构2. 决策树的生成&#xff08;注意区分属性和类别&#xff09;3. 划分选择3.1 信息熵和信息增益3.2 增益率3.3 基尼指数&#xff08;鸡你指数&#xff09; 4. 剪枝处理4.1 预剪枝4.2 后剪枝 5. 连续值与缺失值处理…

获取东方财富网股票的实时数据股票的数据,并保存到Excel文件中

可以运行python文件获取东方财富网:【序号,代码,名称,最新价,涨跌幅,涨跌额,成交量,成交额,振幅,最高,最低,今开,昨收,量比,换手率,市盈率-动态,市净率,总市值,流通市值,涨速,5分钟涨跌,60日涨跌幅,年初至今涨跌幅,】数据,保存到Excel文件中。 import pandas as pd import re…

使用 Ollama 和 Open WebUI 自托管 LLM 聊天机器人(无需 GPU)

✨点击这里✨&#xff1a;&#x1f680;原文链接&#xff1a;&#xff08;更好排版、视频播放、社群交流、最新AI开源项目、AI工具分享都在这个公众号&#xff01;&#xff09; 使用 Ollama 和 Open WebUI 自托管 LLM 聊天机器人&#xff08;无需 GPU&#xff09; &#x1f31…

OS复习笔记ch7-3

承接上文我们讲完了页式管理和段式管理&#xff0c;接下来让我们深入讲解一下快表和二级页表 快表 快表和计算机组成原理讲的Cache原理如出一辙。为了减少访存的次数&#xff0c;OS在访问页面的时候创建了快表&#xff08;Translation Lookaside Buffer &#xff0c;简称TLB&…

数字滤波器和模拟滤波器(一)

模拟滤波器和数字滤波器&#xff08;一&#xff09; 下面介绍模拟滤波器和数字滤波器的频率响应的异同&#xff0c;以及如何使用python地scipy.signal来绘制其频谱响应和冲激阶跃响应。在第二期将谈到如何设计模拟滤波器和数字滤波器。 在正文之间&#xff0c;应该介绍连续时…

【面向就业的Linux基础】从入门到熟练,探索Linux的秘密(一)

主要帮助大家面向工作过程中Linux系统常用的命令联系&#xff0c;采用极致的实用主义&#xff0c;帮助大家节省时间。 文章目录 前言 一、linux系统 二、linux系统基本命令 1.Linux系统的目录结构 2. 常用命令介绍 3.命令演示 4.作业练习 总结 前言 主要帮助大家面向工作过程中…

【Spring框架全系列】SpringBoot_3种配置文件_yml语法_多环境开发配置_配置文件分类(详细)

文章目录 1.三种配置文件2. yaml语法2.1 yaml语法规则2.2 yaml数组数据2.3 yaml数据读取 3. 多环境开发配置3.1 多环境启动配置3.2 多环境启动命令格式3.3 多环境开发控制 4. 配置文件分类 1.三种配置文件 问题导入 框架常见的配置文件有哪几种形式&#xff1f; 比如&#xf…

接口幂等性设计(5 大方案罗列)

结合案例、列举场景的接口幂等性设计方案。 方案 1. 状态机 业务场景&#xff0c;数据审核成功后进行短信通知&#xff0c;或者是订单状态变成已支付后&#xff0c;短信通知用户订单生成的详细信息&#xff0c;等等和状态有关的操作。 假设 status&#xff1a;0&#xff08;待…

SSL/TLS和HTTPS

HTTPS就是用了TLS包装的Socket进行通信的HTTP 混合加密 被称为混合加密。具体过程如下&#xff1a; 使用非对称加密协商对称密钥&#xff1a; 在通信的开始阶段&#xff0c;通常由客户端和服务器使用非对称加密算法&#xff08;如RSA&#xff09;来协商一个对称密钥。通常情…

Linux日志服务rsyslog深度解析(下)

&#x1f407;明明跟你说过&#xff1a;个人主页 &#x1f3c5;个人专栏&#xff1a;《Linux &#xff1a;从菜鸟到飞鸟的逆袭》&#x1f3c5; &#x1f516;行路有良友&#xff0c;便是天堂&#x1f516; 目录 一、rsyslog的核心功能 1、日志消息的收集 2、日志消息的传…

Diffusers代码学习: IP-Adapter

从操作的角度来看&#xff0c;IP-Adapter和图生图是很相似的&#xff0c;都是有一个原始的图片&#xff0c;加上提示词&#xff0c;生成目标图片。但它们的底层实现方式是完全不一样的&#xff0c;我们通过源码解读来看一下。以下是ip adapter的实现方式 # 以下代码为程序运行…

【启程Golang之旅】网络编程与反射

欢迎来到Golang的世界&#xff01;在当今快节奏的软件开发领域&#xff0c;选择一种高效、简洁的编程语言至关重要。而在这方面&#xff0c;Golang&#xff08;又称Go&#xff09;无疑是一个备受瞩目的选择。在本文中&#xff0c;带领您探索Golang的世界&#xff0c;一步步地了…

[stm32]——uc/OS-III多任务程序

目录 一、获取uC/OS-III源码 二、移植源代码 &#xff08;1&#xff09;建立工程文件 &#xff08;2&#xff09;移植uC/OS-III源码 &#xff08;3&#xff09;添加工程组件和头文件路径 &#xff08;4&#xff09;添加头文件路径 三、修改代码 总结 一、获取uC/OS-III源码 …

jvm学习笔记(一) ----- JAVA 内存

JAVA 内存 一、程序计数器二、虚拟机栈三、本地方法栈四、堆五、非JAVA内存(堆外内存)1.元空间(Metaspace)2.直接内存 链接: jvm学习笔记(二) ----- 垃圾回收 链接: jvm学习笔记(三) ----- 垃圾回收器 一、程序计数器 虚拟机需要通过『程序计数器』记录指令执行到哪了。线程要…

高考填报志愿,怎么分析自己适合什么专业?

高考结束后&#xff0c;很多考生不知道自己的分数段适合什么学校&#xff0c;缺乏目标感&#xff0c;有些专业名称很大&#xff0c;听起来光鲜亮丽&#xff0c;但是是否适合自己&#xff0c;学什么课程&#xff0c;将来就业去向&#xff0c;这些都是需要细致了解的。 专业选择…

【Java】解决Java报错:StackOverflowError

文章目录 引言1. 错误详解2. 常见的出错场景2.1 无限递归2.2 递归深度过大2.3 方法调用层次过深 3. 解决方案3.1 优化递归算法3.2 尾递归优化3.3 增加调用栈大小3.4 检查递归终止条件 4. 预防措施4.1 使用迭代替代递归4.2 尾递归优化4.3 合理设计递归算法4.4 调整JVM参数4.5 定…

Python通过数据验证功能在Excel文件中创建下拉列表

Excel表格的灵活性和功能性深受各行各业人士的喜爱。在Excel表格中&#xff0c;下拉列表功能是提升数据录入效率与准确性的一个重要利器&#xff0c;能够为用户提供预设的选择项&#xff0c;限制输入范围&#xff0c;避免手动输入错误&#xff0c;还能够简化数据录入过程&#…

APP开发技术的变迁史

随着移动互联网的迅猛发展&#xff0c;APP&#xff08;应用程序&#xff09;已经成为人们日常生活中不可或缺的一部分。从最初的简单工具到如今的智能平台&#xff0c;APP开发技术在这十年间经历了翻天覆地的变化。本文将从多个维度探讨近十年来APP开发技术的变迁史&#xff0c…

数组中寻找符合条件元素的位置(np.argwhere,nonzero)

今天遇到一个问题&#xff0c;就是寻找符合条件的元素所在的位置&#xff0c;主要使用np.argwhere和nonzero函数 比如给我一个二维数组&#xff0c;我想知道其中元素大于15的位置 方法1 import numpy as np exnp.arange(30) enp.reshape(ex,[3,10]) print(e) print(e>15…

【C++】C++ 基于QT实现散列表学生管理系统(源码+数据+课程论文)【独一无二】

&#x1f449;博__主&#x1f448;&#xff1a;米码收割机 &#x1f449;技__能&#x1f448;&#xff1a;C/Python语言 &#x1f449;公众号&#x1f448;&#xff1a;测试开发自动化【获取源码商业合作】 &#x1f449;荣__誉&#x1f448;&#xff1a;阿里云博客专家博主、5…