Henry Henry
  • JavaScript
  • TypeScript
  • Vue
  • ElementUI
  • React
  • HTML
  • CSS
  • 技术文档
  • GitHub 技巧
  • Nodejs
  • Chrome
  • VSCode
  • Other
  • Mac
  • Windows
  • Linux
  • Vim
  • VSCode
  • Chrome
  • iTerm
  • Mac
  • Obsidian
  • lazygit
  • Vim 技巧
  • 分类
  • 标签
  • 归档
  • 网站
  • 资源
  • Vue 资源
GitHub (opens new window)

Henry

小学生中的前端大佬
  • JavaScript
  • TypeScript
  • Vue
  • ElementUI
  • React
  • HTML
  • CSS
  • 技术文档
  • GitHub 技巧
  • Nodejs
  • Chrome
  • VSCode
  • Other
  • Mac
  • Windows
  • Linux
  • Vim
  • VSCode
  • Chrome
  • iTerm
  • Mac
  • Obsidian
  • lazygit
  • Vim 技巧
  • 分类
  • 标签
  • 归档
  • 网站
  • 资源
  • Vue 资源
GitHub (opens new window)
  • JavaScript

  • TypeScript

  • Vue

    • Vue 编码指南
    • vue-cli 启动本地服务局域网不能访问的原因分析
    • 解决 Vue 相同路由参数不同不会刷新的问题
    • 解决 vuex requires a Promise polyfill in this browser 问题
    • 关于父组件通过 v-on 接收子组件多个参数的一点研究
    • Vue $attrs 和 $listeners
    • Vue axios 发送 Form Data 数据格式请求
    • Vue 开发技巧
    • Vue 动态路由
    • Vue 集成 UEditor 富文本编辑器
    • Vue 修饰符
    • Vue 问题集合
      • 封装组件时 slot 的处理
    • Vue props 传多值的问题
    • vue-router 在 IE11 下手动更改 URL 的 hash 不会触发路由
    • vue-router 路由参数刷新消失的问题
    • 那些年被我们忽略的 vue 语法
    • vue 生命周期深入
    • vue 组件通信深入
    • vue 组件通信深入 Vuex
    • vue项目移动端、pc端适配方案
    • vuepress 如何引入 vuex
  • ElementUI

  • React

  • AntD

  • 前端
  • Vue
Henry
2020-05-04
目录

Vue 问题集合

收集工作中使用 Vue 遇到的一些问题

# 封装组件时 slot 的处理

最近在优化以前基于 ElementUI 封装的上传组件时(上传文件时加一个进度条), 发现同样的代码, 使用 ElementUI 和自己封装的组件样式不一样:

different

这里是源码, 当然已经修改好了 (opens new window)

封装组件修改前的简略代码:

<template>
  <el-upload
    ref="upload"
    class="upload-file"
  >
    <slot name="trigger"></slot>
    <slot><el-button type="primary" size="small">点击上传</el-button></slot>
    <slot name="tip"></slot>
  </el-upload>
</template>
1
2
3
4
5
6
7
8
9
10

调用组件的简略代码:

<upload-file
  action="https://jsonplaceholder.typicode.com/posts/"
>
  <el-button size="small" type="primary">点击上传</el-button>
  <div slot="tip" class="el-upload__tip">只能上传jpg/png文件,且不超过500kb</div>
</upload-file>
1
2
3
4
5
6

审查元素发现自己的 .el-upload 既包含了上传按钮, 也包含了提示文字:

.el-upload

而 ElementUI 的 .el-upload 只包含上传按钮, 提示文字和它是兄弟元素

.el-upload

最后自己跟着代码走了一遍后发现问题所在了: 自己封装的时候, slot 确实起作用了, 但只起到了接收传入的值的功能; 传入到 el-upload 后, 并没有给这些标签加 slot, 就变成这样了:

<el-upload
  ref="upload"
  class="upload-file"
>
  <el-button size="small" type="primary">点击上传</el-button>
  <div class="el-upload__tip">只能上传jpg/png文件,且不超过500kb</div>
</el-upload>
1
2
3
4
5
6
7

所以 el-upload 就把这两个标签都当成默认插槽了, 都放到 .el-upload 这个标签里面了.

所以封装组件中这两个 slot 不仅要承担接收外部传入的值, 还承担了将这些值传入到 el-upload 中的功能:

<el-upload
  ref="upload"
  class="upload-file"
>
  <slot name="trigger" slot="trigger"></slot>
  <slot><el-button type="primary" size="small">点击上传</el-button></slot>
  <slot name="tip" slot="tip"></slot>
</el-upload>
1
2
3
4
5
6
7
8

所以以后封装组件需要加具名 slot 时, 一定要把 name 和 slot 这两个属性都加上

编辑 (opens new window)
#Vue
上次更新: 5/27/2023, 1:02:05 PM
Vue 修饰符
Vue props 传多值的问题

← Vue 修饰符 Vue props 传多值的问题→

最近更新
01
version 1.15
07-01
02
version 1.14
06-27
03
version 1.13
06-27
更多文章>
Theme by Vdoing | Copyright © 2017-2023 HenryTSZ | MIT License
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式