Bootstrap-vue - 动态设置 table 变量
Bootstrap-vue - Setting table variant dynamically
所以我在这个测试应用中使用 Bootstrap Vue
。我正在尝试根据它的值更改 table 单元格的变体。不幸的是,变体参数不会采用函数,所以我不知道如何实现它。
这是我的代码:
var app = new Vue({
el: '#app',
data: {
items: [], //Will be populated through AJAX
fields: [
{
key: 'Vendedor',
label: 'Vendedor'
},
{
key: 'OBJETIVO',
label: 'Objetivo',
formatter: (value) => { return parseFloat(value).toFixed(2)},
variant: estiloObjetivo //THIS IS NOT WORKING
}
]
},
methods: {
Cargar: function () {
var salesperson = getCookie('salespersonCode');
var url_servicio = 'http://MywebService/';
var self = this;
$.ajax({
type: 'GET',
url: url_servicio + 'ventas/' + salesperson,
dataType: "json", // data type of response
success: function(data){
self.items = data
}
});
},
estiloObjetivo (value) {
if value > 0 //I need my cell variant to change depeding on this value
return 'danger'
else
return 'success'
}
}
})
这是我的 HTML 部分:
<div id="app">
<button v-on:click="Cargar">Cargar</button>
<b-table striped hover :fields="fields" :items="items"></b-table>
</div>
关于如何动态设置 Bootstrap-vue 单元格的样式有什么想法吗?
这是在文档中完成的方式,它实际上是在 "items" 数组中设置的,但这在像我这样从 Web 服务获取数据的情况下有什么用?:
{
salesperson: 'John',
Objetivo: 2000,
_cellVariants: { salesperson: 'success', Objetivo: 'danger'}
},
所以我想我需要的是一种设置方法,我需要的是设置 'items' 数组中每个元素的 _cellVariants
参数。
如果您想将 variant
添加到项目中,您可以使用名为 cptItems
的 computed
属性 并将其定义如下:
computed:{
cptItems(){
return this.items.map((item)=>{
let tmp=item;
item.OBJETIVO>0?tmp.variant='danger':tmp.variant='success';
return tmp;
})
}
并在模板中使用 属性,例如:
<b-table .... :items="cptItems"></b-table>
您可能需要 computed property
。计算属性会根据它们所依赖的反应变量的变化自动更新。
以下示例实现了一个计算的 属性、styledItems
,您必须使用它来代替模板中的 items
。它 returns items
的 1-深副本 ,即包含每个项目副本的新数组,以及额外的 _cellVariants
属性 添加。
new Vue({
data: {
items: [ /* your data here */ ]
},
methods: {
estiloObjetivo: value => (value > 0) ? 'danger' : 'success'
},
computed: {
styledItems() {
return this.data.map(datum =>
Object.assign({}, datum, {
_cellVariants: {
Objetivo: this.estiloObjetivo(datum.Objetivo)
}
})
}
})
我确信上面的答案可以解决我自己的问题,但他们没有。我找到了一种不同的方法来为 table 个单元格着色:https://github.com/bootstrap-vue/bootstrap-vue/issues/1793
除了使用变体为 table 单元格着色之外。相反,我们使用 tdclass 和一个函数。
<script>
new Vue({
el: '#itemView',
data() {
return {
fields: [
{
key: 'Objetive',
sortable: true,
thClass: 'text-nowrap',
tdClass: (value, key, item) => {
return 'table-' + this.getColor(item);
}
}
],
};
},
methods: {
getColor(item) {
return item.Objetive > 0 ? 'danger' : 'success';
},
},
});
</script>
对于我自己的用例,我需要比较同一行的两个单元格,然后将 class 应用于其中一个。
...
{
key: 'DEMAND_QTY',
sortable: true,
thClass: 'text-nowrap',
tdClass: (value, key, item) => {
return 'table-' + this.demandStatusColor(item);
},
},
{ key: 'TOTAL_DEMAND', sortable: true, thClass: 'text-nowrap' },
],
};
},
methods: {
demandStatusColor(item) {
return item.DEMAND_QTY < item.TOTAL_DEMAND ? 'danger' : 'success';
},
}
...
也许这会对某人有所帮助,如果不是 OP。
@John 答案对我有用。我没有足够的声誉来发表评论或有用
tdClass: (type, key, item) => {
switch (type) {
case "value":
return "bg-warning text-white";
break;
case "value":
return "bg-danger text-white";
break;
case "value":
return "bg-info text-white";
break;
default:
break;
}
},
所以我在这个测试应用中使用 Bootstrap Vue
。我正在尝试根据它的值更改 table 单元格的变体。不幸的是,变体参数不会采用函数,所以我不知道如何实现它。
这是我的代码:
var app = new Vue({
el: '#app',
data: {
items: [], //Will be populated through AJAX
fields: [
{
key: 'Vendedor',
label: 'Vendedor'
},
{
key: 'OBJETIVO',
label: 'Objetivo',
formatter: (value) => { return parseFloat(value).toFixed(2)},
variant: estiloObjetivo //THIS IS NOT WORKING
}
]
},
methods: {
Cargar: function () {
var salesperson = getCookie('salespersonCode');
var url_servicio = 'http://MywebService/';
var self = this;
$.ajax({
type: 'GET',
url: url_servicio + 'ventas/' + salesperson,
dataType: "json", // data type of response
success: function(data){
self.items = data
}
});
},
estiloObjetivo (value) {
if value > 0 //I need my cell variant to change depeding on this value
return 'danger'
else
return 'success'
}
}
})
这是我的 HTML 部分:
<div id="app">
<button v-on:click="Cargar">Cargar</button>
<b-table striped hover :fields="fields" :items="items"></b-table>
</div>
关于如何动态设置 Bootstrap-vue 单元格的样式有什么想法吗?
这是在文档中完成的方式,它实际上是在 "items" 数组中设置的,但这在像我这样从 Web 服务获取数据的情况下有什么用?:
{
salesperson: 'John',
Objetivo: 2000,
_cellVariants: { salesperson: 'success', Objetivo: 'danger'}
},
所以我想我需要的是一种设置方法,我需要的是设置 'items' 数组中每个元素的 _cellVariants
参数。
如果您想将 variant
添加到项目中,您可以使用名为 cptItems
的 computed
属性 并将其定义如下:
computed:{
cptItems(){
return this.items.map((item)=>{
let tmp=item;
item.OBJETIVO>0?tmp.variant='danger':tmp.variant='success';
return tmp;
})
}
并在模板中使用 属性,例如:
<b-table .... :items="cptItems"></b-table>
您可能需要 computed property
。计算属性会根据它们所依赖的反应变量的变化自动更新。
以下示例实现了一个计算的 属性、styledItems
,您必须使用它来代替模板中的 items
。它 returns items
的 1-深副本 ,即包含每个项目副本的新数组,以及额外的 _cellVariants
属性 添加。
new Vue({
data: {
items: [ /* your data here */ ]
},
methods: {
estiloObjetivo: value => (value > 0) ? 'danger' : 'success'
},
computed: {
styledItems() {
return this.data.map(datum =>
Object.assign({}, datum, {
_cellVariants: {
Objetivo: this.estiloObjetivo(datum.Objetivo)
}
})
}
})
我确信上面的答案可以解决我自己的问题,但他们没有。我找到了一种不同的方法来为 table 个单元格着色:https://github.com/bootstrap-vue/bootstrap-vue/issues/1793
除了使用变体为 table 单元格着色之外。相反,我们使用 tdclass 和一个函数。
<script>
new Vue({
el: '#itemView',
data() {
return {
fields: [
{
key: 'Objetive',
sortable: true,
thClass: 'text-nowrap',
tdClass: (value, key, item) => {
return 'table-' + this.getColor(item);
}
}
],
};
},
methods: {
getColor(item) {
return item.Objetive > 0 ? 'danger' : 'success';
},
},
});
</script>
对于我自己的用例,我需要比较同一行的两个单元格,然后将 class 应用于其中一个。
...
{
key: 'DEMAND_QTY',
sortable: true,
thClass: 'text-nowrap',
tdClass: (value, key, item) => {
return 'table-' + this.demandStatusColor(item);
},
},
{ key: 'TOTAL_DEMAND', sortable: true, thClass: 'text-nowrap' },
],
};
},
methods: {
demandStatusColor(item) {
return item.DEMAND_QTY < item.TOTAL_DEMAND ? 'danger' : 'success';
},
}
...
也许这会对某人有所帮助,如果不是 OP。
@John 答案对我有用。我没有足够的声誉来发表评论或有用
tdClass: (type, key, item) => {
switch (type) {
case "value":
return "bg-warning text-white";
break;
case "value":
return "bg-danger text-white";
break;
case "value":
return "bg-info text-white";
break;
default:
break;
}
},