Как избежать проблем со ссылками на объекты в компонентах Vue js 2?

1

Я изучаю Vue и ничего не понимаю. Я продолжаю получать эту ошибку:

Свойство или метод "item" не определен в экземпляре, но упоминается во время рендеринга. Убедитесь, что это свойство является реактивным, либо в параметре данных, либо для компонентов на основе классов, инициализируя свойство. См. Https://vuejs.org/v2/guide/reactivity.html#Declaring-Reactive-Properties.

Очевидно, я прочитал статью и подумал о моем коде, но так как я использую метод Vue push() (который должен делать что-то), все же я не могу понять, почему он не работает. Может ли кто-то пролить свет на это, пожалуйста?

Я разделяю код ниже:

var maxpages = parseInt(rest_object.maxpages);

Vue.component('news-item', {
  template: '#news-template'
  ,props:['newsdata']
})

var news_manager = new Vue({
  el: '#more-news-box'
  ,data:{
    page: 1 
    ,add_more_button: null
    ,items: []
  }
  ,mounted: function(){
    this.add_more_button = $('button.add-more');

  }
  ,methods: {
    get_posts: function(){
      this.page += 1;
      if(this.page > maxpages) return false;
      if(this.page == maxpages) this.add_more_button.prop('disabled','disabled').addClass('hidden');

      $.ajax({
        type: 'GET'
        ,dataType: 'json'
        ,url: rest_object.api_url
        ,data: { per_page: 3 ,page: this.page }
      }).done(function(posts_objects) {
        _.each(posts_objects, function(post){ this.items.push(post); }.bind(this));
      }.bind(this));
    }
  }
});

HTML:

<div class="more-news-box" id="more-news-box">
  <ul><li v-for="(item, index) in items" is="news-item" :key="index" :newsdata="item"></li></ul>
  <button class="add-more" type="button" @click="get_posts">add more</button>
</div>


<script type="text/x-template" id="news-template">
  <li>
    <article class="news-article">
      <figure class="news-figure"></figure>
      <div class="news-date news-component"></div>
      <h3 class="news-title news-component">{{ item.title.rendered }}</h3>
      <div class="news-content news-component"></div>
    </article>
  </li>
</script>
Теги:
vue.js
vuejs2

1 ответ

1
Лучший ответ

Элемент шаблона компонента ссылается на item но item не объявляется как свойство в любом месте компонента.

<h3 class="news-title news-component">{{ item.title.rendered }}</h3>

Вместо этого компонент объявляет свойство newsdata. Я ожидаю, что вы хотите:

<h3 class="news-title news-component">{{ newsdata.title.rendered }}</h3>

Здесь код (слегка измененный, поэтому работает вызов API).

console.clear()

var maxpages = 10

Vue.component('news-item', {
  template: '#news-template'
  ,props:['newsdata']
})

var news_manager = new Vue({
  el: '#more-news-box'
  ,data:{
    page: 1 
    ,add_more_button: null
    ,items: []
  }
  ,mounted: function(){
    this.add_more_button = $('button.add-more');

  }
  ,methods: {
    get_posts: function(){
      this.page += 1;
      if(this.page > maxpages) return false;
      if(this.page == maxpages) this.add_more_button.prop('disabled','disabled').addClass('hidden');

      $.ajax({
        type: 'GET'
        ,dataType: 'json'
        ,url: "https://swapi.co/api/people"
        ,data: { per_page: 3 ,page: this.page }
      }).done(function(posts_objects) {
        console.log(posts_objects)
        _.each(posts_objects.results, function(post){ this.items.push({title:{rendered:post.name}}); }.bind(this));
        console.log(this.items)
      }.bind(this));
    }
  }
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.4/lodash.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.2.1/jquery.min.js"></script>
<script src="https://unpkg.com/[email protected]"></script>

<div class="more-news-box" id="more-news-box">
  <ul><li v-for="(item, index) in items" is="news-item" :key="index" :newsdata="item"></li></ul>
  <button class="add-more" type="button" @click="get_posts">add more</button>
</div>


<script type="text/x-template" id="news-template">
  <li>
    <article class="news-article">
      <figure class="news-figure"></figure>
      <div class="news-date news-component"></div>
      <h3 class="news-title news-component">{{ newsdata.title.rendered }}</h3>
      <div class="news-content news-component"></div>
    </article>
  </li>
</script>
  • 0
    Хорошо, да, среди всего {{ newsdata.title.rendered }} решил проблему. Большое спасибо!

Ещё вопросы

Сообщество Overcoder
Наверх
Меню