Я пытаюсь использовать запись из Immutable.js как состояние в компоненте класса. Вот код:
interface INetworkDisplayAreaState {
layers: List<Layer>;
translate: { x: number, y: number };
scale: number;
}
const NetworkDisplayAreaStateRecord = Record<INetworkDisplayAreaState>({
layers: List(),
translate: { x: 0, y: 0 },
scale: 1
});
class NetworkDisplayAreaState extends NetworkDisplayAreaStateRecord {
constructor(state: Partial<INetworkDisplayAreaState> = {}) {
super(state);
}
}
export default class NetworkDisplayArea
extends React.Component<INetworkDisplayAreaProps, NetworkDisplayAreaState> {
constructor(props: INetworkDisplayAreaProps) {
super(props);
this.state = new NetworkDisplayAreaStateRecord({ layers: props.layers });
}
static getDerivedStateFromProps(nextProps: INetworkDisplayAreaProps, prevState: NetworkDisplayAreaState) {
return prevState.set('layers', nextProps.layers);
}
// Other component methods go here.
}
Когда компонент только что создан, он работает нормально, но когда getDerivedStateFromProps вызывается во второй раз, prevState имеет тип Object, а не мой класс, и не имеет прототипа, поэтому set не определен. Я попытался отладить эту проблему и обнаружил, что во внутреннем устройстве React он объединяет состояния для мемоизации с использованием Object.assign, и в этот момент все прототипы удаляются.
Есть ли способ, как я все еще могу использовать запись в качестве состояния компонента? Или мне нужно вместо этого использовать простой объект JS?



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Я думаю, вам не повезло с использованием Record в качестве объекта состояния верхнего уровня, как вы видели. Но вы, вероятно, можете иметь состояние React, содержащее одно поле, которое является записью и содержит все ваши фактические данные.
Спасибо, все работает так, как ожидалось. Выглядит немного неуклюже, но в моем случае все же лучше, чем простой объект JS.