MobX React Native не выполняет повторный рендеринг

#javascript #react-native #mobx-react

#javascript #react-native #mobx-реагировать

Вопрос:

Я создаю сброс пароля с помощью react native и MobX, у меня возникли небольшие проблемы с сбросом состояния ошибки. Я пробовал несколько решений, но, похоже, ни одно из них не работает, onChangeText для ввода, похоже, работает, но мое логическое значение не работает для обновления пользовательского интерфейса, я вижу, что магазин выходит из системы, и это кажется правильным, но пользовательский интерфейс, похоже, не добавляет сообщение об ошибке, которое я также используюиспользование навигации react native:

 navigation.navigate('Forgot');
  

и вот мой класс:

 import React from 'react';
import { action, observable } from 'mobx';

/**
 *
 */
class PasswordResetStore {
  @observable email = '';
  @observable emailError = false;

  @action setEmail = (value) => {
    console.log(this.emailError);
    this.emailError = true;
    this.email.value = value;
  };
}

const passwordResetStore = new PasswordResetStore();
export const PasswordResetContext = React.createContext(passwordResetStore);
  

и вот мой компонент:

 import React, { useContext } from 'react';
import { View } from 'react-native';
import { Text, Input, Button } from 'react-native-elements';

import { observer } from 'mobx-react';

import { PasswordResetContext } from '../store/PasswordResetStore';

const PasswordReset = observer(() => {
  const store = useContext(PasswordResetContext);

  return (
    <View>
      <View>
        <Text h3>Reset your password</Text>
      </View>

      <View>
        <Text>Enter the email your used to sign up</Text>
        <Input
          onChangeText={store.setEmail}
          value={store.email.value}
          placeholder="Email"
          keyboardType={'email-address'}
          autoFocus={true}
          autoCorrect={false}
          maxLength={256}
          autoCapitalize={'none'}
          errorMessage={store.emailError ? 'email not found' : ''}
        />
        {/*<Button onPress={store.onResetPassword} title="Search" />*/}
      </View>
    </View>
  );
});

export default PasswordReset;
  

Спасибо

Начальная загрузка (где вы видите true, я должен видеть ошибку проверки) [1]: https://i.stack.imgur.com/HYcAy.png

Обновлено: добавлен сброс, но по-прежнему не отображаются правильные логические значения:

   useEffect(() => {
    return () => {
      store.reset();
    };
  }, []);
  
   @action reset = () => {
    this.emailError = false;
  };
  

Комментарии:

1. Намеренно ли кнопка в закомментирована? Я не вижу ничего, что должно сбросить хранилище. Также я не вижу нигде определенного [store.]onResetPassword .

2. Да, это сделано специально для целей этого поста

Ответ №1:

Если вы использовали MobX 6, то теперь вам нужно использовать makeObservable метод внутри конструктора для достижения той же функциональности с декораторами, что и с MobX 5 раньше:

 import { makeObservable } from "mobx"

class PasswordResetStore {
  @observable email = '';
  @observable emailError = false;

  constructor() {
    // Just call it here
    makeObservable(this);
  }

  @action setEmail = (value) => {
    console.log(this.emailError);
    this.emailError = true;
    this.email.value = value;
  };
}
  

Хотя есть новая вещь, которая, вероятно, позволит вам полностью отказаться от декораторов, makeAutoObservable :

 import { makeAutoObservable } from "mobx"

class PasswordResetStore {
  // Don't need decorators now
  email = '';
  emailError = false;

  constructor() {
    // Just call it here
    makeAutoObservable (this);
  }

  setEmail = (value) => {
    console.log(this.emailError);
    this.emailError = true;
    this.email.value = value;
  };
}
  

Больше информации здесь
https://mobx.js.org/migrating-from-4-or-5.html и https://mobx.js.org/react-integration.html

Комментарии:

1. Это работает! Забавно, клянусь, я пробовал этот метод раньше, вероятно, я делал что-то еще не так. Большое вам спасибо!

2. Второй пример работает без @’s! Также кажется, что я не могу выполнить сброс в конструкторе, но использование размонтированного хука в useEffect и вызов его там работает.

3. Я получаю предупреждение: [MobX] Поскольку включен строгий режим, изменение (наблюдаемых) наблюдаемых значений без использования действия не допускается. Пытался изменить: PasswordResetStore@1.emailError рассмотрю это, возможно, потому, что у меня включен @babel/plugin-proposal-decorators в моей конфигурации babel.

4. В MobX @ 6 строгий режим включен по умолчанию, возможно, вам потребуется настроить enforceActions флаг. Проверьте пункт 6 из руководства по миграции!

5. configure({enforceActions: ‘never’ }); в моем приложении js подавил предупреждение. Еще раз спасибо!