为什么 Mobx 6 的行为在我的两个环境中不同?
Why is Mobx 6 behavior different between my two environments?
我正在将我们的 TypeScript 代码库中的商店迁移到 Mobx 6。此商店由 React Web 组件和 Expo React Native 组件共享。
看起来像这样:
class MyStore {
value: string;
constructor() {
makeObservable(this, {value: observable});
}
}
这适用于我的 React 网络组件。
但是,当我在我的 Expo React Native 组件中使用它时,我得到了这个错误:
[MobX] Cannot apply 'observable' to 'MyStore@2.value': Field not found.
如果我在调用 makeObservable
之前将 value
初始化为 null,则一切正常。但是不喜欢我们的网络组件和移动组件之间的行为有何不同。如果我不能让它们的行为相同,这可能会成为未来错误的来源。
知道是什么导致了这种行为,为什么两种环境之间的这种行为可能不同?
它是 limitations of make(Auto)Observable
if you haven't setup your compiler with additional options 之一。因此,您的一个项目可能与另一个项目的设置不同。
TypeScript: 设置编译选项"useDefineForClassFields": true
.
Babel: 确保至少使用 7.12 版本,配置如下:
{
"plugins": [["@babel/plugin-proposal-class-properties", { "loose": false }]],
// Babel >= 7.13.0 (https://babeljs.io/docs/en/assumptions)
"assumptions": {
"setPublicClassFields": false
}
}
通常最好在构造函数中最后调用make(Auto)Observable
,and/or立即定义属性。例如,在你的情况下,只需用空字符串定义它(它更正确,因为你当前的代码无论如何都不会在 strict
模式下编译):
class MyStore {
// No need for explicit type that way
value = '';
constructor() {
makeObservable(this, {value: observable});
}
}
我正在将我们的 TypeScript 代码库中的商店迁移到 Mobx 6。此商店由 React Web 组件和 Expo React Native 组件共享。
看起来像这样:
class MyStore {
value: string;
constructor() {
makeObservable(this, {value: observable});
}
}
这适用于我的 React 网络组件。
但是,当我在我的 Expo React Native 组件中使用它时,我得到了这个错误:
[MobX] Cannot apply 'observable' to 'MyStore@2.value': Field not found.
如果我在调用 makeObservable
之前将 value
初始化为 null,则一切正常。但是不喜欢我们的网络组件和移动组件之间的行为有何不同。如果我不能让它们的行为相同,这可能会成为未来错误的来源。
知道是什么导致了这种行为,为什么两种环境之间的这种行为可能不同?
它是 limitations of make(Auto)Observable
if you haven't setup your compiler with additional options 之一。因此,您的一个项目可能与另一个项目的设置不同。
TypeScript: 设置编译选项"useDefineForClassFields": true
.
Babel: 确保至少使用 7.12 版本,配置如下:
{
"plugins": [["@babel/plugin-proposal-class-properties", { "loose": false }]],
// Babel >= 7.13.0 (https://babeljs.io/docs/en/assumptions)
"assumptions": {
"setPublicClassFields": false
}
}
通常最好在构造函数中最后调用make(Auto)Observable
,and/or立即定义属性。例如,在你的情况下,只需用空字符串定义它(它更正确,因为你当前的代码无论如何都不会在 strict
模式下编译):
class MyStore {
// No need for explicit type that way
value = '';
constructor() {
makeObservable(this, {value: observable});
}
}