Невозможно установить свойства undefined при деструктурировании функционального свойства

#reactjs #typescript #mobx #destructuring #object-destructuring

#reactjs #typescript #mobx #деструктурирование #объект-деструктурирование

Вопрос:

Проблема, с которой я сталкиваюсь, не требует, так сказать, исправления, поэтому мне любопытно, почему эта функциональность меняется. Этот код написан на Typescript, и я также использую Mobx.

У меня есть состояние с именем GlobalPageState со свойством selectedTab и функцией для установки этого свойства setSelectedTab

 export default GlobalPageState extends State {
 @observable
 public selectedTab = string;

 @action
 public setSelectedTab(selectedTab: PageTab) {
  this.selectedTab = selectedTab;
 }
}
 

в моем компоненте react я деструктурировал эти свойства и ссылался на них как на таковые:

 const { selectedTab, setSelectedTab } = GlobalPageState

const onTabSelect = (newTab: string) => {
 setSelectedTab(newTab)
} 
 

Это выдает ошибку, что я не могу установить свойства undefined . Однако это работает:

 const { selectedTab } = GlobalPageState

const onTabSelect = (newTab: string) => {
 GlobalPageState.setSelectedTab(newTab)
}
 

Почему это так, если предположить, что все остальное останется прежним? Изменяет ли деструктурирование вызова функции в этом случае каким-либо образом его функциональность, т.Е. Ссылки? Не показано множество других функций и свойств в GlobalPageState, которые используются, и все они отлично работают при деструктурировании таким образом, поэтому я не уверен, почему этот вызов будет другим. Спасибо!

Ответ №1:

По сути, вам просто нужно прочитать, как this это работает в Javascript https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/this

tl; dr: ваша функция теряет контекст, когда вы присваиваете ее переменной, а затем вызываете без точки, например class.method()

Что касается MobX, вы также можете использовать @action.bound , хотя я бы рекомендовал придерживаться функций со стрелками, потому что это более «родной» способ работы с JS. Также обычно лучше определять все методы (действия) открытого класса как функции со стрелками, таким образом, вам не нужно беспокоиться о том, разрушаете вы их или нет, вы можете вызывать их в любом случае.

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

1. Отлично! Чтение этой документации сделало эту функциональность совершенно осмысленной. Спасибо!