首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么Mobx声称我试图改变一个可观察到的值?

为什么Mobx声称我试图改变一个可观察到的值?
EN

Stack Overflow用户
提问于 2020-12-12 01:21:25
回答 1查看 758关注 0票数 1

每次我尝试访问mobx类实例的计算值时,我都会得到

代码语言:javascript
复制
[MobX] Since strict-mode is enabled, changing (observed) observable values without using an action is not allowed. Tried to modify: VoiceSettings@3.voices

我创建了一个类似这样的类:

代码语言:javascript
复制
import {action, computed, makeObservable, observable} from "mobx"

export default class VoiceSettings {
    @observable language: Language = 'en';
    @observable speaker?: Voice;
    @observable voices: Voice[] = [];

    constructor() {
        makeObservable(this);
        this.getAvailableVoices();
    }

    async getAvailableVoices() {
        this.voices = await Speech.getAvailableVoicesAsync();
        return this.voices;
    }

    @computed
    get speakers(): string[] {
        return this.voices
            .filter(voice => voice.language.startsWith(this.language))
            .map(voice => voice.name)
    }

    @action
    setLanguage(language: Language) {
        this.language = language;
    }
}

export const voiceSettings = new VoiceSettings();

这种情况似乎只有在我打电话给voiceSettings.speakers时才会发生。

更新我的错误。被错误信息绊倒了。我在代码中的其他地方调用了voice. getAvailableVoices()方法

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-12-12 03:31:15

问题是,只有对可观测数据的同步更改才能在操作中工作,因此当Speech.getAvailableVoicesAsync()已经解决并分配给this.voices时,从技术上讲,它不再存在于操作中。

如何创建异步操作是在文件中讨论。其中一种方法就是使用runInAction

代码语言:javascript
复制
async getAvailableVoices() {
    const voices = await Speech.getAvailableVoicesAsync();

    runInAction(() => {
        this.voices = voices;
    });

    return this.voices;
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65260638

复制
相关文章

相似问题

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