Bootstrap-vue b-table 过滤器在 header
Bootstrap-vue b-table with filter in header
我有一个用 bootstrap-vue 生成的 table,它显示了系统搜索的结果。
结果 Table 向用户显示记录,用户可以对它们进行排序和筛选。
如何在使用 bootstrap-vue <b-table>
元素生成的 table header <th>
下方添加搜索字段?
当前 table 的屏幕截图:
想要table的模型:
您可以使用 top-row
插槽自定义您自己的第一行。请参阅下面的基本示例。
new Vue({
el: '#app',
data: {
filters: {
id: '',
issuedBy: '',
issuedTo: ''
},
items: [{id:1234,issuedBy:'Operator',issuedTo:'abcd-efgh'},{id:5678,issuedBy:'User',issuedTo:'ijkl-mnop'}]
},
computed: {
filtered () {
const filtered = this.items.filter(item => {
return Object.keys(this.filters).every(key =>
String(item[key]).includes(this.filters[key]))
})
return filtered.length > 0 ? filtered : [{
id: '',
issuedBy: '',
issuedTo: ''
}]
}
}
})
<link type="text/css" rel="stylesheet" href="//unpkg.com/bootstrap/dist/css/bootstrap.min.css"/><link type="text/css" rel="stylesheet" href="//unpkg.com/bootstrap-vue@latest/dist/bootstrap-vue.css"/><script src="https://cdn.jsdelivr.net/npm/vue@2.5.17/dist/vue.min.js"></script><script src="//unpkg.com/babel-polyfill@latest/dist/polyfill.min.js"></script><script src="//unpkg.com/bootstrap-vue@latest/dist/bootstrap-vue.js"></script>
<div id="app">
<b-table striped show-empty :items="filtered">
<template slot="top-row" slot-scope="{ fields }">
<td v-for="field in fields" :key="field.key">
<input v-model="filters[field.key]" :placeholder="field.label">
</td>
</template>
</b-table>
</div>
注意: 我使用计算 属性 来过滤项目,而不是 b-table
中的 :filter
道具,因为它不' 如果所有项目都被过滤掉,则呈现行,包括您的自定义第一行。这样,如果结果为空,我可以提供一个虚拟数据行。
对 phil 的回答投了赞成票,只是让它更通用
filtered() {
const filtered = this.items.filter(item => {
return Object.keys(this.filters).every(key =>
String(item[key]).includes(this.filters[key])
);
});
return filtered.length > 0
? filtered
: [
Object.keys(this.items[0]).reduce(function(obj, value) {
obj[value] = '';
return obj;
}, {})
];
}
错误
const filtered = this.items.filter(item => {
return Object.keys(this.filters).every(key =>
// String(item[key]).includes(this.filters[key]))
return String(item[key]).includes(this.filters[key]))
})
感谢您提供这些有用的答案。它节省了我今天的一些时间。
但是,如果项目是异步给出的,我必须像这样对项目大小添加测试
filtered() {
if (this.items.length > 0) {
const filtered = this.items.filter(item => {
return Object.keys(this.filters).every(key => String(item[key]).includes(this.filters[key])
);
});
return filtered.length > 0
? filtered
: [
Object.keys(this.items[0]).reduce(function (obj, value) {
obj[value] = '';
return obj;
}, {})
];
}
},
另一方面,如果需要有没有过滤器的列,我在下面添加了这个测试
在模板中
<td v-for="field in fields" :key="field.key">
<input v-if="fieldIsFiltered(field)" v-model="filters[field.key]" :placeholder="field.label">
</td>
在组件方法中
fieldIsFiltered(field) {
return Object.keys(this.filters).includes(field.key)
}
我有一个用 bootstrap-vue 生成的 table,它显示了系统搜索的结果。
结果 Table 向用户显示记录,用户可以对它们进行排序和筛选。
如何在使用 bootstrap-vue <b-table>
元素生成的 table header <th>
下方添加搜索字段?
当前 table 的屏幕截图:
想要table的模型:
您可以使用 top-row
插槽自定义您自己的第一行。请参阅下面的基本示例。
new Vue({
el: '#app',
data: {
filters: {
id: '',
issuedBy: '',
issuedTo: ''
},
items: [{id:1234,issuedBy:'Operator',issuedTo:'abcd-efgh'},{id:5678,issuedBy:'User',issuedTo:'ijkl-mnop'}]
},
computed: {
filtered () {
const filtered = this.items.filter(item => {
return Object.keys(this.filters).every(key =>
String(item[key]).includes(this.filters[key]))
})
return filtered.length > 0 ? filtered : [{
id: '',
issuedBy: '',
issuedTo: ''
}]
}
}
})
<link type="text/css" rel="stylesheet" href="//unpkg.com/bootstrap/dist/css/bootstrap.min.css"/><link type="text/css" rel="stylesheet" href="//unpkg.com/bootstrap-vue@latest/dist/bootstrap-vue.css"/><script src="https://cdn.jsdelivr.net/npm/vue@2.5.17/dist/vue.min.js"></script><script src="//unpkg.com/babel-polyfill@latest/dist/polyfill.min.js"></script><script src="//unpkg.com/bootstrap-vue@latest/dist/bootstrap-vue.js"></script>
<div id="app">
<b-table striped show-empty :items="filtered">
<template slot="top-row" slot-scope="{ fields }">
<td v-for="field in fields" :key="field.key">
<input v-model="filters[field.key]" :placeholder="field.label">
</td>
</template>
</b-table>
</div>
注意: 我使用计算 属性 来过滤项目,而不是 b-table
中的 :filter
道具,因为它不' 如果所有项目都被过滤掉,则呈现行,包括您的自定义第一行。这样,如果结果为空,我可以提供一个虚拟数据行。
对 phil 的回答投了赞成票,只是让它更通用
filtered() {
const filtered = this.items.filter(item => {
return Object.keys(this.filters).every(key =>
String(item[key]).includes(this.filters[key])
);
});
return filtered.length > 0
? filtered
: [
Object.keys(this.items[0]).reduce(function(obj, value) {
obj[value] = '';
return obj;
}, {})
];
}
错误
const filtered = this.items.filter(item => {
return Object.keys(this.filters).every(key =>
// String(item[key]).includes(this.filters[key]))
return String(item[key]).includes(this.filters[key]))
})
感谢您提供这些有用的答案。它节省了我今天的一些时间。 但是,如果项目是异步给出的,我必须像这样对项目大小添加测试
filtered() {
if (this.items.length > 0) {
const filtered = this.items.filter(item => {
return Object.keys(this.filters).every(key => String(item[key]).includes(this.filters[key])
);
});
return filtered.length > 0
? filtered
: [
Object.keys(this.items[0]).reduce(function (obj, value) {
obj[value] = '';
return obj;
}, {})
];
}
},
另一方面,如果需要有没有过滤器的列,我在下面添加了这个测试
在模板中
<td v-for="field in fields" :key="field.key">
<input v-if="fieldIsFiltered(field)" v-model="filters[field.key]" :placeholder="field.label">
</td>
在组件方法中
fieldIsFiltered(field) {
return Object.keys(this.filters).includes(field.key)
}