反应状态和 mobx - 反模式?
React states and mobx - antipattern?
问题:同时拥有mobx和react,然后利用两个react组件状态,以及来自mobx的@observer
@observable
是否是反模式?
据我所知,mobx 尝试替换反应状态,或者至少做一些非常相似的事情。
同时使用 React 组件的内部状态和 MobX 存储并不是广义上的反模式。但请考虑以下几点:
- 出于同一目的混合组件的内部状态和全局状态并不好。您最终会遇到相互冲突的状态,失去可预测性并且变得难以维护。
我相信任何可以称为 business logic 的东西都应该进入全局状态。
可以隔离到单个组件的状态可以驻留在组件本身内部,只要它不是业务逻辑的一部分,我们的组件应该只观察它们。
- 使您的子组件成为
@observer
。为什么?阅读 here(将 @connect
替换为 @observer
)
- MobX 派生是记忆化自定义 getter/selector 函数的绝佳替代品。
我不会称它为反模式,但它破坏了我最喜欢的 MobX 方面之一。使用 MobX 时,你只会处理 props。我喜欢这样,因为我永远不必担心 属性 是存在于 props 还是 state 中。自从我开始使用 MobX 以来,我从来没有遇到过需要 "state" 本地组件的情况。我发现最好将所有应用程序状态保存在商店中,将该状态作为道具传递到顶级组件中...
但是,如果您需要 "stateful" 使用 MobX 的组件,您可以这样做。
import React, { Component } from 'react';
import { action, observable } from 'mobx';
import { observer } from 'mobx-react';
@observer
export default class User extends Component {
@observable user = {
firstName: 'john',
lastName: 'lennon',
status: 'alive'
};
@action updateUserStatus(newStatus) {
this.user.status = newStatus
}
render() {
const { firstName, lastName, status } = this;
return (
<p>{firstName} {lastName} - {status}</p>
);
}
}
问题:同时拥有mobx和react,然后利用两个react组件状态,以及来自mobx的@observer
@observable
是否是反模式?
据我所知,mobx 尝试替换反应状态,或者至少做一些非常相似的事情。
同时使用 React 组件的内部状态和 MobX 存储并不是广义上的反模式。但请考虑以下几点:
- 出于同一目的混合组件的内部状态和全局状态并不好。您最终会遇到相互冲突的状态,失去可预测性并且变得难以维护。
我相信任何可以称为 business logic 的东西都应该进入全局状态。
可以隔离到单个组件的状态可以驻留在组件本身内部,只要它不是业务逻辑的一部分,我们的组件应该只观察它们。
- 使您的子组件成为
@observer
。为什么?阅读 here(将@connect
替换为@observer
) - MobX 派生是记忆化自定义 getter/selector 函数的绝佳替代品。
我不会称它为反模式,但它破坏了我最喜欢的 MobX 方面之一。使用 MobX 时,你只会处理 props。我喜欢这样,因为我永远不必担心 属性 是存在于 props 还是 state 中。自从我开始使用 MobX 以来,我从来没有遇到过需要 "state" 本地组件的情况。我发现最好将所有应用程序状态保存在商店中,将该状态作为道具传递到顶级组件中...
但是,如果您需要 "stateful" 使用 MobX 的组件,您可以这样做。
import React, { Component } from 'react';
import { action, observable } from 'mobx';
import { observer } from 'mobx-react';
@observer
export default class User extends Component {
@observable user = {
firstName: 'john',
lastName: 'lennon',
status: 'alive'
};
@action updateUserStatus(newStatus) {
this.user.status = newStatus
}
render() {
const { firstName, lastName, status } = this;
return (
<p>{firstName} {lastName} - {status}</p>
);
}
}