javascript - 如何更改 vuetify 数据表中单个按钮的属性?
问题描述
我有一个 vuetify 数据表,它呈现从 axios 调用接收到的数据。
在最后一列中,我使用模板 v-slot 作为定制列,因此我可以添加两个按钮。根据文档https://vuetifyjs.com/en/components/buttons#loaders,v-btn接受了两个用于加载状态的道具:
- :加载
- :禁用
问题是,当我调用一个更改这些值的函数时,数据表中的所有按钮都在接收道具状态,所以不是 1 个按钮显示加载器,而是所有按钮。
<v-row no-gutters>
<v-data-table
:headers="tableHeaders"
:items="requests"
:items-per-page="10"
class="elevation-1"
:loading="loading" loading-text="Loading... Please wait"
>
<template v-slot:item.action="{ item }">
<v-btn color="success" @click="createPacks(item)" :loading="createloading" :disabled="createloading">Create</v-btn>
<v-btn color="error" @click="excludeRequest(item)" :loading="cancelloading" :disabled="cancelloading">Cancel</v-btn>
</template>
</v-data-table>
</v-row>
我知道这是因为 DOM 中的按钮不是唯一的,并且框架正在调用所有这些按钮,但我不知道如何更改该默认行为。
数据:
export default {
data() {
return {
loading: null,
error: null,
tableHeaders: [
{
text: 'ID',
value: 'req_id',
align: 'center',
},
{ text: 'Template', value: 'templateConcatenated'},
{ text: 'No of batches', value: 'no_batches' },
{ text: 'Batch size', value: 'batch_size' },
{ text: 'Date requested', value: 'requested_at' },
{ text: 'Requested by', value: 'requester' },
{ text: 'Actions', value: 'action', sortable: false, align: 'center'},
],
createloading: false,
cancelloading: false,
successmessage: '',
errormessage: '',
};
},
methods: {
createPacks(item) {
this.loading = true;
this.createloading = true;
let page_url = '/api/CreateProcedure?api_token='+this.$api_token;
axios
.post(page_url, item)
.then((response) => {
this.loading = false;
this.error = null;
this.createloading = false;
this.successmessage = 'Packs created successfully!';
this.errormessage = null;
})
.catch(err => {
this.createloading = false;
this.successmessage = null;
this.errormessage = 'Error creating the packs: '+err;
console.log("error: "+err);
})
},
}
}
知道如何调用每个单独的按钮来改变它的状态吗?
谢谢
解决方案
您必须在项目本身上设置加载属性,而不是全局定义它们:
createPacks(item) {
this.loading = true;
item.createloading = true;
let page_url = '/api/CreateProcedure?api_token='+this.$api_token;
axios
.post(page_url, item)
.then((response) => {
this.loading = false;
this.error = null;
item.createloading = false;
this.successmessage = 'Packs created successfully!';
this.errormessage = null;
})
.catch(err => {
item.createloading = false;
this.successmessage = null;
this.errormessage = 'Error creating the packs: '+err;
console.log("error: "+err);
})
},
== 更新 ==
我根据您在评论中添加的 codepen 添加了一个代码,您还必须在 HTML 中使用 item.createloasing 否则它不起作用。https://codepen.io/reijnemans/pen/LYPerLg?editors=1010
目前只有一个按钮同时工作,但这可能是因为在 codepen 中没有定义 axios。
推荐阅读
- javascript - 是否可以不重建整个应用程序而仅在 Nextjs 中生成新的静态文件?
- pandas - 英国车牌 - 在字符串的不同部分互换 0/O
- java - Reactor Kafka 中没有创建订阅错误
- ajax - 使用 ajax 重新加载部分页面
- r - 如何在 R 中为 Sobol 灵敏度分析创建采样矩阵(包“灵敏度”)
- r - 侧边栏面板背景变化
- join - 使用 spark sql 将大型数据集与其他相对较小的数据集连接起来
- javascript - 如何使用 rdflib.js 定义“a”谓词
- javascript - 如何将一些html类添加到特定的div?
- c++ - 为什么 g++-11 '-O2' 包含错误,而 '-O0' 没问题?