Вложенные циклы и для сохранения количества индексов во втором

#javascript #vue.js

#javascript #vue.js

Вопрос:

У меня есть два вложенных цикла, и я пытаюсь увеличить счетчик во втором цикле, так что, по сути, счетчик не сбрасывается.

теперь: 1 2 3 4 1 2 3 4
хочу: 1 2 3 4 5 7 8

В vanila javascript у меня была бы переменная, но как это делается в Vue land?

Редактировать
Я хочу, чтобы количество было в шаблоне, а не в части javascript.

 new Vue({
  el: "#app",
  data: () => ({
    todos: [],
    activeIndex: -1
  }),
  mounted() {
    for (let t of ['first', 'second']) {
      const listObjects = []

      for (let i = 0; i < 10; i  ) {
        listObjects.push({
          url: `/${t}/${t}-${i}`,
          name: `${t}-${i}`,
          type: t
        })
      }

      this.todos.push({
        type: t,
        listItems: listObjects
      })
    }
  }
})  
 <script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.5.17/vue.js"></script>

<div id="app">
  <template v-for="todo of todos">
    <ul>
     <li 
     v-for="(item, i) of todo.listItems" 
     :class="{ 'item--is-active': activeIndex === i }">
     {{ item.name }}
     </li>
    </ul>
  </template>
</div>  

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

1. Установите ‘i’ равным 0 перед запуском первого цикла for и удалите ‘i = 0’ во втором цикле for.

2. @SudoKid Я ищу, как это сделать в шаблоне, а не в части сценария

3. о каком счетчике в шаблоне вы говорите?

4. @Prashant Второй счетчик продолжать увеличивать вместо сброса (item, i)

Ответ №1:

 new Vue({
  el: "#app",
  data: () => ({
    todos: [],
    activeIndex: -1,
    counter: 0,
  }),
  mounted() {
    for (let t of ['first', 'second']) {
      const listObjects = []

      for (let i = 0; i < 10; i  ) {
        listObjects.push({
          url: `/${t}/${t}-${i}`,
          name: `${t}-${i}`,
          id:   this.counter,
          type: t
        })
      }

      this.todos.push({
        type: t,
        listItems: listObjects
      })
    }
  }
})  
 <script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.5.17/vue.js"></script>

<div id="app">
  <template v-for="todo of todos">
    <ul>
     <li 
     v-for="(item, i) of todo.listItems" 
     :class="{ 'item--is-active': activeIndex === i }">
     {{ item.name }} id: {{ item.id }}
     </li>
    </ul>
  </template>
</div>  

Ответ №2:

Я не знаю Vue, но я думаю, вам нужно что-то вроде:

 mounted() {
  let i = 0;
  for (let t of ['first', 'second']) {
    const listObjects = []

    for (; i < 10; i  ) {
      listObjects.push({
        url: `/${t}/${t}-${i}`,
        name: `${t}-${i}`,
        type: t
      })
    }

    this.todos.push({
      type: t,
      listItems: listObjects
    })
  }
}
  

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

1. спасибо за ответ и не поймите это неправильно. Если вы читаете мой вопрос, я специально упоминаю, что мне нужно, чтобы это было в шаблоне, это не то, что я ищу.

Ответ №3:

Определите переменную вне обоих циклов и увеличьте ее внутри второго.

Если вы хотите, чтобы переменная была реактивной, объявите переменную в объекте данных

 data () {
  return {
    loopCounter: 0,
    todos: []
  }
}
  

Обратите внимание, что я объявил data как метод, возвращающий объект. Таким образом, все экземпляры компонента имеют свой собственный объект данных, а не совместно используемый. В вашем случае экземпляр vue не является проблемой, но в целом вы должны объявлять его как метод, а не как объект.

Редактировать:

Вы могли бы сохранить информацию о каждом элементе списка и распечатать ее оттуда вместо того, чтобы вычислять ее на месте.

Вы могли бы использовать данные для подсчета циклов, которые вы увеличиваете внутри цикла

 {{loopCounter  }}
  

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

1. Спасибо, что указали на возврат данных, но я получил эту часть, я просто взял шаблон из jsfiddle. Но как мне его увеличить?

2. Я обновил свой вопрос точным сценарием, которым он должен быть. Таким образом, это решение не будет работать.

3. Вы могли бы использовать этот activeIndex === loopCounter или вы могли бы использовать комбинированный индекс между первым циклом и вторым вместо числового activeIndex.

4. вы пробовали это? Я не могу заставить это работать так, как вы описываете. Счетчик запустит t 4001

5. Это похоже на то, что, как я думал, сработает, но счетчик начинается с 4000 (почему?), а также, что более важно: Ошибка: возможно, у вас бесконечный цикл обновления в компонентной функции рендеринга