我是React和Redux的新手,并且一直在关注Redux官方文档Todo List示例https://redux.js.org/basics/example,并且最近更改了我的代码以遵循表示性/容器组件的结构。我尝试了许多不同的方法来移动API调用,但是通常状态下的weights对象显示为未定义(可能是因为它试图在进行实际的API调用之前使用,但我不知道如何从现在的位置更改API调用。)>
以下是文件:
actions / index.js
import axios from 'axios'; export const getWeights = () => dispatch => { axios.get('/api/weights') .then(res => dispatch({ type: 'GET_WEIGHTS', payload: res.data }) ) } export const setShownCategory = category => ({ type: 'SET_SHOWN_CATEGORY', category }) export const Categories = { SHOW_ALL: 'SHOW_ALL', SHOW_ACCESSORIES: 'SHOW_ACCESSORIES', SHOW_BARBELLS: 'SHOW_BARBELLS', SHOW_DUMBBELLS: 'SHOW_DUMBBELLS', SHOW_PLATES: 'SHOW_PLATES', SHOW_RACKS: 'SHOW_RACKS', SHOW_OTHER: 'SHOW_OTHER' }
reducers / weights.js
const initialState = {weights: []} export default function(state = initialState, action) { switch (action.type) { case 'GET_WEIGHTS': return { ...state, weights: action.payload } default: return state; } }
components / Items / index.js
import React from 'react'; import CategoryBar from './CategoryBar' import Typography from '@material-ui/core/Typography'; import { connect } from 'react-redux'; import { getWeights } from '../../actions' import WeightItems from './WeightItems'; class Items extends React.Component { componentDidMount() { console.log(this.props) this.props.getWeights(); } render() { const { weights } = this.props.weights; return ( <div> <Typography variant="h4">Browse</Typography> <div> <CategoryBar /> </div> <WeightItems weights={weights} /> </div> ) } } const mapStateToProps = state => ({ weights: state.weights }); export default connect( mapStateToProps, { getWeights } )(Items)
components / Items / WeightItems.js
import React from 'react' import Grid from '@material-ui/core/Grid'; import { makeStyles } from '@material-ui/core/styles'; import Item from './Item' const useStyles = makeStyles({ items: { display: 'flex', margin: 'auto', } }) const WeightItems = ({ weights }) => { const classes = useStyles() return ( <Grid className={classes.items} container direction="row" justify="center" alignItems="center" spacing={3}> {weights.map(weight => <Item key={weight.id} weight={weight} />)} </Grid> ) } export default WeightItems
components / Items / Item.js
import React from 'react'; import Paper from '@material-ui/core/Paper'; import Grid from '@material-ui/core/Grid'; const Item = ({ weight }) => { return ( <Grid item xs={12} sm={6} md={4}> <Paper>{weight.title}</Paper> </Grid> ) } export default Item
store.js
import { createStore, applyMiddleware, compose } from 'redux'; import thunk from 'redux-thunk'; import rootReducer from './reducers'; const initialState = {}; const middleWare = [thunk]; const composeEnhancers = window.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__ || compose; const store = createStore( rootReducer, initialState, composeEnhancers(applyMiddleware(...middleWare)) ); export default store;
[当前,我通过导入相应的分派操作并使用connect()来调用component / Items / index.js组件中的API,但是,除了执行此操作并传递权重之外,我还需要能够调用在其他地方使用API并根据从其他组件中选择的过滤器来呈现VisibleWeights组件(我没有显示出来,因为它可以正常工作并且可以正确更新状态,但是如果需要为上下文显示,肯定可以添加)。
containers / VisibleWeights.js
import { connect } from 'react-redux' import { Categories } from '../actions' import WeightItems from '../components/Items/WeightItems' const getVisibleWeights = (weights, category) => { console.log(weights, category) switch(category) { case Categories.SHOW_ACCESSORIES: return weights.filter(weight => weight.category === 'Accessories') case Categories.SHOW_BARBELLS: return weights.filter(weight => weight.category === 'Barbells') case Categories.SHOW_DUMBBELLS: return weights.filter(weight => weight.category === 'Dumbbells') case Categories.SHOW_PLATES: return weights.filter(weight => weight.category === 'Plates') case Categories.SHOW_RACKS: return weights.filter(weight => weight.category === 'Racks') case Categories.SHOW_OTHER: return weights.filter(weight => weight.category === 'Other') } } const mapStateToProps = state => ({ weights: getVisibleWeights(state.weights, state.shownCategory) }) export default connect( mapStateToProps, )(WeightItems)
请让我知道是否可以添加任何其他代码或注释。在过去的两天里,我一直在努力解决这一小问题,并且无法弄清楚需要进行哪些更改才能正常工作。我知道API的调用正确,但是不知道如何更改组件才能正确显示它。 **当我尝试调用组件而不是组件时,出现错误:'TypeError:无法读取未定义的属性'map''**
我是React和Redux的新手,一直在关注Redux官方文档Todo List示例https://redux.js.org/basics/example,最近更改了我的代码以遵循presentational / container ...
您在weights
中将[]
声明为初始状态下的空数组reducers/weights.js
您正在按如下所示对其进行销毁