Бесконечный цикл при использовании функции визуализации компонента Vue

#javascript #vue.js #vue-component #vue-reactivity #vue-render-function

#javascript #vue.js #vue-компонент #vue-реактивность #vue-рендеринг-функция

Вопрос:

Я использую компонент Vue для отображения заголовка некоторой таблицы следующим образом:

 render (createElement) {
  return createElement('div', { class: 'header' },
    Array.apply(null, { length: this.initHours.length }).map(() => {
      return createElement('div', { class: 'frame' }, this.getHourIndex() )
    })
  )
}
 

Проблема в том, что при консоли.журнал, выполняемый в hourIndex (который проходит через массив), проходит бесконечный цикл.

Функция getHourIndex :

 getHourIndex () {
  const headerData = this.initHours[this.hourIndex]
  this.hourIndex  
  console.log(this.hourIndex) /// this is what's telling me it's an infinite loop
  return headerData
}
 

Любая информация о том, почему это делает этот бесконечный цикл (учитывая, что массив hourIndex содержит всего 25 элементов), будет оценена по достоинству.

Ответ №1:

Всякий раз, когда компонент отображает реактивные данные, он также должен повторно отображать эти данные, если они изменяются. Это часть реактивности. Таким образом, сам процесс рендеринга никогда не должен изменять данные, иначе будет бесконечный цикл: 1) рендеринг, 2) изменения данных, 3) вызывает повторный рендеринг, 4) изменения данных, до бесконечности.

Это то, что происходит в этом коде, потому что функция визуализации увеличивается this.hourIndex :

 this.hourIndex  
 

Если вам просто нужен индекс, возьмите его из map :

 Array.apply(null, { length: this.initHours.length }).map((_, index) => {
  return createElement('div', { class: 'frame' }, index )
})