本地组件数据不应更改Vuex状态

问题描述 投票:1回答:1

我有一个名为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状态内修改相同的记录,但这会发生,我不知道为什么。换句话说,如果我使用输入来编辑名称,则此修改会在状态中传播,从而在其他视图中呈现,但由于它是本地数据,因此不应这样做。

我在这里想念什么?

javascript vue.js vuex vue-router
1个回答
1
投票

这导致分配对现有对象的引用:

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

© www.soinside.com 2019 - 2024. All rights reserved.