Vue学习记录(五)

163 阅读4分钟

自定义指令

  • 自定义指令:自己定义指令,用于封装一些 dom 操作,扩展额外功能
  • 全局注册
  • 8f4952effcad0d6e49004ff751b815f6.png
  • 局部注册
  • c24725a851b8721c648ee11d4e6e7545.png

自定义指令的值

  • 需求:实现一个 color 指令,传入不同颜色,给标签设置文字颜色
  • 语法:在绑定指令时,可以通过“等号”的形式为指令绑定具体的参数值
  • 99e28a86e87c2614154e015283a5c564.png
  • 通过binding.value可以拿到指令值,指令值修改会触发 update 函数
  • image.png

封装 v-loading 指令

  • 场景:实际开发过程中,发送请求需要时间,在请求的数据未返回时,页面将处于空白状态 -> 用户体验差
  • 需求:封装一个 v-loading 指令,实现加载中的效果
  • ebb05f4ae58338e8dab63f16ae659324.png
  • 分析
    1. loading效果本质是一个蒙层,盖在了盒子上
    2. 数据请求中,开启 oading 态,添加蒙层
    3. 数据请求完毕,关闭 loading 状态,移除蒙层
  • 实现
    1. 准备一个 loading 类,通过为元素定位,设置宽高,实现蒙层
      • c6715ca4c29164e8275c719714f324d8.png
    2. 开启/关闭 loading 状态(添加/移除蒙层),本质为添加或移除类
      • 77991368dff21aa9967a072f3d5dc5e2.png
    3. 结合自定义指令语法进行封装使用
      • 2e04069c017f25991f5d189b3450751c.png

插槽 --- 默认插槽

  • 作用:
    • 让组件内部的一些结构支持自定义
  • 需求:
    • 要在页面中显示一个对话框,封装成一个组件
    • 7fd2a68774e56581bbf4716c9a88396a.png
  • 问题:
    • 组件的内容部分不希望写死,想要实现自定义
  • 基本语法:
    1. 组件内需要定制的结构部分,使用 <slot></slot> 占位
    2. 使用组件时,<MyDialog></MyDialog> 标签内部,传入结构替换slot
    • bb08ae00ad8a0b577925be2c192b5ae8.png

插槽 --- 后备内容(默认值)

  • 场景:不给插槽传值时,显示空白
  • 需求:能否给插槽设置默认显示内容
    • 72851d56e29dd0d58fc243ad3de2b8f7.png
  • 插槽后备内容:
    • 封装组件时,可以为预留的<slot>插槽提供后备内容(默认内容)
  • 语法:
    • slot标签内放置内容,即可作为默认显示内容
  • 效果:
    • 若外部组件不传内容,则slot会显示后备内容
    • 若外部组件传入内容,则slot整体被换掉
    • 529fda42087486bc7d80aca9cd2db1bb.png

插槽 --- 具名插槽

  • 需求:
    • 一个组件内有多处结构, 需要外部传入标签,进行定制;而默认插槽只有一个定制的位置
    • a3155ab19a00a9f896d3eed5b5718247.png
  • 具名插槽语法:
    1. 多个 slot 使用 name 属性区分名字
      • fbfa8cb8d00b647b64955b2618c8085a.png
    2. template 配合 v-slot: 名字来分发对应标签
      • 546b4f1bb423bf0a437a66a16cccc265.png
      • cbc7e008a7d7428b54a7d0f3ec083e22.png
    3. v-slot: 可以简写成 #插槽名
    4. 一旦插槽起了名字,就是具名插槽,仅支持定向分发

