场景
在使用一些框架如element-ui时,经常会使用一些组件的默认事件,这些默认事件通常会有一些默认参数以便于使用。
例如:
远程搜索功能的自动补全输入框
<el-autocomplete></el-autocomplete>
它经常会被这样使用:
<el-autocomplete
v-model="modalData[index].unit"
:fetch-suggestions="querySearch"
placeholder="请选择"
ref="input1"
:highlight-first-item="true"
@select="handleSelect"
>
<i class="el-icon-arrow-down el-input__icon" slot="suffix"></i>
<template slot-scope="{ item }">
<div class="name">{{ item.name }}</div>
</template>
</el-autocomplete>
其中的handleselect函数有默认回调参数“选中建议项”,而querySearch函数有两个默认回调(queryString,cb)
正常使用时html中可不传入这两个参数,js中直接使用。即:
@select="handleSelect"
handleSelect(item) {
console.log(item)
}
而有时,el-autocomplete是通过如v-for等方式渲染出来的、有多个并列输入框时,我们就想知道,所查询的或点击的是哪一个,也即传入自定义参数index。
在这种情况下,像下面这么写肯定是不行的:
@select="handleSelect(index)"
@select="handleSelect(index,item)"
因为这样index和item都会被当成自定义参数,从而在函数中无法使用默认的回调参数。
解决办法:
方法一:
@select="handleSelect(index,$event)"
<script>
handleSelect(index, item) {
console.log(index)
console.log(item);
}
</script>
此处的index为自定义参数,item为原默认回调参数,可正常使用。
但是,如果默认回调参数(也即fetch-suggestions)有两个咋办呢?请看方法二。
方法二:
使用闭包:
:fetch-suggestions="((queryString,cb)=>{queryUnit(queryString,cb,index)})"
<script>
queryUnit(queryString, cb, index) {}
</script>
此时,两个默认回调(queryString,cb)就可以正常使用了,自定义传参的数量也没有限制了~