【问题标题】:Data not being passed to Vue component数据未传递给 Vue 组件
【发布时间】:2020-07-20 23:42:40
【问题描述】:

我有一个 Vue 组件从其父组件接收“项目”数组。

我已将它们分类,每个类别中有两个“项目”:

computed: {
        // sort items into categories
        glass: function() {
            return this.items.filter(i => i.category === "glass").slice(0, 2);
        },
        ceramics:
        // etc...

我需要将这两个项目都放在categories.items 中,然后将它们作为道具传递给另一个组件:

data() {
        return {
            categories: [
                { name: "Glass", sort: "glass", items: {} },
                { name: "Ceramics", sort: "ceramics", items: {} },
                { name: "Brass", sort: "brass", items: {} },
                { name: "Books/Comics", sort: "books", items: {} },
                { name: "Collectibles", sort: "collectibles", items: {} },
                { name: "Pictures", sort: "pictures", items: {} },
                { name: "Other", sort: "other", items: {} }
            ]
        };
    },

当我使用 createdmounted 时,没有任何内容通过,当我使用 beforeDestroydestroyconsole.log 时,结果可以正常工作,但是退出页面时它们没有用.

“项目”来自 Axios GET 请求,这可能是为什么?

父组件的GET请求:

methods: {
        fetchItems() {
            // items request
            let uri = "http://localhost:8000/api/items";
            this.axios.get(uri).then(response => {
                // randomize response
                for (let i = response.data.length - 1; i > 0; i--) {
                    const j = Math.floor(Math.random() * (i + 1));
                    [response.data[i], response.data[j]] = [
                        response.data[j],
                        response.data[i]
                    ];
                }

                this.items = response.data;
            });
        }
    },

将 props 传递给子组件:

        <div
            class="items-container"
            v-for="category in categories"
            :key="category.name"
        >
            <router-link :to="'category.link'" class="category-names-home-link">
                <h2 class="category-names-home">{{ category.name }}</h2>
            </router-link>
            <router-link
                :to="'category.link'"
                class="home-view-all"
                @mouseover.native="expand"
                @mouseout.native="revert"
                >View All...</router-link
            >
            <div class="items">
                <!-- Pass to child component as props: -->
                <SubItem :item="categories.items" />
                <SubItem :item="categories.items" />
            </div>
        </div>

【问题讨论】:

  • 您能否在此处使用jsfiddlesnippet 为此创建small demo 以显示正在发生的问题。对于 ajax 调用,您可以使用任何公共 API 来显示虚拟数据。另外,不要在演示中添加完整的代码。可能只有一个计算属性。
  • 如何将数据传递给孩子?可以发一下吗?
  • 子组件添加到页面之前,axios请求是否完成?如果没有,数据将不会显示在 created 或 Mounted 中。
  • 如果您从子组件中的父组件传递信息,则应该是 props ,而不是 datacomputed vuejs.org/v2/guide/components-props.html
  • @ToniMichelCaubet 我在另一个组件中以 props 的形式传递数据,并尝试使用计算,两者都工作正常。除非我误会了?

标签: javascript vue.js vuejs2 vue-component


【解决方案1】:
  • 不要费心将项目添加到类别中,将它们分开
  • 使用一个计算对象哈希来存储所有过滤后的集合,而不是多个计算对象:
computed: {
  filtered() {
    if (!this.items) return null;
    const filtered = {};
    this.items.forEach(item => {
      if (filtered[item.category]) {
        filtered[item.category].push(item);
      } else {
        filtered[item.category] = [item];
      }
    });
    return filtered;
  }
}

结果:

{
'Glass': [ ... ],
'Ceramic': [ ... ]
...
}

在模板中:

<div>
   <div v-for="category in categories" :key="category.name">
      <div class="items" v-for="item in filtered[category.name]">
         <SubItem :item="item" />
      </div>
   </div>
</div>

您可以在父级中使用v-if 来防止在加载数据之前显示任何内容:

<display v-if="items" :items="items"></display>

这是demo

【讨论】:

  • 唯一的事情是这将列出所有项目,而不是每个类别仅列出 2 个。如果您需要我为 2 编辑它,请告诉我。它看起来有点不直观,但同样有效。
  • 由于某种原因,无论有没有 v-if,它都没有显示任何内容。当我删除我的 Axios 请求并粘贴到您的代码中时,它可以工作,但是该请求在其他地方使用得很好,所以我真的不知道问题是什么
  • 在将数据设置为 this.items 之前记录数据,并确定该数据与我的伪数据之间的差异。截屏控制台日志并在此处发布链接(如果需要)
  • 它记录一个对象数组,其中包含“id”、“name”等键。
  • 是时候测试所有数据了,一步一步地展示每一件事,找出导致 v-if 不显示的原因,等等。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-10-07
  • 2016-09-24
  • 2020-06-13
  • 1970-01-01
  • 2019-01-03
  • 2021-01-06
  • 1970-01-01
相关资源
最近更新 更多