开发者问题收集

React 应用程序显示无法读取未定义的属性“map”

2021-08-09
152

无法获取我的 api 数据,但我可以控制台并查看数据。 我得到的只是“TypeError:无法读取未定义的属性‘map’”。 有任何语法错误吗?

这是我的 useEffect 以及 Axios get

  const categories = useSelector((state) => state.categories);
  const dispatch = useDispatch();

  useEffect(() => {
    axios
      .get("admin/category")
      .then((res) => {
        console.log(res, "data from categories");
        dispatch({
          type: actions.GET_CATEGORIES,
          payload: res.data.categories,
        });
      })
      .catch((err) => {
        console.log(err, "error");
      });
  }, []);

映射此表中的数据

<TableBody>
 {categories.map((item, index) =>
                    {
                     return  (
                      <React.Fragment key={index}>
                        <TableRow style={{ position: "relative" }}>
                          <TableCell
                            className="contents"
                            align="left"
                            style={{
                              borderBottom: "none",
                              paddingLeft: "5%",
                              paddingBottom: "0%",
                              paddingTop: "0%",
                            }}
                          >
                            {item.name}
                          </TableCell>
3个回答

categories 最初将未定义。您可以做的一件事是将回退设置为空数组:

const categories = useSelector((state) => state.categories || []);

或者在商店内部,将初始状态设置为空数组作为一次性集中解决方案。

Majed Badawi
2021-08-09

我认为在渲染第一个组件时类别未定义。您应该按如下方式更改代码。 已添加?

 {categories?.map((item, index) =>
                    {
                     return  (
                      <React.Fragment key={index}>
                        <TableRow style={{ position: "relative" }}>
                          <TableCell
                            className="contents"
                            align="left"
                            style={{
                              borderBottom: "none",
                              paddingLeft: "5%",
                              paddingBottom: "0%",
                              paddingTop: "0%",
                            }}
                          >
                            {item.name}
                          </TableCell>
seagulls0125
2021-08-09

您的类别未定义,因此您需要在呈现时添加控件。

您可以直接控制一个:

 <TableBody>
 {categories?.map((item, index) =>
                    {
                     return  (
                      <React.Fragment key={index}>
                        <TableRow style={{ position: "relative" }}>
                          <TableCell
                            className="contents"
                            align="left"
                            style={{
                              borderBottom: "none",
                              paddingLeft: "5%",
                              paddingBottom: "0%",
                              paddingTop: "0%",
                            }}
                          >
                            {item.name}
                          </TableCell>

或者您可以使用 if else 并且可以渲染不同的东西:

 <TableBody>
         {categories && categories.length > 0 ? 
                    categories.map((item, index) =>
                            {
                             return  (
                              <React.Fragment key={index}>
                                <TableRow style={{ position: "relative" }}>
                                  <TableCell
                                    className="contents"
                                    align="left"
                                    style={{
                                      borderBottom: "none",
                                      paddingLeft: "5%",
                                      paddingBottom: "0%",
                                      paddingTop: "0%",
                                    }}
                                  >
                                    {item.name}
                                  </TableCell>
                              </TableRow>
                         </React.Fragment>
                     ) : 
                     'Categories not found'';
Okan
2021-08-09