插槽 --- 作用域插槽

  • 作用域插槽:
    • 定义 slot 插槽的同时,是可以传值的。可以给插槽绑定输出数据,将来使用组件时可以使用
  • 场景:封装表格组件
  • 实现思路:
    1. 父传子,动态渲染表格内容
    2. 利用默认插槽,定制操作列
    3. 删除或查看都需要用到当前项的id,属于组件内部的数据,通过作用域插槽传值绑定,进而使用
  • 使用步骤
    1. 给 slot 标签,以添加属性的方式传值
      • 5d8235958557cbe4f5a0c893d2c9daa7.png
    2. 所有添加的属性都会被收集到一个对象中
      • f4ed9d870ee6ea5501f530391d62f210.png
    3. 在 template 中,通过#插槽名 = 'obj'接收,默认插槽名为 efault
      • 858af86f336fba129c5f14e431a539b5.png
      • f45abd4723e1300cd07638c0e96a8cf2.png

综合案例 -- 商品列表

  • 最终样式:

  • ecd5115e5fdb52e1627e08926db85ab2.png

  • my-tag 标签组件的封装

    1. 创建组件 - 初始化
    2. 实现功能:
    • dcd5e0cee3d163d71332a736d0df88d6.png
      1. 双击显示并自动聚焦 (v-if、v-else、@dbclick)
      • 0f442d8218d88d4fd492dd0c0f91b044.png
    • 7ee757f7fca77cec0e27a847adcef159.png 2. 封装 v-focus 指令
      • ab0e1c7677794057f856984b3b5b8e4e.png
      • a17290ebee54a188222017d83eb1017d.png
      1. 失去焦点,隐藏输入框
      • 9124d8aa29fdf35245a49237bd092720.png
      1. 回显标签信息
      • 由父组件传递进来,使用 v-model => :value @input 来实现双向传递,简化代码
      • 组件内部通过 props 接收,:value 设置信息给输入框
      1. 内容修改了,回车 => 修改标签信息
      • @keyup.enter,触发事件 $emit('input', e.target.value)
      • 62182cfcdc8017d8e66fc18fea3ecbbe.png
  • 表格组件的封装

    1. 数据不能写死,动态传递表格渲染的数据 - props
    2. 结构不能写死 - 具名插槽
      • (1) 表头支持自定义

      • (2) 主体支持自定义

      • a52fdb9d7826e0d7498d9007ae003446.png

      • a1dbfe59392160aeeff1ed6b43caf34e.png

单页应用程序(SPA)

  • 单页面应用:所有功能在一个 html 页面上实现
  • 02f764cd22bccc1082001e46ae65e654.png
  • a0b7a9c16c8790f63c27264259c6988a.png
  • 0234a46ac5243c4c4b9368dcf470ef44.png

路由基本介绍

  • 路由就是一种映射关系
  • SPA最大的特点是按需更新
  • 要明确 访问路径组件 的对应关系
  • Vue路由:路径和组件的映射关系
  • 47cf746f5fc05c2bab3b24fca9430a0b.png

VueRouter 的介绍

  • Vue官方提供的路由插件
    • 作用:修改地址栏路径时,切换显示匹配的组件
  • 官网:v3.router.vuejs.org/zh/
  • VueRouter 的使用(5 + 2)
    • 五个基础步骤(固定)
    • d594300475996ad395aab7d5c5edef27.png
      1. 下载:下载VueRouter模块到当前工程,Vue2对应版本3.6.5
      • yarn add vue-router@3.6.5
      1. 引入
      • import VueRouter from 'vue-router'
      1. 安装注册(与Vue有关的插件)
      • Vue.user(VueRouter)
      1. 创建路由对象
      • const router = new VueRouter
      1. 注入
    • da5b74a438d94b23535488cbe54ed0d3.png
    • 两个核心步骤
      1. 创建需要的组件(views目录),配置路由规则
      • b1cc4d8be75e8ef6611723223fb47751.png
      1. 配置导航,配置路由出口
      • 3bea657b974bcfd74c7fbd79d6f07377.png

组件存放目录问题(组件分类)

  • 组件分类
    • 页面组件
    • 复用组件
    • e7ae24a44fa95b3617d6cabd2f39674e.png
  • 分类目的:更易维护
    • 页面组件放入views文件夹内 --> 配合路由使用
    • 复用组件放入components文件夹内 --> 封装复用