Не могу получить описание пользователя в Redux + Firebase - PullRequest
2 голосов
/ 17 января 2020

Хотя я успешно выбрал users и profiles, но я не знаю, почему возникает эта ошибка ниже:

Не удается прочитать свойство 'content' из неопределенного

{content: "Hello world", status: 2}

Изначально я использую Firestore и на этот раз получаю 2 документа из разных коллекций, users и profiles.

избыточный код:

export function fetchUser(id) {
  return dispatch => {
    usersRef
      .doc(id)
      .get()
      .then(doc => {
        profilesRef
          .where("uid", "==", id)
          .where("status", "==", doc.data().current_status)
          .get()
          .then(function(querySnapshot) {
            querySnapshot.forEach(function(snapshot) {
              const profileItems = { ...doc.data(), profiles: snapshot.data() };
              dispatch({
                type: FETCH_USER,
                payload: profileItems
              });
            });
          });
      });
  };
}

В контейнере:

import { FETCH_USER } from "../actions";

const initialState = {};

export default (state = initialState, action) => {
  switch (action.type) {
    console.log("action", action.payload)
    // successfully fetched, user info and profiles: profiles info
    case FETCH_USER:
      return action.payload;

    default:
      return state;
  }
};

В поле зрения:

function mapStateToProps({ users }) {
  console.log("content", user.profiles.content)
  // Cannot read property 'content' of undefined

  return { user: users, profiles: user.profiles };
}

файл редуктора:

import { createStore, applyMiddleware, combineReducers } from "redux";
import UsersReducer from "./reducer_users.js";

const rootReducer = combineReducers({
  users: UsersReducer,
});

const store = createStore(rootReducer, applyMiddleware(reduxThunk));
export default store;

Ответы [ 2 ]

0 голосов
/ 18 января 2020

Я думаю, что это не лучшая практика, но я решил так:

от:

querySnapshot.forEach(function(snapshot) {
  const profileItems = { ...doc.data(), profiles: snapshot.data() };
  dispatch({
    type: FETCH_USER,
    payload: profileItems
  });
});

до:

querySnapshot.forEach(function(snapshot) {
  const userItems = { ...doc.data(), ...snapshot.data() };
  dispatch({
    type: FETCH_USER,
    payload: userItems
  });
});

Я могу получить контент как {user.content}.

0 голосов
/ 17 января 2020

Здесь вы ошибаетесь, обращаясь к пользователю, а не к пользователям

function mapStateToProps({ users , content }) {

  console.log("content", user.profiles.content) // change user to users 
 console.log("content",content) // you can directly access content here

  return { user: users, profiles: user.profiles };
}

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

добавить еще один тип FETCH_USER_COMPLETE

import { FETCH_USER } from "../actions";

const initialState = {
  content : '',
  users : ''
};

export default (state = initialState, action) => {
  switch (action.type) {
    console.log("action", action.payload)
    // successfully fetched, user info and profiles: profiles info
    case FETCH_USER:
      return { ...state , action.payload };

 case FETCH_USER_COMPLETE :
      return { ...state , users : action.payload.users , content : action.payload.users.profiles.content };

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