-
Notifications
You must be signed in to change notification settings - Fork 0
Day04
ZZHow edited this page Feb 10, 2025
·
1 revision
参考课程:
【黑马程序员 Vue2+Vue3基础入门到实战项目】
[https://www.bilibili.com/video/BV1HV4y1a7n4]
@ZZHow(ZZHow1024)
-
scoped 样式冲突
- 默认情况:写在组件中的样式会 全局生效 - 因此很容易造成多个组件之间的样式冲突问题。
- 全局样式:默认组件中的样式会作用到全局。
- 局部样式:可以给组件加上
scoped
属性,可以让样式只作用于当前组件。
- scoped 原理
- 当前组件内标签都被添加
data-v-hash
值的属性。 - CSS 选择器都被添加[
data-v-hash
值]的属性选择器。
- 最终效果:必须是当前组件的元素,才会有此自定义属性,被此样式作用到。
- 当前组件内标签都被添加
- 默认情况:写在组件中的样式会 全局生效 - 因此很容易造成多个组件之间的样式冲突问题。
-
data 是一个函数
- 一个组件的 data 选项必须是一个函数。保证每个组件实例,维护独立的一份数据对象。
- 每次创建新的组件实例,都会新执行一次 data 函数,得到一个新对象。
data() { return { count: 100 } }
- 组件通信:指组件与组件之间的数据传递。
- 组件的数据是独立的,无法直接访问其他组件的数据。
- 想用其他组件的数据 → 组件通信。
- 组件关系分类:
- 父子关系
- 非父子关系
- 组件通信语法
- 组件通信解决方案:
- 父子关系
-
props
和$emit
-
- 非父子关系
-
provide
&inject
eventbus
-
- 通用解决方案:Vuex(适合复杂业务场景)
- 父子关系
- 组件通信解决方案:
- 父传子
- 父组件通过
props
将数据传递给子组件- 父中给子添加属性传值。
- 子
props
接收。 - 使用。
- 父组件通过
- 子传父
- 子组件利用
$emit
通知父组件修改更新- 子
$emit
发送消息。 - 父中给子添加消息监听。
- 父中实现处理函数。
- 子
- 子组件利用
- props 详解
-
prop 介绍
- prop 定义:组件上注册的一些自定义属性。
- prop 作用:向子组件传递数据。
- 特点:
- 可以传递任意数量的 prop。
- 可以传递任意类型的 prop。
-
prop 校验
- 作用:为组件的 prop 指定验证要求,不符合要求,控制台就会有错误提示 → 帮助开发者,快速发现错误。
- 语法:
-
类型校验
//简写 props: { 校验的属性名:类型 // Number String Boolean ... }
-
非空校验
-
默认值
-
自定义校验
//完整写法 props: { 校验的属性名: { type: 类型, // Number String Boolean ... required: true, // 是否必填 default: 默认值, // 默认值 validator(value) { // 自定义校验逻辑 return 是否通过校验 } } }
-
-
prop & data、单向数据流
- 共同点:都可以给组件提供数据。
- 区别:
- data 的数据是自己的,随便改。
- prop 的数据是外部的,不能直接改,要遵循单向数据流。
- 单向数据流:父级 prop 的数据更新,会向下流动,影响子组件。这个数据流动是单向的。
- 口诀:谁的数据谁负责。
-
- 需求:
- 拆分基础组件
- 新建组件 → 拆分存放结构 → 导入注册使用
- 渲染代办任务
- 提供数据(公共父组件) → 父传子传递 list → v-for 渲染
- 添加任务
- 收集数据 v-model → 监听事件 → 子传父传递任务 → 父组件 unshift
- 删除任务
- 监听删除携带 id → 子传父传递 id → 父组件 filter 删除
- 底部合计
- 父传子传递 list → 合计展示
- 清空功能
- 监听点击 → 子传父通知父组件 → 父组件清空
- 持久化存储
- watch 监视数据变化,持久化到本地。
- 拆分基础组件
- 案例演示:little-black-notebook-component-edition
-
event bus 事件总线
-
作用:非父子组件之间,进行简易消息传递。(复杂场景 → Vuex)
-
步骤:
- 创建一个都能访问到的事件总线(空 Vue 实例) → utils/EventBus.js
import Vue from 'vue'; const Bus = new Vue(); export default Bus;
- A 组件(接收方),监听 Bus 实例的事件
created() { Bus.$on('sendMsg', (msg) => { this.msg = msg; }) }
- B 组件(发送方),触发 Bus 实例的事件
Bus.$emit('sendMsg', '消息');
-
-
provide & inject
-
作用:跨层级共享数据。
-
步骤:
- 父组件
provide
提供数据
export default { provide() { return { // 普通类型(非响应式) color: this.color, // 复杂类型(响应式) userInfo:this.userInfo } } }
- 子 / 孙组件
inject
取值使用
export default { inject: ['color', 'userInfo'] }
- 父组件
-
-
v-model 原理
- 原理:v-model 本质上是一个语法糖。例如应用在输入框上,就是
value
属性 和input
事件的合写。
<input v-model="msg" type="text"> <input :value="msg" @input="msg = $event.target.value" type="text">
- 作用:提供数据的双向绑定。
- 数据变,视图跟着变
:value
。 - 视图变,数据跟着变
@input
。
- 数据变,视图跟着变
- 注意:
$event
用于在模板中,获取事件的形参。
- 原理:v-model 本质上是一个语法糖。例如应用在输入框上,就是
-
v-model 应用于组件
- 表单类组件封装
- 父传子:数据是父组件
props
传递 过来的,v-model
拆解绑定数据。 - 子传父:监听输入,子传父传值给父组件修改。
- 父传子:数据是父组件
- 父组件
v-model
简化代码,实现子组件和父组件数据双向绑定。- 子组件中:
props
通过value
接收,事件触发input
。 - 父组件中:
v-model
给组件直接绑数据(:value
+@input
)。
- 子组件中:
- 表单类组件封装
-
.sync 修饰符
- 作用:可以实现子组件与父组件数据的双向绑定,简化代码。
- 特点:
props
属性名,可以自定义,非固定为value
。 - 场景:封装弹框类的基础组件,
visible
属性 true 显示 false 隐藏。 - 本质:就是
:属性名
和@update:属性名
合写。
-
ref 和 $refs
- 作用:利用 ref 和$refs 可以用于获取 DOM 元素或组件实例。
- 获取 DOM:
- 目标标签 - 添加
ref
属性。 - 恰当时机,通过
this.$refs.xxx;
,获取目标标签。
- 目标标签 - 添加
- 获取组件实例:
- 目标组件 - 添加
ref
属性。 - 恰当时机,通过
this.$refs.xxx;
,获取目标组件,就可以调用组件对象里面的方法。
- 目标组件 - 添加
- 获取 DOM:
- 特点:查找范围 → 当前组件内(更精确稳定)。
- 作用:利用 ref 和$refs 可以用于获取 DOM 元素或组件实例。
-
$nextTick
- Vue 是异步更新 DOM 的。
-
$nextTick
作用:等 DOM 更新后,再触发执行此方法里的函数体。 - 语法:
this.$nextTick(函数体);