Ошибка рендеринга функционального компонента response-redux при удалении данных из firestore (useFirestoreConnect) - PullRequest
0 голосов
/ 09 марта 2020

Мой ArticleList компонент успешно получает и отображает список статей пользователя из firestore при первой загрузке приложения. Пользователь может нажать кнопку «Удалить статью», которая успешно удаляет статью из вложенной коллекции в firestore, но вызывает ошибку при рендеринге компонента реагирования, который, похоже, все еще пытается отобразить только что удаленную статью и теперь ноль. Есть ли что-то еще, что я могу сделать, чтобы мой реагирующий компонент непрерывно слушал данные пожарного депо? Если возможно, я бы хотел оставить этот функциональный компонент и использовать хуки, а не делать его классом, но я все еще учусь, как использовать реагирующие хуки и поэтому немного борюсь.

ArticleList компонент :

const ArticleList = (props) => {
const firestore = useFirestore();
const userId = props.auth.uid;
useFirestoreConnect([
{
  collection: 'users',
  doc: userId,
  subcollections: [{collection: 'articles'}],
  storeAs: userId + '::articles'
}
]);
const myArticles = useSelector(state => state.firestore.data[`${userId}::articles`]);
const dispatch = useDispatch();
const removeArticle = useCallback(
articleId => dispatch(removeArticleFromFirebase({ firestore }, articleId)),
[firestore]
);
if (props.auth.uid) {
return(
  <div>
    <h3>My Articles</h3>
    <p>Currently signed in: {props.auth.email}</p>
    <br/>
    {myArticles ? (
        Object.keys(myArticles).map(articleId => {
          let article = myArticles[articleId];
          let articleInformation = '';
          if (articleId === props.currentPaperId) {
            articleInformation =
              <div>
                <p>{article.year}</p>   
                <p>{article.description}</p>
                <a target="_blank" href={article.downloadUrl}><button className='waves-effect waves-light btn-small'>See article</button></a>
                <button className='waves-effect waves-light btn-small' onClick={() => {removeArticle(articleId);}}>Remove from My Articles</button>
              </div>;
          }
          let authorName = '';
          if (article.author) {
            authorName = ` by ${article.author}`;
          }
          if (article) {
            return <span key={articleId}>
              <li onClick={() => {dispatch(selectArticle(articleId));}}>
                <em>{article.title}</em>{authorName}
              </li>{articleInformation}
            </span>;
          } else {
            return null;
          }
        })
      ) : (
        <h4>No articles yet</h4>
      )
    }
  </div>
);
} else {
  return null;
}
};
const mapStateToProps = (state) => {
  return {
    currentPaperId: state.currentPaperId,
    auth: state.firebase.auth
  };
};
export default compose(connect(mapStateToProps))(ArticleList);

И действие removeArticleFromFirebase:

export const removeArticleFromFirebase = ({ firestore }, id) => {
return (dispatch, getState) => {
const userId = getState().firebase.auth.uid;
firestore
  .collection('users')
  .doc(userId)
  .collection('articles')
  .doc(id)
  .delete()
  .then(() => {
    console.log('Deleted article from firestore: ', id);
    dispatch({ type: 'REMOVE_ARTICLE', id });
  })
  .catch(err => {
    console.log('Error: ', err);
  });
};
}

Я попытался добавить useState и useEffect в ArticleList следующим образом (и попытался получить оператор возврата компонента сопоставляется через myArticlesState вместо myArticles), но безуспешно:

const [myArticlesState, setMyArticlesState] = useState(myArticles);
useEffect(() => {
setMyArticlesState(myArticles);
}, [myArticles]);

Примечание: у меня нет в настоящее время этот список статей находится в общем состоянии приложения / избыточность магазин / реквизит на всех. Это то, о чем я думал в следующий раз, но я решил сначала опубликовать свой вопрос на случай, если я смогу просто использовать хуки в этом компоненте. Никаким другим компонентам / частям приложения не требуется доступ к этому конкретному списку.

Ошибки консоли: изображение ошибки 1 изображение ошибки 2 Репозиторий Github: https://github.com/jpremmel/yarp2.0

Ответы [ 2 ]

0 голосов
/ 09 марта 2020

Трудно увидеть, что происходит, но кажется, что вы пытаетесь использовать свойство для несуществующего объекта. Поэтому проверка этих свойств должна помочь решить эту проблему.

Можете ли вы использовать следующий код в качестве вашего ArticleList?

const ArticleList = (props) => {
  const firestore = useFirestore();
  const userId = props.auth.uid;

  useFirestoreConnect([{
    collection: 'users',
    doc: userId,
    subcollections: [{ collection: 'articles' }],
    storeAs: userId + '::articles'
  }]);

  const myArticles = useSelector(state => state.firestore.data[`${userId}::articles`]);
  const dispatch = useDispatch();
  const removeArticle = useCallback(articleId => dispatch(removeArticleFromFirebase({ firestore }, articleId)), [firestore]);

  if (props.auth.uid) {
    return (
      <div>
        <h3>My Articles</h3>
        <p>Currently signed in: {props.auth.email}</p>
        <br />
        {myArticles ? (
          Object.keys(myArticles).map(articleId => {
            let article = myArticles[articleId];
            let articleInformation = '';

            if (article) {
              if (
                articleId === props.currentPaperId &&
                article.hasOwnProperty('year') &&
                article.hasOwnProperty('description') &&
                article.hasOwnProperty('downloadUrl')
              ) {
                articleInformation =
                  <div>
                    <p>{article.year}</p>
                    <p>{article.description}</p>
                    <a target="_blank" href={article.downloadUrl}><button className='waves-effect waves-light btn-small'>See article</button></a>
                    <button className='waves-effect waves-light btn-small' onClick={() => { removeArticle(articleId); }}>Remove from My Articles</button>
                  </div>;
              }

              let authorName = '';
              if (article.hasOwnProperty('author') && article.author) {
                authorName = ` by ${article.author}`;
              }

              if (article.hasOwnProperty('title') && article.title) {
                return <span key={articleId}>
                  <li onClick={() => { dispatch(selectArticle(articleId)); }}>
                    <em>{article.title}</em>{authorName}
                  </li>{articleInformation}
                </span>;
              } else {
                return null;
              }
            }
          })
        ) : (
            <h4>No articles yet</h4>
          )
        }
      </div>
    );
  } else {
    return null;
  }
};
const mapStateToProps = (state) => {
  return {
    currentPaperId: state.currentPaperId,
    auth: state.firebase.auth
  };
};
export default compose(connect(mapStateToProps))(ArticleList);
0 голосов
/ 09 марта 2020

Можете ли вы показать нам ошибку? Я думаю, что это состояние не является массивом после того, как вы удалите свои данные, просто инициализируйте свое состояние пустым массивом, например так:

Const= [articlesdata,setArticlesData]=useState([]) 

И оставьте useEffect, как есть

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