vue.js - [Vue 警告]:“更新用户”的事件处理程序出错:“TypeError:无法设置未定义的属性‘名称’”
问题描述
我有 2 个 vue 组件,一个是用户列表,另一个是用户的详细信息。
我想要做的是,如果我必须更新用户的详细信息,那么我希望它自动更新。我遇到的问题是我收到了这个错误
[Vue warn]: Error in event handler for "update-user": "TypeError: Cannot set property 'name' of undefined"
这是我的用户详细信息组件的代码
<template>
<div class="card">
<div class="card-header">
<span class="text-success" @click="updateUser">Save Changes</span>
</div>
<div class="card-body p-0">
<div class="card card-primary card-outline card-outline-tabs">
<div class="card-body">
<div class="form-group">
<label for="name">Full Name</label>
<input type="text" class="form-control" id="name" v-model="name">
</div>
</div>
</div>
</div>
</div>
</template>
<script>
export default {
props: ['emit', 'user'],
data() {
return {
name: null,
}
},
mounted() {
},
methods: {
updateUser() {
axios.put('/admin/users/'+this.user.id, this.name).then(response => {
this.emit.$emit('update-user', {
user: this.name
});
});
}
}
}
</script>
和我的带有用户列表的 vue 组件
<template>
<div class="card">
<div class="card-body>
<table class="table table-sm table-striped">
<thead>
<tr>
<th>Name</th>
</tr>
</thead>
<tbody>
<tr v-for="user in showUsers">
<td>{{user.name}}</td>
<td style="text-align: right;"><button class="btn btn-sm btn-outline-info" @click="detail(user)">Manage</button></td>
</tr>
</tbody>
</table>
</div>
</div>
</template>
<script>
export default {
props: ['emit', 'users'],
data() {
return {
perPage: 10,
currentPage: 1,
}
},
computed: {
filterUsers() {
return (this.userFilter === '') ? this.users : this.users.filter(u => { return u.name.toLowerCase().indexOf(this.userFilter.toLowerCase()) > -1; });
},
showUsers() {
let start = (this.currentPage - 1) * this.perPage;
let end = start + this.perPage;
return this.filterUsers.slice(start, end);
}
},
methods: {
detail(user) {
this.emit.$emit('manage-user', { user: user });
}
},
mounted(){
this.emit.$on('update-user', payload => {
this.user.name = payload.user.name;
});
}
}
</script>
解决方案
您遇到的错误是由this.user
不存在于里面的上下文中引起的mounted() { this.emit.$on('update-user', ....}
。
据我了解,您想更新特定用户的名称,但在这种情况下,您只有所有用户(this.users
)在里面mounted()
,您必须过滤掉该特定用户然后应用更新。
以下是一种解决方案:
如果user.id
是唯一的,您可以发出user.id
和user.name
来自updateUser
,然后在 中mounted
,通过 找到特定用户user.id
,然后对其进行更新。
updateUser() {
axios.put('/admin/users/'+this.user.id, this.name).then(response => {
this.emit.$emit('update-user', {
name: this.name, // new user.name
id: this.user.id // assuming user.id is unique
});
});
}
this.emit.$on('update-user', payload => {
this.users.find(user => user.id===payload.id).name = payload.name; // find the user then update its name
});
推荐阅读
- ruby - 我可以以这种方式迭代哈希的最佳方式是什么?
- c++ - 警告:“%s”指令将最多 2047 个字节写入大小为 56 的区域 [-Wformat-overflow=]
- ios - 在 iOS 上使用 AppAuth 库刷新身份验证令牌
- visual-studio - VS Code 上的错误,但 Dartpad 上没有。- 字段 'percent' 应该被初始化,因为它的类型 'double' 不允许为空
- linux - 使用 find 和 mv 清理文件名
- eclipse - JVM 执行失败 Mac OS 11.0.1
- javascript - 记录,但我需要它来提醒
- javascript - 提交单选按钮选项时无法为用户创建警报消息 - Javascript/HTML
- python - 如何更改正在计时的功能?
- javascript - TypeError:无法读取未定义的属性“名称”(在创建反应应用程序中:App.js)