【发布时间】:2021-11-13 15:17:01
【问题描述】:
我正在使用 Vue 3 作为学习项目制作一个动态表格,用户可以在其中添加或删除表格中的行,等等。我使用table-row 组件来创建行,并使用table-data 组件在该行中创建数据单元格。添加一行是通过以下代码完成的:
const app = Vue.createApp({
data() {
return {
tableRows: [],
}
},
methods: {
addRow() {
this.tableRows.push(-1);
},
},
})
我需要做的是将数组TableRows和index传递给table-row组件,以便执行行删除操作,如下代码所示:
app.component('table-row', {
props: {
tableRows: Array,
index: Number,
},
methods: {
deleteRow(index) {
this.tableRows.splice(index, 1);
}
},
template: `
<tr>
<table-data></table-data>
<table-data></table-data>
<table-data></table-data>
<table-data></table-data>
<button @click="deleteRow">Delete Row</button>
</tr>
`
})
问题在于TableRows 和index 的值都是未定义的(如 Vue DevTools 中所示),这意味着 props 没有从父组件传递到子组件。我认为这就是每当我单击“删除行”按钮时弹出此错误的原因:
Uncaught TypeError: Cannot read properties of undefined (reading 'splice')
这是来自 Vue DevTools 的屏幕截图。可以看到 props 变量有未定义的值:
我不确定为什么会发生这种情况,或者我能做些什么来解决这个问题。非常感谢任何帮助。
【问题讨论】:
-
对此不是 100%,但我认为您必须使用父级的
v-on绑定传递道具才能在子级中使用它们。您可以尝试将模板 html 添加到父级而不是子级,并在那里使用v-on绑定道具。 -
@Chaos_Is_Harmony 据我了解组件和道具,情况不一定如此。 Vue 指南页面上的示例直接传递了道具……我猜?我不确定他们的方法叫什么。至于将模板移动到父级中,我想这是一个想法。我会尝试一下,看看我能用它做什么,但它不会解决我现在面临的问题。
-
@Chaos_Is_Harmony,你是对的。我必须将变量绑定到 HTML 本身中的组件。像
<table-row :tableRow="tableRow" :index="index"></table-row>这样的东西。然而,tableRow仍然是未定义的,即使index变量被传递到组件。我怀疑数据不匹配,但我不确定。 -
编辑上一条评论:这不是类型不匹配。似乎
tableRows是一个属性(如果我相信 Vue DevTools),而不是一个道具。我现在必须提出一个新问题吗?-? ? -
我发布了一个更详细的答案,希望对您有所帮助。
标签: vue.js vue-component vuejs3