javascript - 在 vuejs 中将函数作为道具传递
问题描述
所以我正在创建一个带有可选行等的基本“TableComponent”。这个 TableComponent 需要一个名为“buttons”的道具。
TableComponent 期望按钮是一个对象数组,如下所示:
buttons: [{
label: 'Manage Themes',
click: () => {
if(this.selectedRows.length) {
this.$router.push({ name: 'ManagePageOptions', query: { concernable_type: this.type, concernable_ids: this.selectedRows.map(row => row.id).join(',') }});
} else {
alert('Please select 1 or more company or user');
}
}
}]
因此,在表格组件中,根据传递的内容创建了一行按钮,如下所示:
<b-button v-for="button in this.buttons" @click="button.click" :key="button.label"> {{ button.label }} </b-button>
问题是在按钮单击功能中,“this”指的是父组件,因此我无权访问选定的行等。
编辑: 我发现只需将“this”传递给 click 函数即可解决它。不知道这是否明智。
buttons = [{
label: 'Manage Pages',
click: (vm) => {
if(vm.selectedRows.length) {
vm.$router.push({ name: 'ManagePageOptions', query: { concernable_type: vm.type, concernable_ids: vm.selectedRows.map(row => row.id).join(',') }});
} else {
alert(Lang('Please select 1 or more company or user'))
}
}
}];
表组件数据:
data() {
return {
selectedRows: [],
m_this: this,
};
},
_
<b-button v-for="button in this.buttons" @click="button.click(m_this)" :key="button.label"> {{ button.label }} </b-button>
解决方案
我同意有更好的方法来做到这一点的评论,范围插槽可能是最好的......
但是,如果你真的想传递这样的函数,你需要:
将处理程序定义从
click: () => {}
to更改click: function() {}
- 原因是this
箭头函数的工作方式完全不同,因此this
绑定到父 Vue 组件将处理程序传递给按钮组件(在
TableComponent
模板内)时,将处理程序绑定到this
您的处理程序,TableComponent
如此处所述
推荐阅读
- postgresql - PostgreSQL 数据库中用于存储图像的 Uint8List 数据的数据类型
- tensorflow - 来自对象检测 API 的 create_coco_tf_record.py 未创建 tfrecord 文件
- php - PHP 使用 id 和 pdo 删除记录(初学者)
- neo4j - 为什么在 neo4j 中有这么多 db 命中?
- c++ - 当我使用一些较大的值时出现问题,我的函数输出错误
- javascript - asp.net mvc 隐藏用于过滤的列
- python - 类型错误:__init__() 得到了一个意外的关键字参数“reg_alpha”
- javascript - 以角度 10 提交表单后无法清除 ngx-mat-intl-tel-input
- c# - 隐藏表格并显示
- python-3.x - 为什么 sphinx-build(与 Python 3.8.6 一起安装)使用 Python 3.8.2?