Вы обновляете newColor
просто отлично;проблема в том, что newStyle
(и newStyle.color
) назначается только один раз. Хотя newStyle.color
изначально ссылается на первое значение из newColor
, это не то же самое, что newStyle.color
, постоянно ссылающийся на будущие значения newColor
.
Просто измените newColor = colors[i]
вваш тайм-аут на newStyle.color = colors[i]
для обновления этого объекта. Если вы хотите, чтобы newStyle
был применен к чему-то в DOM, вам, конечно, нужно убедиться, что код также находится на своем месте.
Редактировать:
Теперь, когда выяснилось, что это React, вам понадобятся некоторые изменения. React не собирается отслеживать локальные переменные на предмет изменений и применять их в DOM. Вместо этого вы должны специально запустить обновление в React. Самый простой способ сделать это через state . Изменения в состоянии вызывают повторную визуализацию. Вы также захотите превратить ваш интервал таймера в эффект , который можно отключить, когда компонент отключен.
import React from 'react'
const { useEffect, useState } = React;
const colors = ['violet', 'indigo', 'blue', 'green', 'yellow', 'orange', 'red'];
const Rainbow = (WrappedComponent) => {
return (props) => {
const [color, setColor] = useState(0);
useEffect(() => {
const timeout = setTimeout(() => {
setColor((color + 1) % colors.length);
}, 500);
return () => clearTimeout(timeout);
}, [color]);
return (
<div style={{ color: colors[color] }}>
<h1>Hello World</h1>
<WrappedComponent {...props}/>
</div>
);
}
}
export default Rainbow