插槽使用

一个vben中使用的例子
image.png

  • BasicForm 是模板
  • 是插件
  • 下边的schema配置slot:’f3’会在模板上生成一个插槽

image.png
由于数据是组件内部提供的,所以组件外部使用则受作用于插槽的限制。
处理方案是用一个插槽props
也就是#f3=”{model}”,这样组件外部就可以拿到内部数据了

作用域插槽

image.png
组件定义时的span标签的slot内可以访问组件使用时传递的props,
但组件使用时插件是不能使用传递给组件内部的props的,尽管插件看起来像是渲染在组件内部。

下边的组件使用时写的插件click here…也是无法使用组件传递给内部的url属性的,只有组件内部才可以使用props访问这个props,如果一定要用可以使用插槽props再传递上去
image.pngimage.png

完整h5列表加载demo

props传递的是api请求接口方法,数据是到组件内部才获取到的
如果在外部使用组件内部的数据则可以使用

  1. <PageLoadList>
  2. <template #item="{model}">
  3. // 这个model就是组件内部的列表数据it
  4. <view>hello</view>
  5. </template>
  6. </PageLoadList>
  1. <template>
  2. <view class="content_box">
  3. <scroll-view
  4. style="height: calc(100vh - 80rpx)"
  5. scroll-y="true"
  6. enable-back-to-top
  7. @scrolltolower="loadMore"
  8. >
  9. <view v-for="(it, idx) in dataList" :key="idx">
  10. <slot name="item" :model="it"></slot>
  11. </view>
  12. <u-empty :show="isEmpty" style="height: 90vh" text="暂无数据" mode="list"></u-empty>
  13. <u-loadmore
  14. v-if="dataList.length"
  15. height="80rpx"
  16. :status="loadStatus"
  17. icon-type="flower"
  18. color="#ccc"
  19. />
  20. </scroll-view>
  21. </view>
  22. </template>
  23. <script>
  24. /**
  25. * 分页加载列表
  26. * @property {String} reqApi - 请求接口方法
  27. * @property {String} reqParams - 请求接口带的参数
  28. */
  29. export default {
  30. props: {
  31. // 请求接口的方法
  32. reqApi: {
  33. type: Function,
  34. default: () => {},
  35. },
  36. // 请求接口带的参数
  37. reqParams: {
  38. type: Object,
  39. default: () => {},
  40. },
  41. },
  42. data() {
  43. return {
  44. // loadmore-加载前的状态,loading-加载中的状态,nomore-没有更多的状态
  45. loadStatus: 'loadmore',
  46. // 当前页
  47. currentPage: 0,
  48. // 最后一页
  49. lastPage: 0,
  50. // 列表数据
  51. dataList: [],
  52. };
  53. },
  54. computed: {
  55. isEmpty: function () {
  56. return this.dataList.length === 0;
  57. },
  58. },
  59. watch: {
  60. reqParams() {
  61. this.currentPage = 0;
  62. this.dataList = [];
  63. this.getOrderList();
  64. },
  65. reqApi() {
  66. this.currentPage = 0;
  67. this.dataList = [];
  68. this.getOrderList();
  69. },
  70. },
  71. methods: {
  72. loadMore() {
  73. if (this.currentPage < this.lastPage) {
  74. this.currentPage += 1;
  75. this.getOrderList();
  76. }
  77. },
  78. async getOrderList() {
  79. this.loadStatus = 'loading';
  80. const res = await this.reqApi({
  81. ...this.reqParams,
  82. pageNum: this.currentPage,
  83. });
  84. if (res.rescode === 200) {
  85. const { dataList, totalCount, pageSize } = res.data;
  86. this.dataList = this.dataList.concat(dataList);
  87. this.lastPage = Math.ceil(totalCount / pageSize);
  88. this.$nextTick(() => {
  89. this.loadStatus = this.dataList.length < totalCount ? 'loadmore' : 'nomore';
  90. });
  91. }
  92. },
  93. },
  94. };
  95. </script>
  96. <style lang="scss"></style>