javascript - 来自 action 和 reducer 的 Redux 状态未显示在 mapStateToProps 中
问题描述
我有一个名为 menu 的操作文件,它使用 axios 从后端 API 获取 JSON 数据。然后我有在获取数据的 MainMenu.js 文件中调用的减速器。所有数据都显示在 Redux 开发工具中。但是我只能访问我在 intitialState 中的数据。应该有一个包含三个项目的数组,但它只显示 intitialState 中的第一个。当我尝试 console.log 时,来自减速器的数据没有显示出来。所以很明显我无法将它呈现给 DOM。
动作/menu.js
import { ADD_PRODUCT, GET_PRODUCTS, GET_PRODUCT } from './types';
import axios from 'axios';
export const getProducts = () => (dispatch) => {
axios
.get('http://localhost:8080/menu')
.then((response) => {
// console.log(response);
const data = response.data;
dispatch({
type: GET_PRODUCTS,
payload: { data },
});
})
.catch((err) => {
console.log(err);
});
};
export const getProduct = (product) => (dispatch) => {
axios
.get(`http://localhost:8080/menu/${product}`)
.then((response) => {
// console.log(response);
const data = response.data;
dispatch({
type: GET_PRODUCT,
payload: { data },
});
})
.catch((err) => {
console.log(err);
});
};
减速器/index.js
import { combineReducers } from 'redux';
import menu from './menu';
export default combineReducers({ menu });
减速器/menu.js
import { GET_PRODUCTS, GET_PRODUCT } from '../actions/types';
const intitialState = [
{
test: 'Test',
},
];
export default function (state = intitialState, action) {
const { type, payload } = action;
switch (type) {
case GET_PRODUCTS:
return [...state, payload];
case GET_PRODUCT:
return [...state, payload];
default:
return [...state];
}
}
组件/MainMenu.js
import React, { Fragment, useEffect } from 'react';
import { connect } from 'react-redux';
import { getProducts, getProduct } from '../actions/menu';
const MainMenu = ({ getProducts, getProduct, menu }) => {
useEffect(() => {
getProducts();
getProduct('b4bc2e28-21a3-47ea-ba3b-6bad40b35504');
console.log(menu);
}, []);
return <Fragment></Fragment>;
};
const mapStateToProps = (state) => ({
menu: state,
});
export default connect(mapStateToProps, { getProducts, getProduct })(MainMenu);
解决方案
我使用三元运算符创建了一个可行的解决方案。首先检查数组中的所有元素是否已加载。如果它们没有全部加载,则会显示一个数据未加载的 div。否则,数据将呈现给 DOM。
import React, { Fragment, useEffect } from 'react';
import { connect } from 'react-redux';
import { getProducts, getProduct } from '../actions/menu';
const MainMenu = ({ getProducts, getProduct, menu }) => {
useEffect(() => {
getProducts();
getProduct('b4bc2e28-21a3-47ea-ba3b-6bad40b35504');
}, []);
if (menu.length <= 2) {
console.log('Data Not Loaded');
} else {
console.log('Data', menu[2].data.name);
}
return (
<Fragment>
<div>{menu.length <= 2 ? <div>Data not loaded</div> : <div>{menu[2].data.name}</div>}</div>
<div>
{menu.length <= 2 ? (
<div>Data not loaded</div>
) : (
<div>
{menu[1].data.map((food) => (
<div>{food.name}</div>
))}
</div>
)}
</div>
</Fragment>
);
};
const mapStateToProps = (state) => ({
menu: state.menu,
});
export default connect(mapStateToProps, { getProducts, getProduct })(MainMenu);
推荐阅读
- php - 即使填写了表格,也会抛出错误?
- php - 如何使用 laravel 数据表将参数传递给控制器?
- docker - 如何让 Jenkins 代理从 Artifactory 中提取其 Docker 映像?
- javascript - 来自 json 文件的图像未显示在网站上
- linux - Xinput 为我生成随机事件
- android - 小吃吧从右到左(自定义snackBar) Kotlin
- css - 有没有办法定位 img 标签对象位置 x 和 y?
- javascript - React-query / React-router dom 问题
- r - 包含数据的单个值的箱线图
- matlab - lratiotest 关于对数似然值的警告