【问题标题】:Redux not assigning fetched array to state variableRedux 未将获取的数组分配给状态变量
【发布时间】:2018-08-29 03:45:57
【问题描述】:

我正在从后端获取一个数组,它可以工作,但是 redux 不知何故没有将数组分配给一个变量。 products in initialState 始终为空,如果我尝试在我的组件中引用它,它是 undefined

RestActions:

const receivedProducts = (products) => ({
    type: "RECEIVED_PRODUCTS",
    products
})


export function getProducts() {
    return function(dispatch) {
        return axios({
            url: '/products',
            timeout: 20000,
            method: 'get'
        })
        .then(function(response) {
            let p = response.data;
            dispatch(receivedProducts(p));
        })
        .catch(function(error) {
            if(error.response) {
                // DEBUGGING
                console.log(error.response.data);
                console.log(error.response.status);
                console.log(error.response.headers);
            }
        })
    }
};

我将reducer 放在store 中。这就是它的样子。

商店

const initialState = {

    // KEYBOARD
    searchWord: '',

    // BASKET
    basket:[],

    // PRODUCTS
    products: []
};
const reducer = (state = initialState, action) => {
    console.log('reducer', action);
    console.log('basket', state.basket);
    console.log('products', state.products)
    switch(action.type) {

        // REST
        case 'RECEIVED_PRODUCTS':
            return Object.assign({}, state, {products: action.products});
        ...

我的组件根据products 动态创建按钮并将它们呈现在网格中。每当我打电话给this.props.products.length 时,它都是未定义的。这是组件:

按钮

class ButtonsGrid extends React.Component {

    componentDidMount() {
        this.props.getProducts();
    }

    addProduct = (product) => {
        this.props.onButtonPress(product);
    }

    render() {   
        const {classes} = this.props;
        return (
            <div>
                <GridList cellHeight={50} cols={10}>
                    {this.props.list.length > 0 ? this.props.list.map(product => {
                        return (
                            <Button key={Math.random()} style={{width: '200px', border: '1px solid'}} variant="raised" color="primary" onClick={() => this.addProduct(product)}>
                                <div 
                                    style={{fontSize:'12px', display: 'flex', justifyContent: 'center', textAlign:'center'}}>
                                        {product.name}
                                </div>
                            </Button>
                        );
                    }) : ''}
                </GridList>
            </div>
        );
    }
}

const mapStateToProps = (state) => {
    return {
        basket: state.basket,
        products: state.products
    }
}

const mapDispatchToProps = (dispatch) => {
    return { 
        onButtonPress: (data) => {
            let action = { type: 'PRODUCT_ADD', product: data };
            dispatch(action);
        },
        getProducts : function() {
            dispatch(getProducts());
        }
    };
}

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

然后它被App.js调用

App.js

&lt;ButtonsGrid store={store} list={this.state.list} clicked={this.clicked}/&gt;

所以,我可以console.log('reducer', action); 打印正确的内容,但我无法将数据分配给products。我试过this,但还是不行。

数据只是两个json对象。

感谢任何帮助!

【问题讨论】:

  • 你收到什么错误?(如果有的话)
  • 在渲染 Buttons 组件中的按钮之前,我会检查 {this.props.list.length &gt; 0 ? ...}。我得到的长度是undefined。我忘记将products: state.products 添加到按钮的mapStateToProps,现在我得到TypeError: Cannot read property 'cols' of undefined 。如果我 console.log() 商店中的产品,那么我只会得到一个空数组。
  • 好吧,我完全糊涂了。我可以在ButtonsComponent 中成功登录this.props.products 并打印一个空数组。但是,如果我尝试将对象映射到循环中的按钮,我会得到undefined。这太令人困惑了。
  • 尝试在ButtonsGrid 中执行console.log(this.props) 以查看this.props.list 是否存在。
  • console.log(this.props) 确实有效。 this.props.list 只是在我集成 redux 之前进行测试

标签: reactjs redux react-redux axios redux-thunk


【解决方案1】:

传播state 对象

 return Object.assign({}, ...state, {
  products: [
    ...state.products,
    action.products
  ]
});

【讨论】:

  • 我没有使用combineReducers
  • 能否请您在mapStateToProps 中控制台state 并分享输出
  • 如果我尝试将对象映射到 ButtonsGrid 中的按钮,像这样 {this.props.products.length &gt; 0 ? this.props.products.map(product =&gt; { - 我得到一个 TypeError: Cannot read property 'cols' of undefined
  • @Claim0013 不是这样的。请检查 EDIT.Only state 第二个参数
  • @Claim0013 [...this.state.products, action.products] 我错过了。我的错。它连接数组的现有元素和新元素的方式。
猜你喜欢
  • 1970-01-01
  • 2017-02-20
  • 2019-09-20
  • 2021-09-25
  • 1970-01-01
  • 2020-07-27
  • 2016-12-12
  • 1970-01-01
  • 2011-06-24
相关资源
最近更新 更多