当前位置:   article > 正文

vue3中,如何主动触发 element-plus 组件 el-autocomplete 的 fetch-suggestions 方法,达到刷新筛选结果效果?

fetch-suggestions

不知道如何 主动触发 fetch-suggestions 方法? 那往下看就对了!

vue3, 在使用 element-plus 的远程搜索,筛选结果的组件 el-autocomplete 时候,因为要用到搜索范围,所以使用了 前置的插槽 放置下拉选择组件 el-select。

使用 autocomplete 组件

范围有:标题、内容、所有。当每次切换范围的时候,需要重新请求后台并将结果,并重新显示出来,即重新触发一下组件的 fetch-suggestions绑定的方法。

但是这个方法的参数有个cb回调函数,js无法直接调用 fetch,

fetch-suggestions

那我们就看看这个 fetch 到底 做了些什么。查看源码:

autocomplete2.js

根据以上源码可知,fetch-suggestions 调用方法是为了将想要回显的数据,传递到 fetch 的第二个参数回调函数里,然后 suggestions.value = suggestionsArg;

也就是说fetch 方法的目的是赋值 suggestions ,就是你实际需要设置的回显的数据。再看它导出的属性里有这个属性。

那么问题应该就解决了,通过 ref 获取这个组件实例然后设置 suggestions 值。值得注意的是这里的 focus 方法,需要在设置 suggestions 之前调用,否则 无法正常回显数据。

组件的 expose

总结: 如何主动触发 el-autocomplete组件的 fetch-suggestions 方法,达到刷新筛选结果效果?

不需要触发方法, 1、获取 ref 组件实例,2、设置focus,3、设置 suggestions。

最终代码如下,需要的朋友可以参考下:

  1. <template>
  2. <el-autocomplete
  3. class="inputSearch"
  4. v-model="searchInput"
  5. size="default"
  6. ref="myAutocomplete"
  7. :fetch-suggestions="searchChange"
  8. :trigger-on-focus="true"
  9. placeholder="Search article"
  10. @select="handleSelect"
  11. @keyup.enter="submitSearch"
  12. maxlength="30"
  13. clearable
  14. >
  15. <template #prepend>
  16. <el-select size="default" v-model="searchOption" style="width: 7rem">
  17. <el-option class="my-select" v-for="item in searchOptionList" :label="item.name" :value="item.value" />
  18. </el-select>
  19. </template>
  20. <template #append>
  21. <el-button :icon="Search" @click="submitSearch" />
  22. </template>
  23. <template #default="{ item }">
  24. <div class="overHiden2 search_item">
  25. <span class="search_item_title" :title="item.value" v-html="filterTitle(item.value)"></span>
  26. <el-button class="search_item_delete" type="text" title="查看">{{ item.created }}</el-button>
  27. </div>
  28. </template>
  29. </el-autocomplete>
  30. </template>
  31. <script lang="ts" setup>
  32. import { ref, watch } from "vue";
  33. // 搜索内容
  34. let searchInput = ref("");
  35. // 绑定el-autocomplete组件
  36. const myAutocomplete = ref(null);
  37. // 搜索选择范围
  38. let searchOption = ref("title");
  39. let searchOptionList = ref([
  40. { name: '标题', value: 'title' },
  41. { name: '内容', value: 'content' },
  42. { name: '全部', value: 'all' },
  43. ]);
  44. // links 这里是声明,从后台获取的数据赋值给它
  45. const links = ref<LinkItem[]>([]);
  46. // fetch-suggestions
  47. const searchChange = (str: string, cb: (arg: any) => void) => {
  48. if (!searchInput.value.trim()) { // 如果为空,则直接返回空
  49. cb([]);
  50. return
  51. }
  52. // 这里执行 自定义过滤
  53. let results = str ? links.value.filter(createFilter(str)) : links.value; // createFilter自己写规则
  54. cb(results);
  55. }
  56. // 监听搜索‘范围’数据变化,并重新回显筛选结果 【重点看这里!!!】
  57. watch(() => searchOption.value, () => {
  58. // 重置原始数据
  59. links.value = [];
  60. // 如果为空,则不操作
  61. let str = searchInput.value.trim();
  62. if (!str) {
  63. return;
  64. }
  65. // 后台获取数据 赋值给 links.value
  66. searchPostList();
  67. // 获取此组件实例
  68. let complete = (myAutocomplete.value as any);
  69. // 同样的自定义过滤
  70. let results = str ? links.value.filter(createFilter(str)) : links.value;
  71. // 实例重新聚焦,
  72. complete.focus();
  73. // 筛选结果 赋值 suggestions,达到触发页面筛选数据变化的目的
  74. complete.suggestions = results;
  75. })
  76. // 给每个结果中匹配字符高亮,v-html="filterTitle(item.value)" 后续篇章里详细讲解一下
  77. const filterTitle = (originStr: string) => {
  78. if (!searchInput.value) {
  79. return originStr;
  80. }
  81. // 将匹配的字符添加一个‘高亮’的标签外表
  82. let str = searchInput.value;
  83. const regEscape = (v: any) => v.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, '\\$&');
  84. return originStr.replace(new RegExp(regEscape(str), "ig"), '<span style="color: #2cc0da">$&</span>');
  85. }
  86. </script>
  87. <style lang="scss" scoped>
  88. //
  89. </style>

另外,在vue2中我看到有博主已经给出了方案,可以参考yujiuchun的文章:element ui远程搜索主动触发fetch-suggestions - 简书icon-default.png?t=M5H6https://www.jianshu.com/p/3f0c813d28ac 。

以上。

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

闽ICP备14008679号