В моем приложении Typescript есть класс, который представляет некоторые данные. Этот класс является общим для всех (оба интерфейса используют его для структурирования данных). У него есть свойство с именем items
, которое представляет собой массив чисел.
class Data {
constructor() {
this.items = [0];
}
addItem() {
this.items = [...this.items, this.items.length];
}
}
Я пытаюсь отобразить эти числа в моем компоненте, но поскольку изменение экземпляра класса не вызовет повторную визуализацию Мне нужно «принудительно выполнить рендеринг», чтобы новые значения items
отображались:
const INSTANCE = new Data();
function ItemsDisplay() {
const forceUpdate = useUpdate(); // from react-use
useEffect(() => {
const interval = setInterval(() => {
INSTANCE.addItem();
forceUpdate(); // make it work
}, 2000);
return () => clearInterval(interval);
}, []);
return (
<div>
<h1>with class:</h1>
<div>{INSTANCE.items.map(item => <span>{item}</span>)}</div>
</div>
);
}
Хотя это работает, у него есть один существенный недостаток: addItem()
- не единственная модификация, сделанная для INSTANCE
; Этот класс на самом деле имеет от 10 до 15 свойств, которые представляют разные части данных. Таким образом, выполнение forceUpdate()
, где бы ни происходила модификация, является кошмаром. Не говоря уже о том, что если этот экземпляр будет изменен вне компонента, я не смогу forceUpdate()
синхронизировать c изменение с компонентом.
Использование useState([])
для представления items
решит эту проблему, но, как я сказал, Data
имеет много свойств, так же как и некоторые функции. Это еще один кошмар.
Я хотел бы знать, каков наилучший способ рендеринга данных из экземпляра класса, без повторной обработки хаков или распаковки всего экземпляра в состояние локального компонента.
Спасибо!
Вот демонстрация Codesandbox , которая показывает различия между использованием класса и локальным состоянием.