目前,我的班级是这样定义的:
type ClapWidgetProps = {
animate: boolean,
};
export class Widget extends React.Component<WidgetProps> {
@mobx.observable.ref private animate: boolean = this.props.animate || false;
这个可观察的animate
控制着小部件内部的某些动画效果。
如您所见,内部状态animate
由this.props.animate
初始化。
我想要实现的是,即使初始化后,我也希望能够通过animate
连续更改可观察的this.props.animate
的值。
更改属性后,如何让this.props.animate
覆盖可观察的animate
?
答案 0 :(得分:1)
如果需要从内部和外部组件控制动画,则需要从React生命周期方法中受益
@observer
export class Widget extends React.Component<WidgetProps> {
@observable private animate: boolean = this.props.animate || false;
toggleAnimate = () => {
this.animate = !this.animate;
}
componentDidUpdate(prevProps) {
if (prevProps.animate !== this.props.animate) {
this.animate = this.props.animate;
}
}
render() {
// call this.toggleAnimate to change animate from inside component
}
}
从外部
// some jsx
<Widget animate={this.state.animate} />
// and if outer component this.state.animate changes - it will cause a change of Widget animate prop
答案 1 :(得分:1)
MobX与stores
有关,它们是应用程序的状态。在您的示例中,您有2个动画属性来源(在Widget
组件内以及以Widget
传递给prop
的外部)不是一个好习惯。
这是设置应用程序的更好方法
class Store {
@observable animate = false;
@action
setAnimate(animate) {
this.animate = animate;
}
}
@inject('store')
class Widget extends React.Component {
toggleAnimate = () => {
const { store } = this.props;
store.setAnimate(!store.animate);
}
render() {
const { animate } = this.props.store;
// whenever animate changes in your store render method will trigger
}
}
请注意,该示例不起作用,因为您必须在应用程序的根目录级别设置Provider
。有关更多信息,请参见Provider and inject
https://github.com/mobxjs/mobx-react部分。
您可以在https://mobx.js.org/best/store.html上找到有关定义商店的更多信息。