MobX - 带有 extendObservable 的地图不重新渲染新值?

MobX - Map with extendObservable not rerending with new value?

所以在 mobx 中,当您通过 extendObservable 将新字段添加到可观察对象时,它不会重新渲染组件,而是使用可观察映射来代替,它应该获取新更改 (keys/values) 并重新渲染组件。

加载组件时,我看到在构造函数中分配了 NameLanguage 值。所以这按预期工作。完美!

问题是在使用 addYear 操作通过按钮分配下面的新字段 Year 之后,我能够提醒它的值,这意味着它在地图中,它应该重新渲染组件,但它没有。这是代码:

@observer
export default class Book extends Component {
    @observable book = asMap({});

    constructor(props){
      super(props);

      const map = this.book;
      map.set('book', {name: 'The Secret', language: 'English'});
    }

    @action addYear() {
      const year = {year: '2006'};

      const map = this.book;
      if (map.has('book')) {
        extendObservable(map.get('book'), toJS(year));
        alert(map.get('book').year); // Shows Year but does not rerender
      }
    }

    render() {
      const map = this.book;
      const book = map.has('book') && map.get('book');

      return (
        <View style={styles.wrapper}>
            <TouchableOpacity style={styles.button}
                              onPress={() => this.addYear()}>
                <Text style={styles.text}>Add Year!</Text>
            </TouchableOpacity>

            <Text>Name: {book.name}</Text>
            <Text>Language: {book.language}</Text>
            <Text>Year: {book.year}</Text>
        </View>
      )
    }
}

知道为什么在将 Year 添加到图书地图时不重新渲染组件吗?

如果你只有一张代表一本书的地图,你可以只设置年份 属性 like this:

@observer
class App extends React.Component {
  @observable book = asMap({
    name: 'The Secret', 
    language: 'English'
  });
  addYear = () => {
    this.book.set('year', '2006');
  };
  render() {
     const year = this.book.get('year');
     return <div> 
       <div>Name: {this.book.get('name')}</div>
       <div>Language: {this.book.get('language')}</div>
       {year ? <div>Published Year: {year}</div> : null}
       <button onClick={this.addYear}> Add Year </button>
     </div>;
  }
}