首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用Mobx误解getDerivedStateFromProps

使用Mobx误解getDerivedStateFromProps
EN

Stack Overflow用户
提问于 2019-04-03 17:08:19
回答 1查看 416关注 0票数 2

我对getDerivedStateFromProps如何与Mobx可观察对象一起工作有一些误解。我知道,Mobx会对“读取”属性(通过"dotting into")、可跟踪函数等做出反应。

例如,我使用可观察对象进行存储。

代码语言:javascript
复制
class SomeStore {
    @observable
    status = {
        state: 'NOT_INITED',
    };

    @action
    async setStatusState = () => {
        this.status.state = 'STARTED';

        await something();
        this.status.state = 'ENDED';
    }

}

接下来,我有注入的组件

代码语言:javascript
复制
@inject('someStore')
@observer
export default class SomeInjectedComponent extends Component {
    render() {
        return (
            <SomeComponent
                status={this.props.someStore.status}    
            />
        );
    }
}

End I已结束组件

代码语言:javascript
复制
@observer
export default class SomeComponent extends Component {
    state = { isLoading: true }

    static getDerivedStateFromProps(props, state) {
        console.log(props.status.state);

        if (props.status.state === 'SUCCESS') {
            return { isLoading: false }
        }

        return null;
    }

    render() {
        if (!this.state.isLoading) {
           return null;`enter code here`
        }

        return <div>Loading</div>
    }
}

问题是,在console.log(props.status.state)中我只看到NOT_INITEDSTARTED。但是ENDED没有出现。

我猜是因为我在render方法中没有this.props.status.state。如果我将它添加到render (甚至只有console.log)中,所有的东西都可以工作。

我应该怎么做才能看到getDerivedStateFromProps中的更改

谢谢。

EN

回答 1

Stack Overflow用户

发布于 2019-04-04 02:33:10

也许你应该在你的商店里添加"isLoading“标志。它看起来像这样:

代码语言:javascript
复制
class SomeStore {
    @observable
    status = {
        isLoading: false,
        state: 'NOT_INITED',
    };

    @action
    async setStatusState = () => {
        this.status.state = 'STARTED';
        this.status.isLoading = true;

        await something();
        this.status.state = 'ENDED';
        this.status.isLoading = false;
    }

}

您的组件

代码语言:javascript
复制
@observer
export default class SomeComponent extends Component {

    render() {
        const { isLoading } = this.props.status
        if (!isLoading) {
           return null;
        }

        return <div>Loading</div>
    }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55491280

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档