реагировать, карта наблюдений mobx - вычисляется в компоненте рендеринга без стрельбы - PullRequest
0 голосов
/ 20 февраля 2019

У меня есть магазин с картой @observable.Данные с этой карты читаются с использованием функции @computed.

export class Postopki {
  @observable data = new Map<string, PostopekObservableType>([]);
  @observable activeId: string;

  // gets the postopek data for the current active id
  @computed get getActive(): PostopekObservableType {
    const postopek = this.getById(this.activeId);
    if (postopek) {
      return toJS(postopek);
    }
    return {
      canView: false,
      canEdit: false,
    };
  }
  ...

Затем у меня есть еще один @action, который устанавливает свойство объекта на наблюдаемой карте:

@action setCenilecId = (idCenilec: string): void => {
    const postopek = this.getActive;
    postopek.idCenilec = idCenilec;
    // updates postopek data with the new idCenilec
    this.addPostopek(this.activeId, postopek);

    console.group('setCenilecId');
    console.log('new postopek data', postopek);
    console.log('postopek observable', this.getActive);
    console.groupEnd();
  };

Наконец, я использую свои вычисления в рендере компонента:

@inject('postopki')
@observer
class PostopekView extends Component<any, State> {
  render() {
    const postopek = this.props.postopki.getActive;
    console.log('Postopek view:', postopek);

    return (
      <StyledDiv>
        ...
      </StyledDiv>
    );
  }
}

При вызове setCenilecId я получаю обновленные данные, записанные в консоль, используя вычисленные значения getActive.

Нофункция рендеринга для PostopekView не запускается, даже если возвращаемое значение для вычисляемого отличается.

Edit - это родительский компонент для postopekView Component.

@inject('postopki')
@observer
class Postopek extends Component<any, State> {
  state: State = {
    isLoading: true,
    hasError: false,
    errorMessage: '',
  };

  // gets initial postopek data based on the id from props when component first mounts
  componentDidMount = async (): Promise<void> => {
    ...
  };

  // updates postopek data when a new id is passed from router
  componentDidUpdate = async (prevProps: any): Promise<void> => {
   ...
  };

  render() {
    const { isLoading, hasError, errorMessage } = this.state;

    return (
      <WithStatus isLoading={isLoading} hasError={hasError} errorMessage={errorMessage}>
        <PostopekView />
      </WithStatus>
    );
  }
}

export default withRouter(Postopek);

Чтоя делаю не так?

1 Ответ

0 голосов
/ 20 февраля 2019

Нашел причину, по которой вычисленные не сработали ...

У меня был этот метод, который я вызывал в @computed:

  @action getById = (id: string): PostopekObservableType | undefined => {
    const postopek = (this as any).data.get(id);
    return postopek;
  };

После того, как я ссылался на наблюдаемое вметод напрямую:

@computed get getActive(): PostopekObservableType {
    const postopek = this.data.get(this.activeId);
    if (postopek) {
      return toJS(postopek);
    }
    return {
      canView: false,
      canEdit: false,
    };
  }

Все обновляется, как и ожидалось.

Не знаю, почему ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...