【问题标题】:How can I avoid objects reference issues in in Vue js 2 components?如何避免 Vue js 2 组件中的对象引用问题?
【发布时间】:2017-10-28 15:00:41
【问题描述】:

我正在学习 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>

【问题讨论】:

    标签: javascript vue.js vuejs2


    【解决方案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/vue@2.4.2"></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>

    【讨论】:

    • 好吧,是{{ newsdata.title.rendered }},解决了这个问题。非常感谢!
    猜你喜欢
    • 1970-01-01
    • 2022-01-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多