当前位置:   article > 正文

二次封装element plus (el-select-v2远程搜索组件)

el-select-v2

根据项目需求,需要给每个对应的搜索字段进行 远程搜索

项目中有跟多地方都需要使用,所以进行二次封装会很方便.

创建一个ElSelectV2文件夹==> index.vue

  1. <template>
  2. <div>
  3. <el-select-v2
  4. v-model="valueName"
  5. filterable
  6. remote
  7. :remote-method="remoteMethod"
  8. :options="options"
  9. :loading="loading"
  10. placeholder="请输入"
  11. />
  12. </div>
  13. </template>
  14. <script setup name="ElSelectV2">
  15. import {reactive, toRefs, watch} from "vue";
  16. const emit = defineEmits();
  17. const valueName = ref(''); // 选中的值
  18. const states = ref([]); // 接收数据
  19. const options = ref([]); // 遍历出来的选项
  20. const loading = ref(false); // 是否加载中
  21. const props = defineProps({
  22. modelValue: [String, Object, Array],
  23. isShowTip: {
  24. type: String,
  25. default: true,
  26. },
  27. });
  28. // 监听 valueName不能写成valueName.value
  29. watch(valueName, (val) => {
  30. remoteMethod(val);
  31. });
  32. function remoteMethod(query) {
  33. // 判断props.modelValue和props.isShowTip是否存在
  34. if (!props.modelValue || !props.isShowTip) {
  35. return
  36. }
  37. const list = props.modelValue.map((item) => {
  38. return { value: `${item[props.isShowTip]}`, label: `${item[props.isShowTip]}` }
  39. })
  40. if (query !== '') {
  41. loading.value = true
  42. setTimeout(() => {
  43. loading.value = false
  44. options.value = list.filter((item) => {
  45. return item.label.toLowerCase().includes(query.toLowerCase())
  46. })
  47. // 去重
  48. options.value = Array.from(new Set(options.value.map(item => item.label))).map(label => {
  49. return options.value.find(item => item.label === label)
  50. })
  51. }, 200)
  52. emit("update:nameValue",valueName.value);
  53. } else {
  54. options.value = []
  55. }
  56. }
  57. </script>

在父组件中使用:

  1. // 这里的 dataList 就是我们请求过来的表格数据
  2. <el-form :model="queryParams" ref="queryRef" :inline="true" v-show="showSearch">
  3.     <el-form-item label="责任单位" prop="sibleUnit">
  4.         <ElSelectV2 :isShowTip=" 'sibleUnit' " v-model="dataList" v-model:nameValue="queryParams.sibleUnit"></ElSelectV2>
  5.     </el-form-item>
  6. <el-form-item label="证照类型代码" prop="typeCode">
  7. <ElSelectV2 :isShowTip=" 'typeCode' " v-model="dataList" v-model:nameValue="queryParams.typeCode"></ElSelectV2>
  8. </el-form-item>
  9. </el-form>
  10. <script setup>
  11.     import ElSelectV2 from "../../components/ElSelectV2/index.vue";
  12.    
  13.     const data = reactive({
  14.     queryParams: {
  15.     pageNo: 1,
  16.     pageSize: 10,
  17.     sibleUnit: undefined,
  18.     typeCode: undefined
  19.     }
  20.     });
  21.     const {queryParams} = toRefs(data);
  22. </script>

点击重置按钮,刷新子组件来实现清空内容的效果

这里我们就可以通过刷新子组件的方法来实现清空

  1. // 通key给子组件绑定一个timer变量,类型为number
  2. <ElSelectV2 :key="timer" :isShowTip=" 'sibleUnit' " v-model:nameValue="queryParams.sibleUnit"></ElSelectV2>
  3. <script setup name="certificationType">
  4.     const timer = ref(0);
  5.     /** 重置按钮操作 */
  6.     function resetQuery() {
  7.         // 把当前的时间戳赋值给timer,这样绑定子组件的key就会变化,从而达到刷新的目的
  8.     timer.value = new Date().getTime();
  9.     proxy.resetForm("queryRef");
  10.     handleQuery();
  11.     }
  12. </script>

报错:

Unable to preventDefault inside passive event listener invocation.

这个错误是 谷歌浏览器监听touch类事件报错: 无法被动侦听事件preventDefault,是新版本Chrome浏览器报错.

解决:

  1. 1. 处理函数时,用如下方式,明确声明为不是被动的
  2. window.addEventListener('touchmove',func,{passive:false})
  3. 2. 应用css属性 touch-action: none; 这样任何触摸事件都不会产生默认行为,但是touch事件照样触发.
  4.     touch-action 还有很多选项
  5. 如果以上两个方法不生效,就用下面的
  6. /*
  7. 查看你的项目中是否安装了 default-passive-events 依赖,安装了就卸载,然后在main.js中注释掉,
  8. 它默认情况下启用某些事件的被动侦听器,基本上每次声明新的事件监听器时,都会自动设置{passive:true}
  9. */
  10. import 'default-passive-events'

default-passive-events 插件是用来解决谷歌浏览器消除 Passive Event Listeners(被动事件警告)的方法.

但是安装 default-passive-events 是为了解决 Chrome 51 以后的版本警告,进退两难.

我这里没有卸载 default-passive-events 依赖,只是在 main.js 中把它给注释了.

本文内容由网友自发贡献,转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号