组件的样式冲突--scoped
- 默认情况:
- 写在组件中的样式会全局生效 -> 容易造成多个组件之间的样式冲突问题
- 全局样式:默认组件中的样式会作用的全局
- 局部样式:给组件加上 scoped 属性,可以让样式仅作用于当前组件
- scopped 原理
- 当前组件内标签都被加上 data-v-hash值 的属性
- css选择器都被添加【data-v-hash值】 的属性选择器
data 必须写为一个函数
- 一个组件的 data 选项必须是一个函数,保证每个组件实例,维护独立的一份数据对象
- 每次创建新的组件实例,都会执行一次 data 函数,得到一个新对象
组件之间的通信
- 父子通信流程
- 父传子
- 在父中添加属性给子传值
- 子使用 props 接受
- 使用
- 子传父
- 子 ¥emit 发送消息
- 父给子中添加消息监听
- 父中实现处理函数
- 父传子
什么是prop
- 定义:组件上注册的一些自定义属性
- 作用:向子组件传递数据
- 特点:
- 可以传递任意数量的prop
- 可以传递任意类型的prop
props 校验
- 组件的 prop 不可以乱传(类型)
- 作用:为组件的 prop 指定验证要求
- 语法:
- 类型校验
- 非空校验
- 默认值
- 自定义校验
prop & data 和 单向数据流
- prop & data
- 共同点:给组件提供数据
- 不同点:
- data 数据是自己的 --> 随便改
- prop 数据是外部的 --> 不能直接改,要遵循单向数据流
- 单向数据流:
- 父级 prop 的数据更新,向下流动,影响子组件。这个数据的流动是单向的
组件通信案例:小黑记事本 -- 组件版
- 拆分组件
- 将 App.vue 中的 header、main、footer 拆分为三个组件
- 渲染功能
- 提供数据 --> 提供在公共的父组件 APP.vue 中
- 通过父传子,将数据传递给 ToDoMain.vue 子组件中
- 在子组件中接收,并利用 v-for 进行渲染
- 提供数据 --> 提供在公共的父组件 APP.vue 中
- 添加功能
- v-model 实现收集表单数据
- 监听事件(回车 + 点击)
- 子传父,将任务名称传递给父组件 App.vue
- 添加数据到父组件中的 data (使用 unshift 方法)
- v-model 实现收集表单数据
- 删除功能
- 监听点击事件,携带id
- 子传父,将需要删除的id传递给父组件
- 在父组件中使用 filter 进行删除
- 底部合计
- 父传子 list 双括号渲染
- 父传子 list 双括号渲染
- 清空全部
- 子传父,父组件负责清空
- 子传父,父组件负责清空
非父子通信 -- event bus 事件总线
- 作用:
- 非父子组件之间,进行简易消息传递 (复杂场景使用 VueX)
- 创建一个都能访问到的事件总线(空 Vue 实例) ->
- A组件(接收方),监听 Bus 实例的事件
- B组件(发送方),触发 Bus 实例的事件
跨层级共享数据 -- provide & inject
- 父组件 provide 提供数据
- 子 / 孙 inject 取值使用
v-model 原理
- 原理
- v-model 本质上是一个语法糖(是语法的简写),例如应用在输入框上,就是 value属性和 input事件的合写
- 作用:
- 提供数据的双向绑定
- 数据发生改变,页面会自动变 :value
- 页面输入改变,数据会自动变 @input
- 提供数据的双向绑定
- 注意:¥event 用于在模板中获取事件的形参
封装表单类组件 & v-model简化代码
- 表单类组件的封装
- 父传子:数据由父组件传递过来,使用 props 接收,拆解 v-model 绑定数据
- 注意:在子组件中不可以使用 v-model 直接绑定 props 接收的数据
- 子传父:监听输入,子组件传值给父组件进行修改
- 父传子:数据由父组件传递过来,使用 props 接收,拆解 v-model 绑定数据
- v-model 简化代码
- 子组件中:props 通过 value 接收,事件触发 input
- 父组件中:v-model 给组件直接绑定数据
.sync 修饰符
- 作用:
- 实现 子组件 与 父组件 的双向绑定
- 特点:
- prop属性名,可以自定义,不固定为 value
- 场景:
- 封装弹框类基础组件,visible属性(true显示,false隐藏)
- 原理:
- 是 :属性名 和 @update:属性名 的合写
ref 和 ¥refs
- 作用:
- 利用 ref 和 ¥refs 可以用于获取 dom 元素,或 组件实例
- 特点
- 查找范围 -> 当前组件内(更精确,更稳定)
- 获取组件实例
Vue异步更新、¥nextTick
-
需求: 编辑标题,编辑框自动聚焦
- 点击编辑,显示编辑框
- 编辑框立刻获取焦点
-
问题:“显示之后”,立刻获取焦点是不成功的
- 原因:Vue 是异步更新 DOM
-
-