其他分享
首页 > 其他分享> > vue 动态生成按钮,@click 绑定方法名称,handler.apply is not a function

vue 动态生成按钮,@click 绑定方法名称,handler.apply is not a function

作者:互联网

需求来源于一个管理系统的权限管控模块。
需求描述:进入页面,触发方法,从服务端获取当前用户在当前页面下的操作权限,生成对应的操作按钮。

正常情况,接到这种需求,都会想到使用子组件获取操作权限,v-for 遍历生成按钮,父组件调用,如下:

但是,这时候,点击按钮,会发现

vue.runtime.esm.js?2b0e:1888 TypeError: handler.apply is not a function
    at invokeWithErrorHandling (vue.runtime.esm.js?2b0e:1854)
    at VueComponent.invoker (vue.runtime.esm.js?2b0e:2179)
    at invokeWithErrorHandling (vue.runtime.esm.js?2b0e:1854)
    at VueComponent.Vue.$emit (vue.runtime.esm.js?2b0e:3882)
    at VueComponent.handleClick (element-ui.common.js?5c96:9417)
    at invokeWithErrorHandling (vue.runtime.esm.js?2b0e:1854)
    at HTMLButtonElement.invoker (vue.runtime.esm.js?2b0e:2179)
    at HTMLButtonElement.original._wrapper (vue.runtime.esm.js?2b0e:6911)

报错了!

原因呢?是因为,我们的操作按钮对应的方法名,是从后端获取的,它并不是一个真正意义的方法,而是一个字符串形式的方法名称。

也就是说,这一段代码

<el-button v-for="item in buttonlist" :key="item.id" @click="item.methodName">
    {{ item.name }}
</el-button>

在加载了 buttonlist 的数据之后,我们期望它是这样的:

<el-button type="success" @click="handleQuery">查询</el-button>
<el-button type="danger" @click="handleQuery">添加</el-button>

而实际上,它变成了类似这样(并不完全等同,只是强调 item.methodName 是一个字符串类型,而不是方法):

<el-button type="success" @click="'handleQuery'">查询</el-button>
<el-button type="danger" @click="'handleQuery'">添加</el-button>

这种情况该如何处理?子组件已知字符串形式的方法名,又是子组件调用父组件方法,首先想到的应该 this.$emit(methodName)

在这里插入图片描述

成功实现!

但是,刚开始也说了,这个需求中,操作按钮是有很多的,每个父组件都定义自己的方法也就算了(这是必须的,因为每个父组件中的功能逻辑都有差异),每个组件引用时还要:

<my-button @handleQuery="handleQuery" 
		   @handleAdd="handleAdd"
		   @handleEdit="handleEdit"
		   @handleDelete="handleDelete"
		   @handleExport="handleExport"
		   ......
/>

写十几二十个,看着也挺烦的。

于是,还有下面这种写法:

看上去就简洁了一丢丢~

效果……和上面一样,就不截图了

标签:function,vue,name,js,handler,组件,esm,2b0e
来源: https://blog.csdn.net/shaotaiban1097/article/details/119835917