Невозможно установить состояние внутри Firestore добавить обещание - PullRequest
0 голосов
/ 15 февраля 2020

В убыток здесь. Я пробовал много вариантов этого, но в основном я пытаюсь установить состояние uploadRefId для идентификатора, возвращаемого после создания новой коллекции. Я вижу, что идентификатор генерируется с помощью console.log, но функция setState, похоже, не работает в рамках этого обещания (uploadRefId имеет значение null)?

const [uploadRefId, setUploadRefId] = React.useState(null);

let uploadRefCol = await firestore.collection("uploads");
await uploadRefCol.add(uploadData)
  .then( (uploadDataRef) => {
    console.log('uploadDataRef.id: ', uploadDataRef.id);
    setUploadRefId(uploadDataRef.id);
    console.log('uploadRefId', uploadRefId);
  })
  .catch( (error) => {
    console.log('Error!', error)
});

Ответы [ 2 ]

0 голосов
/ 15 февраля 2020
setUploadRefId(uploadDataRef.id);

Выше находится асинхронное c состояние обновления, поэтому, если вы сразу используете значение состояния, тогда значение еще не установлено, и вы пытаетесь получить доступ к значению

  useEffect(() => {
 console.log('uploadRefId', uploadRefId);
})

Таким образом, вышеупомянутый эффект использования запускается при каждом обновлении в состоянии, в котором вы можете следить за любым изменением состояния

Образец изолированной программной среды кода

0 голосов
/ 15 февраля 2020

Изменение состояния может быть забавным на протяжении всего жизненного цикла React.

Если ваш uploadDataRef.id имеет тип string, посмотрите, поможет ли это:

const [uploadRefId, setUploadRefId] = React.useState('');

Если это значение цифры c, посмотрите, работает ли setUploadRefId с этим:

const [uploadRefId, setUploadRefId] = React.useState(0);

Это не может быть решением, скажем так, но может привести вас к одному.

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