vue.js在页面执行期间在控制台中显示$ vnode.key

时间:2018-11-15 08:57:35

标签: vue.js

我是vue.js的新手,正在为在for循环中显示某些项目的$ vnode.key而苦苦挣扎。

我有一个创建插槽的子组件和一个使用该插槽的父组件。

子组件向p元素列表中的每个项目添加一个键,并为每个元素添加一个键。

我需要一种方法来在控制台中显示每个项目的$ vnode.key,以便我可以确切地确认密钥中的值。

我在父级和子级中尝试了各种方法,但是每当我在控制台中看到vnode数据时,键始终是未定义的。

我尝试使用created:方法,也尝试使用mount:方法来等待模板被渲染。但是我仍然只能看到undefined作为键。

老实说,我不清楚我在看哪个vnode。

我无法解决的是我应该在哪里放置代码,以确保选择正确的vnode以及代码的真正外观。

子组件的代码如下:

 <template>
  <div>
    <div

      v-for="post in posts"
      v-bind="{post}"
      :key="post.id"

    >
      <slot v-bind="post"></slot>
    </div>
  </div>
</template>

<script>

export default {
  name: 'posts-list',
  props: {
    posts: {
      type: Array,
      required: true,
    }
  },
created () {
  console.log('CREATED CHILD VNODE', this.$vnode);
}  


}

</script>

父组件的代码如下:

<template>
  <div  style="background-color: orange;">
    <h1>Posts API</h1>
  <div v-if="isLoading">
    <i  class="fa fa-spinner fa-spin"></i>
  <!--  <img src="../src/assets/loader.gif"/> -->
    Loading.....
  </div>
    <posts-list
      v-if="!isLoading"
      :posts="computedPosts"
    >
      <template slot-scope="post">
        <div style="background-color: yellow;padding:5px;"> 
<!--          <figure>
            <img 

              :src="`https://robohash.org/${post.title}`"
              :alt="post.title"
            >
            <figcaption>
              <h3>{{post.title}}</h3>
            </figcaption>
          </figure>
-->
          <h3>{{post.title}}</h3>
          <p style="padding:5px;">{{post.body}}</p>
          <p style="padding:15px;">{{post.id}}</p>

        </div>
      </template>
    </posts-list>
  </div>
</template>

<script>
import PostsList from './PostsList'
import { RepositoryFactory } from './../repositories/RepositoryFactory'
const PostsRepository = RepositoryFactory.get('posts')
export default {
  name: "parent-component",
  components: { PostsList },
  data() {
    return {
      isLoading: false,
      posts: [],
    };
  },
  created () {
    this.fetch()
    console.log('CREATED POSTS', this.posts);
    console.log('CREATED VNODE',this.$vnode);
  },
  methods: {
    async fetch () {
      try {
      this.isLoading = true
      const { data } = await PostsRepository.createPost('the-field')
      this.isLoading = false
      this.posts = data;
      console.log('DATA', data[0]);
      //console.log('VNODE KEY', this.$vnode.key);
      } catch (error) {
        console.error('GOT ERROR', error);

        if (error.code == "ECONNABORTED") {
        this.isLoading = false;
        this.posts = [{'id':'1', 'userId':'1','title':'NO RESULT','body':'timeout'}];
        }
        else if (error.response.status == 500) {
          console.log('GOT 500');
          console.error('GOT ERROR CODE', error.code);
          console.error('GOT ERROR CODE', error.response.status);
          console.error('GOT ERROR CODE', error.response);          console.log('GOT DATA', error.response.data[0].body);
          this.isLoading = false;
          this.posts = [{'id':'1', 'userId':'1','title':'NO RESULT','body':error.response.data[0].body}];
        }
      }
    }
  },
  computed: {
    computedPosts () {
      return this.posts.slice(0, 1)
    }
  },
  mounted (){
    console.log('PARENT MOUNTED VNODE', this.$vnode);
  }
};
</script>

此代码背后的原始想法来自博客文章,我认为这是一个好主意。因此,我正在对其进行调整以适合我的目的。

如果有人感兴趣,则指向博客文章的链接为:

https://blog.snap.hr/01/11/2018/vue-api-calls-smart-way/?utm_campaign=Vue.js%20News&utm_medium=email&utm_source=Revue%20newsletter

0 个答案:

没有答案