我有一个名为EditUser.vue
的组件,该组件已使用vue路由器链接到路由器系统,这是该组件的路由定义
{
path: "/users/:id/edit",
name: "Edit User",
props: true,
component: () => import(/* webpackChunkName "edit-user" */ "@/views/EditUser.vue"),
beforeEnter: (to, from, next) => {
if (!store.getters.isLogged) next("/");
else next();
}
},
使用props启用时非常简单,因为它需要获取用户ID。
组件本身是这个
<template>
<main class="h-creen p-3">
<Input
type="text"
name="name"
label="name"
v-model="user.name"
required
/>
</main>
</template>
<script>
import { mapState } from "vuex";
import Input from "@/components/Input.vue";
export default {
name: "EditUserView",
props: {
id: {
required: true,
type: String,
}
},
components: {
Input,
},
data: () => ({
user: {},
}),
async beforeMount() {
// TODO move into router file
if (this.users.length <= 0) {
this.$router.push("/users");
}
this.user = this.users.find(user => user.id == this.id);
},
computed: mapState(["users"])
};
</script>
我已经省略了无用的部分,无论如何,这段代码都会复制问题。 <Input>
只是标签和具有某些样式的输入的包装,那里没有魔术。
问题是,如果我在输入中键入内容,我希望this.users
会被修改,但会在Vuex状态内修改相同的记录,但这会发生,我不知道为什么。换句话说,如果我使用输入来编辑名称,则此修改会在状态中传播,从而在其他视图中呈现,但由于它是本地数据,因此不应这样做。
我在这里想念什么?
这导致分配对现有对象的引用:
this.user = this.users.find(user => user.id == this.id);
[通过user.name
双向绑定更改v-model
属性时,将在users
中修改相应的嵌套对象。
应该将数据浅复制到本地(根据情况可能需要深复制):
this.user = {...this.users.find(user => user.id == this.id)};
然后在需要时将this.user
复制回this.users
。
或者该组件不应具有自己的user
,它可以包含单独的字段:
<Input
type="text"
name="name"
label="name"
v-model="name"
required
/>
name
等可以在需要时复制回this.users
。