【问题标题】:Cannot read property 'name' of undefined in Redux + Firebase无法读取 Redux + Firebase 中未定义的属性“名称”
【发布时间】:2020-02-07 08:47:31
【问题描述】:

问题是来自 Firestore 的 document 无法在 React 组件中显示。最初,我已经像这样在 Redux 中获取项目。

src/actions/index.js

export function fetchItem(id) {
  return dispatch => {
    itemsRef.doc(id).onSnapshot(doc => {
      usersRef.doc(id).onSnapshot(user => {
        statusesRef
          .where("uid","==", id)
          .onSnapshot(function(querySnapshot) {
            querySnapshot.forEach(function(snapshot) {
                const allItems = {
                  item: doc.data(),
                  user: user.data(),
                  status: snapshot.data(),
                };
                dispatch({
                  type: FETCH_ITEM,
                  payload: allItems
                });
            }
          }
      });
    });
  };
}

src/reducers/reducer_items.js

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

const initialState = {};

export default (state = initialState, action) => {
  switch (action.type) {
    case FETCH_ITEM:
      return action.payload;

    default:
      return state;
  }
};

然后我用this.props.fetchItem 获取allItems

class Item extends Component {
  componentDidMount() {
     const { id } = this,proops.match.params;
     this.props.fetchItem(id);
  }
}

render() {
   const { item } = this.props;
   console.log("item", item);
}

const mapDispatchToProps = {
  fetchItem
};

function mapStateToProps({ allItems }) {
  return { item: allItems };
}

export default connect(mapStateToProps, mapDispatchToProps)(Item);

控制台中的项目是

item:
Object
item: {name: "XXXXXXXXX", image: "XXXXXXXXXXX"}
status: {content: "XXXXXXXXX"}
user: {name: "XXXXXXXX", image: "XXXXXXXXXXXX"}

我可以成功获取item,包括项目、用户和状态。 但我无法获取儿童文档。

render() {
   const { item } = this.props;
   console.log("item", item);
   console.log("item2", item.item.name);
}

上面写着Cannot read property 'name' of undefined。但名称显示在console.log("item")

【问题讨论】:

  • 过去你从这个console.log("item", item)得到的对象
  • 在控制台中添加了item

标签: reactjs firebase redux google-cloud-firestore


【解决方案1】:

我认为这不是最佳做法,但我已使用以下代码解决了它:

const allItems = {
  ...doc.data(),
  ...user.data(),
  ...snapshot.data(),
};

【讨论】:

    猜你喜欢
    • 2021-05-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-06
    • 2022-01-22
    • 2021-11-13
    相关资源
    最近更新 更多