当前位置:   article > 正文

封装表格组件,最后一列动态生成 vue3子组件通过slot传值向父组件

封装表格组件,最后一列动态生成 vue3子组件通过slot传值向父组件

将表格二次封装,方便以后开发中的复用。每次只需调用表格组件后,在父组件中往子组件标签上写入dataSource(表格数据)和columns(表格列标题)即可。

此案例中最后一列是删除按钮,动态生成,在父组件中定义columns时用

slots: { customRender: "operation" } 来动态渲染。

子组件的template标签中通过slot插槽来传值(每一行的值),在父组件中通过v-slot="slotProps"接收子组件传过来的值。

示例代码如下:

子组件MngTable.vue

  1. <template>
  2. <a-table :dataSource="dataSource" :columns="columns">
  3. <template #operation="{ record }">
  4. <slot :record="record"></slot>
  5. </template>
  6. </a-table>
  7. </template>
  8. <script lang="ts">
  9. import { defineComponent } from "vue";
  10. export default defineComponent({
  11. name: "MngTable",
  12. props: {
  13. dataSource: [],
  14. columns: [],
  15. },
  16. components: {},
  17. setup() {
  18. return {};
  19. },
  20. });
  21. </script>
  22. <style lang="scss" scoped></style>

父组件Parent.vue

  1. <template>
  2. <div class="section pitch_default p_default">
  3. <MngTable :dataSource="dataSource" :columns="columns">
  4. <template v-slot="slotProps">
  5. <a-button type="primary">删除</a-button>
  6. </template>
  7. </MngTable>
  8. </div>
  9. </template>
  10. <script lang="ts">
  11. import { defineComponent } from "vue";
  12. import { ManageTable } from "@/components";
  13. export default defineComponent({
  14. name: "Parent",
  15. components: {
  16. ManageTable,
  17. },
  18. setup() {
  19. const pagination = {
  20. total: 200,
  21. current: 1,
  22. pageSize: 10,
  23. };
  24. const columns = [
  25. {
  26. title: "name",
  27. dataIndex: "name",
  28. key: "name",
  29. },
  30. {
  31. title: "age",
  32. dataIndex: "age",
  33. key: "age",
  34. },
  35. {
  36. title: "operation",
  37. key: "operation",
  38. slots: { customRender: "operation" },
  39. },
  40. ];
  41. const dataSource = [
  42. {
  43. name: '胡彦斌',
  44. age: 32,
  45. },
  46. {
  47. name: '胡彦祖',
  48. age: 42,
  49. },
  50. ],
  51. return {
  52. dataSource,
  53. columns,
  54. pagination,
  55. };
  56. },
  57. });
  58. </script>
  59. <style lang="scss" scoped></style>

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/IT小白/article/detail/355564
推荐阅读
相关标签
  

闽ICP备14008679号