首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么Vue不正确地呈现组件?

为什么Vue不正确地呈现组件?
EN

Stack Overflow用户
提问于 2021-02-25 22:43:39
回答 1查看 260关注 0票数 1

下面是一个错误的例子。

重现问题:添加3项并移除第二项。

里面的所有内容都被正确删除。从以下文本的呈现可以看出这一点。但是组件没有正确显示。为什么?这是个虫子吗?

我尝试使用附加属性进行条件呈现,试图覆盖对元素数组和数组内部的引用--没有结果。

代码语言:javascript
复制
Vue.component('selected-material', {
  props: [
    'value'
  ],
  template: `
    <div>
      <v-autocomplete
        v-model="local"
        :items="materials"
        item-text="name"
        return-object
        autocomplete="new-password"
        @change="input"
      />
    </div>
  `,
  data() {
    return {
      local: this.value,
      materials: [{
          id: 1,
          name: 'mat-1',
          q: 1
        },
        {
          id: 2,
          name: 'mat-2',
          q: 1
        },
      ],
    };
  },
  methods: {
    input() {
      this.$emit('input', this.local);
    },
  },
})

Vue.component('add-board', {
  props: [
    'value'
  ],
  template: `
    <div>
      <v-container fluid class="my-0 py-0">
        <v-row class="my-0 py-0">
          <v-col class="my-0 py-0">
            <selected-material
              v-model="local.material"
            />
          </v-col>
          <v-col class="my-0 py-0">
            <v-text-field
              class="my-0 py-0"
              v-model="local.material.q"
            />
          </v-col>
          <v-col class="my-0 py-0">
            <v-row class="my-0 py-0">
              <v-col class="my-0 py-0">
                <v-btn
                  class="my-0 py-0"
                  color="success"
                  icon
                  @click="append"
                >
                  <v-icon>mdi-plus</v-icon>
                </v-btn>
              </v-col>
              <v-col class="my-0 py-0">
                <v-btn
                  class="my-0 py-0"
                  color="error"
                  icon
                  @click="remove"
                >
                  <v-icon>mdi-minus</v-icon>
                </v-btn>
              </v-col>
            </v-row>
          </v-col>
        </v-row>
      </v-container>
    </div>
  `,
  data() {
    return {
      local: this.value,
    };
  },
  methods: {
    input() {
      this.$emit('input', this.local);
    },
    append() {
      this.$emit('append');
    },
    remove() {
      this.$emit('remove', this.local.id);
    },
  },
})

new Vue({
  el: '#app',
  vuetify: new Vuetify(),
  data() {
    return {
      boards: [],
    };
  },
  mounted() {
    this.append();
  },
  methods: {
    append() {
      this.boards.push({
        id: Date.now(),
        material: {
          id: 1,
          name: 'mat-1',
          q: 1
        },
      });
    },
    remove(id) {
      if (this.boards.length !== 1) {
        const index = this.boards.findIndex(board => board.id === id);

        this.boards.splice(index, 1);
      }
    },
  },
})
代码语言:javascript
复制
<link href="https://fonts.googleapis.com/css?family=Roboto:100,300,400,500,700,900" rel="stylesheet">
<link href="https://cdn.jsdelivr.net/npm/@mdi/font@4.x/css/materialdesignicons.min.css" rel="stylesheet">
<link href="https://cdn.jsdelivr.net/npm/@mdi/font@5.x/css/materialdesignicons.min.css" rel="stylesheet">
<link href="https://fonts.googleapis.com/css?family=Material+Icons" rel="stylesheet">
<link href="https://cdn.jsdelivr.net/npm/vuetify@2.x/dist/vuetify.min.css" rel="stylesheet">
<script src="https://cdn.jsdelivr.net/npm/vue@2.x/dist/vue.js"></script>
<script src="https://cdn.jsdelivr.net/npm/vuetify@2.x/dist/vuetify.js"></script>

<div id="app">
  <v-app>
    <v-main>
      <v-row v-for="(board, index) in boards" :key="index">
        <v-col>
          <add-board :key="index" v-model="boards[index]" @append="append" @remove="remove" />
        </v-col>
      </v-row>

      <v-row v-for="(board, index) in boards" :key="`_${index}`">
        <v-col>
          {{ board.id }} | {{ board.material.q }}
        </v-col>
      </v-row>
    </v-main>
  </v-app>
</div>

UPD

在被ID替换后:

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-02-25 22:56:04

在从v-for列表中删除项时,如果不希望重用DOM,则必须使用对每个项都是唯一的key。如果使用index并删除一个项,则下一个项将接受其索引,因此Vue重用已删除项的DOM。

使用id作为键,因为这似乎是唯一的:

代码语言:javascript
复制
<v-row v-for="(board, index) in boards" :key="board.id">

此外,检查v-model上的<v-text-field>,似乎您可能打算让它使用local.material.q而不是local.q

代码语言:javascript
复制
<v-text-field
  class="my-0 py-0"
  v-model="local.material.q"
/>
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66377597

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档