Bootstrap-vue:如何使用内置的 table 过滤组件过滤第二组数据?

Bootstrap-vue: How to filter second set of data using built in table filtering component?

我正在使用 VueJS 和 Bootstrap-vue 的 table 组件及其过滤选项来过滤 table 数据。但是,看起来 Bootstrap/Table 过滤组件只能应用于原始项目数组数据,因此根据文档 "it is not currently possible to filter data based on custom rendering of virtual columns": https://bootstrap-vue.js.org/docs/components/table#filtering

我的情况是,我有一个仅包含用户 ID 的原始数据数组,但我有另一个包含用户 ID 和实际名称的数据数组。因此,在我的 table 中,我不想显示用户 ID,而是想显示实际名称。我创建了一个自定义 "formatter" 回调函数 (docs) 并且可以在 table 中显示名称,但是过滤器组件不会搜索它,因为它不是原始的一部分数据数组。

有没有其他方法可以解决这个问题,这样我也可以通过 "Assigned To" 列进行过滤器搜索?

My demo code here 单击该编辑器中的 "POSTS" link

<template>
  <div>
    <b-table :items="posts" :fields="fields">
      <!-- A custom formatted column -->
      <template slot="name" slot-scope="data">{{ data.value.userId }}</template>
    </b-table>
  </div>
</template>

<script>
import axios from "axios";
import users from "../assets/users.json";
export default {
  data() {
    return {
      posts: [],
      users: [],
      // key name is the slot name
      fields: [
        { key: "id" },
        { key: "title" },
        { key: "body" },
        { key: "userId", label: "Assigned To", formatter: "assignNames" }
      ]
    };
  },
  created() {
    this.getPosts();
    this.getNames();
  },
  methods: {
    getPosts() {
      axios.get("https://jsonplaceholder.typicode.com/posts").then(resp => {
        this.posts = resp.data;
      });
    },
    getNames() {
      setTimeout(
        () =>
          Promise.resolve(users).then(resp => {
            this.users = resp.data;
          }),
        1234
      );
    },
    assignNames(id) {
      const user = this.users.find(user => user.id === id);
      return user ? `${user.first_name} ${user.last_name}` : "loading...";
    }
  }
};
</script>

您需要在帖子和用户之上创建一个数组。准备显示所需的数据总是好的。

计算属性对此很有用。

此外,由于用户来自同步 json,因此您不需要 promise 或 setTimeout。

<script>
    import axios from "axios";
    import users from "../assets/users.json";
    export default {
        data() {
            return {
                rawPosts: [],
                // key name is the slot name
                fields: [
                    { key: "id" },
                    { key: "title" },
                    { key: "body" },
                    { key: "user", label: "Assigned To" }
                ]
            };
        },
        created() {
            this.loadPosts();
        },
        methods: {
            loadPosts() {
                axios.get("https://jsonplaceholder.typicode.com/posts").then(resp => {
                    this.rawPosts = resp.data;
                });
            },
            userFrom(id) {
                const user = users.data.find(user => user.id === id);
                return user && `${user.first_name} ${user.last_name}`;
            }
        },
        computed:{
            posts(){
                if(this.rawPosts.length && users.length){
                    return this.rawPosts.map(rawPost => ({...rawPost, user: this.userFrom(rawPost.userId)}));
                }else{
                    //loading case
                }
            }
        }
    };
</script>