Vue не отображает данные

#vue.js #vuejs2

#vue.js #vuejs2

Вопрос:

У меня была сложная структура данных, и Vue прекрасно с этим справился. Затем я переработал его, и внезапно, кажется, ничего не работает. Я проверил, что структура данных была собрана правильно, но ничего не отображается. Vue не сообщил ни о каких ошибках, и ничего не отображается.

Через несколько часов я обнаружил, что система визуализации Vue не работает, когда структура данных содержит циклическую ссылку. Для проверки я определил два класса A и B. Каждый может иметь ссылку на другой.

classA.js

 export default class classA {
  constructor(name) {
    this.name = name
    this.refB = undefined
  }
  get name() {return this._name}
  set name(n) { this._name= n}
  get type() {return 'classA'}
  get refB() {return this._refB}
  set refB(n) { this._refB= n}
}
  

classB.js

 export default class classB {
  constructor(name) {
    this.name = name
    this.refA = undefined
  }
  get name() {return this._name}
  set name(n) { this._name= n}
  get type() {return 'classB'}
  get refA() {return this._refA}
  set refA(n) { this._refA= n}
}
  

Затем определите компонент Vue, который отображает список класса A. Создайте список в привязке к жизненному циклу монтирования и убедитесь, что НЕ связываете экземпляр ClassB обратно с ClassA. Убедитесь, что следующее отображает необработанное отображение каждого элемента classAList

 <template lang="pug">
   div Circular References
      div ClassAList length: {{classAlist.length}}
      div(v-for="cA in classAlist")
         div {{cA}}
</template>

<script>
import ClassA from '../classA'
import ClassB from '../classB'
export default {
  data () {
    return {
      classAlist: []
    }
  },
  mounted: function () {
    let a = new ClassA('a1')
    let b = new ClassB('b1')
    a.refB = b
    // Uncomment the next line to create a circular reference in the       
    // data structure. Immediately, once this next line establishes the
    // circular reference the Vue render system fails, silently
    // b.refA = a
    this.classAlist.push(a)
    console.log('Console listing the classA list ', this.classAlist)
  }
}
</script>
  

Проверьте консоль, чтобы увидеть, что массив построен так, как ожидалось. Теперь раскомментируйте строку кода, которая связывает экземпляр B обратно с экземпляром A. Консоль продолжит показывать, что массив построен так, как ожидалось, но системе визуализации Vue не нравятся циклические ссылки.

Есть ли обходной путь? Есть ли способ заставить Vue отображать какое-либо сообщение об ошибке. (например, как JSON.stringfy работает с подобными объектами)?

Комментарии:

1. Я вижу предупреждение / ошибку в консоли браузера, указывающее на циклическую ссылку. сборка разработчиков и производственная сборка (Vue CLI 3.5.1, Vue 2.6.10, Chrome 73, macOS mojave)

2. Спасибо @tony19 за подсказку. Я использую Firefox, и каким-то образом консоль была отфильтрована с помощью «4 фильтров». Я не знаю, что устанавливало эти фильтры и что именно они фильтровали, но они отфильтровали некоторые сообщения о критических ошибках. Я потратил много времени на отслеживание проблем во всех неправильных местах! Теперь , когда фильтры очищены … должен быть в состоянии обнаружить проблемы раньше.