Другим вариантом является использование itertools.cycle
>>> import itertools
>>> notes = ["a", "a#", "b", "c", "c#", "d", "e", "f", "f#", "g", "g#"]
>>> frets = range(21)
>>> for note, fret in itertools.izip(itertools.cycle(notes), frets):
print ("[%s, %d]" %(note, fret))
[a, 0]
[a#, 1]
[b, 2]
[c, 3]
[c#, 4]
[d, 5]
[e, 6]
[f, 7]
[f#, 8]
[g, 9]
[g#, 10]
[a, 11]
[a#, 12]
[b, 13]
[c, 14]
[c#, 15]
[d, 16]
[e, 17]
[f, 18]
[f#, 19]
[g, 20]
После перепроверки вашего кода я обнаружил, что проблема была вызвана []
в useEffect
, вы должны удалить его, но это вызовет еще одну проблему - props.onResize
будет вызываться в каждом кадре для решения этой задачи EventListener
Другой ответ немного запутан - то, что вы делаете, хорошо. Когда он говорит, что не вызывайте хуки изнутри, это означает, что не вызывайте реальный API условно или из циклов, например условно определяя useEffect
или useState
.
Ваша проблема связана с пустым массивом, который вы передаете эффекту в Observer.js, поскольку он пустой, эффект никогда не обновляется, поэтому замыкание устарело, так что когда функция onResize
вызывает setState
, [ 114] значение всегда будет начальным значением нуля.
Вам необходимо, чтобы useEffect
зависело от чего-либо, чтобы при обновлении компонента он очищал предыдущий эффект и прикреплял новую версию функции onResize
к ResizeObserver.
Я немного поэкспериментировал с вашей песочницей: https://codesandbox.io/s/x9z7k245lq?fontsize=14
Теперь он передает состояние счетчика в компонент Observer. и эффект будет запускаться каждый раз при изменении счетчика. Дело в том, что я также добавил несколько ссылок в индекс, чтобы отслеживать высоту / ширину, чтобы состояние не всегда обновлялось, иначе оно будет бесконечно зацикливаться. Я думаю, вы можете думать об этом как shouldComponentUpdate
.
Нужно некоторое время, чтобы правильно подумать. Если вы хотите прочитать хорошую статью о хуках и избежать некоторых ловушек, касающихся пустых массивов и устаревших замыканий, проверьте это: https://overreacted.io/making-setinterval-declarative-with-react-hooks/ [119 ]