收集工作中使用 Vue 遇到的一些问题
封装组件时 slot 的处理
最近在优化以前基于 ElementUI 封装的上传组件时(上传文件时加一个进度条), 发现同样的代码, 使用 ElementUI 和自己封装的组件样式不一样:

这里是源码, 当然已经修改好了
封装组件修改前的简略代码:
1 2 3 4 5 6 7 8 9 10
   | <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
   | <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>
   | 
 
审查元素发现自己的 .el-upload 既包含了上传按钮, 也包含了提示文字:

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

最后自己跟着代码走了一遍后发现问题所在了: 自己封装的时候, slot 确实起作用了, 但只起到了接收传入的值的功能; 传入到 el-upload 后, 并没有给这些标签加 slot, 就变成这样了:
1 2 3 4 5 6 7
   | <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>
   | 
 
所以 el-upload 就把这两个标签都当成默认插槽了, 都放到 .el-upload 这个标签里面了.
所以封装组件中这两个 slot 不仅要承担接收外部传入的值, 还承担了将这些值传入到 el-upload 中的功能:
1 2 3 4 5 6 7 8
   | <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>
   | 
 
所以以后封装组件需要加具名 slot 时, 一定要把 name 和 slot 这两个属性都加上