【问题标题】:observer mobx-react seems not working in React观察者 mobx-react 似乎在 React 中不起作用
【发布时间】:2020-04-13 11:28:34
【问题描述】:

我是 React 和 mobx 的初学者。根据我的设计,点击按钮后应该使用观察者、可观察模块更新数据。即使控制台日志显示每次单击按钮时更改的电子邮件,视图也不会更改。你能给我什么建议吗?

import Link from 'next/link';
import React, { useState } from 'react';
import ProfileImage from '../components/ProfileImage';
import faker from 'faker';
import { decorate, observable } from 'mobx';
import { observer } from "mobx-react"


class Data {
    avartar = faker.image.avatar();
    email = faker.internet.email();
    name = {
        firstName: faker.name.firstName(),
        lastName: faker.name.lastName(),
    };
}

decorate(Data, {
    avartar: observable,
    email: observable,
    name: observable,
})

class Index extends React.Component {
    data = new Data();

    generate = () => {
        this.data.email = faker.internet.email();
        this.data.name.firstName = faker.name.firstName();
        this.data.avartar = faker.image.avatar();
        console.log("check: ", this.data.email);
    }

    render() {
        return (
            <>
                <h1>Index</h1>
                <button className="btn btn-primary" onClick={this.generate}>Change</button>
                <div>
                    <dl className="row">
                        <dt className="col-sm-3">Avatar</dt>
                        <dd className="col-sm-9"><img src={this.data.avartar} /></dd>
                        <dt className="col-sm-3">Name</dt>
                        <dd className="col-sm-9">{this.data.name.firstName} {this.data.name.lastName}</dd>
                        <dt className="col-sm-3">Email</dt>
                        <dd className="col-sm-9">{this.data.email}</dd>
                    </dl>
                </div>
            </>);
    }
}

Index = observer(Index);
export default Index;

【问题讨论】:

    标签: reactjs mobx


    【解决方案1】:

    您还需要使用@observable 装饰Index.data 属性。

    @observer
    class Index extends React.Component {
        @observable data = new Data();
    }
    
    // Or non-decorator syntax:
    
    Index = observer(decorate(Index, { data: observable }));
    

    【讨论】:

    • 感谢您的评论。尝试使用装饰器时,出现另一个错误'当前未启用对实验语法'decorators-legacy'的支持(25:1):'我在这里提到(stackoverflow.com/questions/52262084/…),所以我使用了后来的一个。我尝试使用这个'Index = observer(decorate(Index, { data: observable}));'但它是一样的。
    • 'decorators-legacy' 错误从何而来?通天塔?
    • 你是对的!我将搜索 Babel 设置以使用装饰器。然后让你知道结果。
    猜你喜欢
    • 2021-05-08
    • 2020-08-24
    • 2020-05-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-07
    • 2021-01-29
    相关资源
    最近更新 更多