将项目数据传输到编辑 window 多个项目

Transfer item data to editing window for multiple items

我有循环使用的元素列表,它包含文本。

<div v-for="item in items" :key="item.id">
    <p>{{ item.description }}</p>
    <button @click="edit=true">Edit</button>
    <textarea v-if="edit" v-model=editItem />
</div>

如何在每次单击编辑时将项目描述转移到文本区域?

我可以这样做:

function somefunction(item) {
    edit.value = true
    editItem.value = item.description
}

但问题是,它一次只能编辑一个项目,我希望能够启用多个编辑 windows。有人可以给我建议怎么做吗?

要在 v-for 中编辑多行,这是我在所有 view/model 框架中使用的方法:

  • 创建一个数组,将所有 ids/indexes 行推送到其中进行编辑。
  • 对于每个项目的 v-model,您可以使用反应对象,在其中使用 ids/indexes 作为键设置值。

演示:https://jsfiddle.net/The_Bear/0hvtxb3r/47/

模板

<div v-for="item in items" :key="item.id">
    <p>{{ item.description }}</p>
    <button @click="setEdit(item.id)">Edit</button>
    <textarea 
        v-if="isEdit(item.id)" 
        :value="editItem[item.id]" 
        @input="updateEditItem(item.id, $event.target.value)"
    />
</div>

JS

{
  //...
  data: {
    editableRows: [],
    editItem: {},
    items: [
      { id: 1, text: "Learn JavaScript" },
      //...
    ]
  },
  methods: {
    isEdit(id) {
        return this.editableRows.indexOf(id) >= 0;
    },
    setEdit(item){
        this.editableRows.push(item.id);
        this.updateEditItem(item.id, item.text);
    },
    updateEditItem(key, value) {
        this.editItem= {
            ...this.editItem,
            [key]: value
        };
    }
  }
}