经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » Java相关 » Java » 查看文章
vue模拟el-table演示插槽用法Java大师-
来源:cnblogs  作者:Java大师-  时间:2023/5/30 11:07:24  对本文有异议

vue模拟el-table演示插槽用法

很多人知道插槽分为三种,但是实际到elementui当中为什么这么用,就一脸懵逼,接下来就跟大家聊一聊插槽在elementui中的应用,并且自己写一个类似el-table的组件

vue的slot分为三种::匿名插槽,具名插槽, 作用域插槽,主要作用:让父组件可以向子组件指定位置插入 html 结构,也是一种组件间通信的方式,适用于父组件=>子组件

1、匿名插槽

匿名组件相当于一个占位符,将父组件的数据传入子组件的slot标签内

父组件:

  1. <template>
  2. <ChildSlot>父组件调用</ChildSlot>
  3. </template>
  4. <script>
  5. import ChildSlot from "@/components/ChildSlot";
  6. export default {
  7. components:{
  8. ChildSlot
  9. }
  10. }
  11. </script>

子组件:

  1. <template>
  2. <h1>我是子组件</h1>
  3. <slot></slot>
  4. </template>
  5. <script>
  6. export default {
  7. name: "ChildSlot"
  8. }
  9. </script>

运行结果如下:

此时父组件中的“父组件调用”这段内容就传递到了子组件,并填入了slot挖的坑当中

image

2、具名插槽

具名插槽相当于给插槽添加了一个名字(给插槽加入name属性就是具名插槽)

父组件:

  1. <template>
  2. <child-slot>
  3. <template v-slot:username>我是父组件传递的用户姓名</template>
  4. </child-slot>
  5. <child-slot>
  6. <template v-slot:age>我是父组件传递的年龄</template>
  7. </child-slot>
  8. </template>
  9. <script>
  10. import ChildSlot from "@/components/ChildSlot";
  11. export default {
  12. components:{
  13. ChildSlot
  14. }
  15. }
  16. </script>

子组件:

  1. <template>
  2. <h1>我是子组件</h1>
  3. <slot name="username"></slot>
  4. <slot name="age"></slot>
  5. </template>
  6. <script>
  7. export default {
  8. name: "ChildSlot"
  9. }
  10. </script>

运行结果如下:

此时父组件中的根据slot的name,将内容填入了slot挖的坑当中,一个萝卜一个坑
image

3、作用域插槽

与前两者的不同 slot自定义:name="值" 子组件可向父组件传递信息

父组件:

  1. <template>
  2. <child-slot>
  3. <template v-slot="{username}">我是子组件传递的用户姓名:{{username}}</template>
  4. </child-slot>
  5. </template>
  6. <script>
  7. import ChildSlot from "@/components/ChildSlot";
  8. export default {
  9. components:{
  10. ChildSlot
  11. }
  12. }
  13. </script>

子组件:

  1. <template>
  2. <h1>我是子组件</h1>
  3. <slot :username="username"></slot>
  4. </template>
  5. <script>
  6. export default {
  7. name: "ChildSlot",
  8. data(){
  9. return{
  10. username:'java',
  11. }
  12. }
  13. }
  14. </script>

运行结果如下:

通过作用域插槽,我们可以将子组件中的值传入到父组件,在父组件进行数据处理后,填坑到子组件

4、模拟写一个el-table

先看一个el-table的例子,当需要对一行中的某一个单元格的内容进行处理的时候,需要用到slot插槽,例如下面的姓名name的处理

  1. <template>
  2. <el-table
  3. :data="tableData"
  4. style="width: 100%">
  5. <el-table-column
  6. label="姓名"
  7. width="180">
  8. <template slot-scope="scope">
  9. <el-popover trigger="hover" placement="top">
  10. <p>姓名: {{ scope.row.name }}</p>
  11. <p>住址: {{ scope.row.address }}</p>
  12. <div slot="reference" class="name-wrapper">
  13. <el-tag size="medium">{{ scope.row.name }}</el-tag>
  14. </div>
  15. </el-popover>
  16. </template>
  17. </el-table-column>
  18. <el-table-column
  19. prop="address"
  20. label="地址">
  21. </el-table-column>
  22. </el-table>
  23. </template>

参照el-table,实现我们自己的table组件,讲解下为什么需要用插槽,用了哪些插槽

4.1为了传递table,首先通过匿名插槽,写一个的组件,目的就是模拟下面这三行内容

? <el-table
? :data="tableData"
? style="width: 100%">

  1. <template>
  2. <div>
  3. <slot></slot>
  4. </div>
  5. </template>
  6. <script>
  7. export default {
  8. name: "MyTable"
  9. }
  10. </script>
4.2实现el-table-column,通过作用域插槽,写我们自己的el-table-column
  1. <template>
  2. <div>
  3. <div>
  4. <!--通过传递label标签,展示表头-->
  5. <span v-if="label">{{ label }}</span>
  6. </div>
  7. <!--获取主页面的data值:$parent.$parent.$data.tableList-->
  8. <div v-for="(user,index) in $parent.$parent.$data.tableList" :key="index">
  9. <!--当传递prop属性的时候,就取user用户的数据-->
  10. <div v-if="prop">{{user[prop]}}</div>
  11. <!--当不传递prop属性的时候,将用户的数据通过row属性,传递到父组件当中,也就是app.vue-->
  12. <slot v-else :row="user"></slot>
  13. </div>
  14. </div>
  15. </template>
  16. <script>
  17. export default {
  18. name: "MyTableColumn",
  19. props: {
  20. prop: {type: String},
  21. label: {type: String}
  22. }
  23. }
  24. </script>
4.2调用my-table,my-table-column

我们通过my-table标签,将内容my-table和my-table-column放置到my-table的匿名插槽中,并通过子组件的props属性,接收prop和label。如同elementui一样,如果prop为空,子附件将父组件的user通过作用域插槽传递到父组件,并在父组件进行处理

  1. <template>
  2. <div>
  3. <my-table :data="tableList" style="display: flex; flex-direction: row;">
  4. <my-table-column prop="name" label="姓名"></my-table-column>
  5. <my-table-column prop="sex" label="性别"></my-table-column>
  6. <my-table-column label="地址">
  7. <template v-slot="scope">
  8. <span style="background-color: deepskyblue">{{scope.row.address}}</span>
  9. </template>
  10. </my-table-column>
  11. </my-table>
  12. </div>
  13. </template>
  14. <script>
  15. import MyTable from "@/components/MyTable";
  16. import MyTableColumn from "@/components/MyTableColumn";
  17. export default {
  18. name: 'App',
  19. components:{
  20. MyTableColumn,
  21. MyTable
  22. },
  23. data(){
  24. return{
  25. tableList:[
  26. {
  27. name: 'java大师1',
  28. sex: '男',
  29. address: '西藏1'
  30. },
  31. {
  32. name: 'java大师2',
  33. sex: '男',
  34. address: '西藏2'
  35. },
  36. {
  37. name: 'java大师3',
  38. sex: '男',
  39. address: '西藏3'
  40. },
  41. {
  42. name: 'java大师4',
  43. sex: '男',
  44. address: '西藏4'
  45. }
  46. ]
  47. }
  48. }
  49. }
  50. </script>

展示结果如下:

image

原文链接:https://www.cnblogs.com/dalaba/p/17442682.html

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号