Bootstrap-Vue Modal:如何在 V-For 渲染列表中打开不同的模态?
Bootstrap-Vue Modal: How to open different modals in an V-For rendered list?
我正在使用 Bootstrap-Vue Modals 打开一个“编辑”模式,当点击附加到我在 v-for 渲染列表的列表中渲染的每个项目的“编辑”按钮时。
但是,每次当我单击编辑按钮时,它都会打开所有模态框,它们彼此堆叠在一起,列表中的最后一个元素是顶部模态框。
如何指定只打开点击编辑的项目modal/information?
//Parent Component
<div class="dataList">
<div v-bind:key="item.id" v-for="item in this.$store.getters.data">
<Child v-bind:item="item"></Child>
</div>
</div>
//Child Component
<div>
{{this.item.name}}
{{this.item.details}}
{{this.item.completedBy}}
{{this.item.status}}
<button v-b-modal.modal-1>Edit</button>
<button v-on:click="deleteItem">Delete</button>
<div>
<b-modal id="modal-1" title="BootstrapVue">
<form @submit="editItem">
<input v-model="name">
<input v-model="details">
<input v-model="completedBy">
<select v-model="status">
<option>Fail</option>
<option>Warn</option>
<option>Pass</option>
</select><br>
<input type="submit" value="Submit" @click="$bvModal.hide('modal-1')">
</form>
</b-modal>
</div>
</div>
现在每个模态显示正确的信息(如专有名称、详细信息、状态等),但我只需要特定模态。
我想它与 'v-b-modal.modal-1' 有关,但我不确定如何动态设置每个模态的 id...有没有办法轻松设置每个模态 id 以匹配item.id?
这是 Bootstrap-Vue Modals 的文档,但我找不到我需要的东西。
最快但可能不是最好的方法之一是条件渲染模态。
您可以在单击“编辑”时切换活动模式 number/index,方法是将 prop/data/var 设置为 activeModal:1 或 n。
然后在迭代模态的部分,您可以对模态使用 v-if 指令,例如:<v-modal v-if="activeModal">
这是 ignore/not 渲染其他模态的一种方式,但需要重新渲染每次点击“编辑”。
Best/Final 解决方案是将内容 vue-portal 到一个通用模式。
我建议将 <b-modal>
移出您的 v-for
。
这样你就只有一个了。
然后您将要编辑的 user/item 设置为一个变量,并在您的模式中使用它来显示所选用户的数据。
例子
new Vue({
el: "#app",
data() {
return {
selectedUser: null,
items: [{
name: "Name 1",
status: "Fail",
details: "Details 1"
},
{
name: "Name 2",
status: "Warn",
details: "Details 2"
}
]
}
},
methods: {
editUser(user) {
this.selectedUser = user;
this.$bvModal.show("edit-modal");
}
}
})
<link type="text/css" rel="stylesheet" href="//unpkg.com/bootstrap@4.5.3/dist/css/bootstrap.min.css" />
<link href="https://unpkg.com/bootstrap-vue@2.21.2/dist/bootstrap-vue.css" rel="stylesheet" />
<script src="//unpkg.com/vue@2.6.12/dist/vue.min.js"></script>
<script src="//unpkg.com/bootstrap-vue@2.21.2/dist/bootstrap-vue.min.js"></script>
<div id="app" class="p-4">
<div v-for="item in items" class="mt-3">
{{item.name}} {{item.details}} {{item.status}}
<b-btn variant="primary" @click="editUser(item)">Edit</b-btn>
<b-btn variant="danger">Delete</b-btn>
</div>
<b-modal id="edit-modal" title="Edit User">
<form v-if="selectedUser">
<input v-model="selectedUser.name">
<input v-model="selectedUser.details">
<input v-model="selectedUser.completedBy">
<select v-model="selectedUser.status">
<option>Fail</option>
<option>Warn</option>
<option>Pass</option>
</select><br>
<input type="submit" value="Submit">
</form>
</b-modal>
</div>
如果您想将模态框保留在 v-for
中,则必须给它一个唯一的 id
。如果你的项目有一个我会推荐使用那个,否则你可以使用 v-for 中的 index
。
简化示例
<div v-for="item in items">
<button v-b-modal:[`edit-modal-${item.id}`]>Edit Item</button>
<b-modal :id="`edit-modal-${item.id}`">
<!-- Modal Content-->
</b-modal>
</div>
我正在使用 Bootstrap-Vue Modals 打开一个“编辑”模式,当点击附加到我在 v-for 渲染列表的列表中渲染的每个项目的“编辑”按钮时。
但是,每次当我单击编辑按钮时,它都会打开所有模态框,它们彼此堆叠在一起,列表中的最后一个元素是顶部模态框。
如何指定只打开点击编辑的项目modal/information?
//Parent Component
<div class="dataList">
<div v-bind:key="item.id" v-for="item in this.$store.getters.data">
<Child v-bind:item="item"></Child>
</div>
</div>
//Child Component
<div>
{{this.item.name}}
{{this.item.details}}
{{this.item.completedBy}}
{{this.item.status}}
<button v-b-modal.modal-1>Edit</button>
<button v-on:click="deleteItem">Delete</button>
<div>
<b-modal id="modal-1" title="BootstrapVue">
<form @submit="editItem">
<input v-model="name">
<input v-model="details">
<input v-model="completedBy">
<select v-model="status">
<option>Fail</option>
<option>Warn</option>
<option>Pass</option>
</select><br>
<input type="submit" value="Submit" @click="$bvModal.hide('modal-1')">
</form>
</b-modal>
</div>
</div>
现在每个模态显示正确的信息(如专有名称、详细信息、状态等),但我只需要特定模态。
我想它与 'v-b-modal.modal-1' 有关,但我不确定如何动态设置每个模态的 id...有没有办法轻松设置每个模态 id 以匹配item.id?
这是 Bootstrap-Vue Modals 的文档,但我找不到我需要的东西。
最快但可能不是最好的方法之一是条件渲染模态。
您可以在单击“编辑”时切换活动模式 number/index,方法是将 prop/data/var 设置为 activeModal:1 或 n。
然后在迭代模态的部分,您可以对模态使用 v-if 指令,例如:<v-modal v-if="activeModal">
这是 ignore/not 渲染其他模态的一种方式,但需要重新渲染每次点击“编辑”。
Best/Final 解决方案是将内容 vue-portal 到一个通用模式。
我建议将 <b-modal>
移出您的 v-for
。
这样你就只有一个了。
然后您将要编辑的 user/item 设置为一个变量,并在您的模式中使用它来显示所选用户的数据。
例子
new Vue({
el: "#app",
data() {
return {
selectedUser: null,
items: [{
name: "Name 1",
status: "Fail",
details: "Details 1"
},
{
name: "Name 2",
status: "Warn",
details: "Details 2"
}
]
}
},
methods: {
editUser(user) {
this.selectedUser = user;
this.$bvModal.show("edit-modal");
}
}
})
<link type="text/css" rel="stylesheet" href="//unpkg.com/bootstrap@4.5.3/dist/css/bootstrap.min.css" />
<link href="https://unpkg.com/bootstrap-vue@2.21.2/dist/bootstrap-vue.css" rel="stylesheet" />
<script src="//unpkg.com/vue@2.6.12/dist/vue.min.js"></script>
<script src="//unpkg.com/bootstrap-vue@2.21.2/dist/bootstrap-vue.min.js"></script>
<div id="app" class="p-4">
<div v-for="item in items" class="mt-3">
{{item.name}} {{item.details}} {{item.status}}
<b-btn variant="primary" @click="editUser(item)">Edit</b-btn>
<b-btn variant="danger">Delete</b-btn>
</div>
<b-modal id="edit-modal" title="Edit User">
<form v-if="selectedUser">
<input v-model="selectedUser.name">
<input v-model="selectedUser.details">
<input v-model="selectedUser.completedBy">
<select v-model="selectedUser.status">
<option>Fail</option>
<option>Warn</option>
<option>Pass</option>
</select><br>
<input type="submit" value="Submit">
</form>
</b-modal>
</div>
如果您想将模态框保留在 v-for
中,则必须给它一个唯一的 id
。如果你的项目有一个我会推荐使用那个,否则你可以使用 v-for 中的 index
。
简化示例
<div v-for="item in items">
<button v-b-modal:[`edit-modal-${item.id}`]>Edit Item</button>
<b-modal :id="`edit-modal-${item.id}`">
<!-- Modal Content-->
</b-modal>
</div>