【问题标题】:Redux state not updating arrayRedux 状态不更新数组
【发布时间】:2018-02-14 22:20:22
【问题描述】:

我的 redux 有问题。这是我第一次在 React 中使用它。我已经成功地使用它来记录和注册用户。但是,我在后端创建了一组对象,我正在使用 axios 获取这些对象。 Axios 记录数据,我的动作创建者也在有效负载中记录数据。但是,它不会更新我的新状态。我不知道我做错了什么,因为我尝试了与登录和注册状态完全相同的方式,但是这些只是布尔值。我已经用谷歌搜索并搜索了解决方案。我尝试映射新数组、Object.assign 和许多其他数组,但似乎无法正常工作。在状态下创建新数组有什么特殊方法吗?或者我可以分配它 action.payload 吗?感谢所有帮助

// store.js

import { applyMiddleware, createStore } from 'redux';
import logger from 'redux-logger';
import thunk from 'redux-thunk';

import reducer from './reducers/reducer';

const middleware = applyMiddleware(logger, thunk);

export default createStore(reducer, middleware);

// rootReducer.js

import { combineReducers } from 'redux';

import registerReducer from './registerReducer';
import loginReducer from './loginReducer';
import productsReducer from './products';

export default combineReducers({
  registerReducer,
  loginReducer,
  productsReducer
});

// productsReducer // 我认为这里一定是错的

import { SHOW_PRODUCTS, SELECT_PRODUCT } from '../actions/products';

const initialState = {
  productsList: []
};

const productsReducer = (state = initialState, action) => {
  switch (action.type) {
    case SHOW_PRODUCTS: 
      return {...state, productsList: action.payload}
  }
  return state;
}

export default productsReducer;

//actions.js

import { SHOW_PRODUCTS, SELECT_PRODUCT } from './constants';

export function showProducts(products) {
  return {
    type: SHOW_PRODUCTS,
    payload: products
  };
}

// 组件.js

import React, { Component } from 'react';
import axios from 'axios';
import { connect } from 'react-redux';

import ProductsList from './ProductsList';
import { showProducts }  from '../actions/products';


class Home extends Component {
  constructor(props) {
    super(props);
  }

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

  render() {
    return(
      <div>Home Page
        <ProductsList />
      </div>
    )
  }
}

const mapStateToProps = (state) => {
  return {
    productsList: state.productsReducer.productsList
  };
}

const mapDispatchToProps = (dispatch) => {
  return {
    getProducts: () => {
      axios.get('http://localhost:5000/product/list')
      .then((res) => {
        console.log(res.data);
        dispatch(showProducts(res.data))
      })
      .catch(err => console.log(err))
    }
  }
}

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

我还在我的 redux 记录器中包含了一个图像链接。

https://i.stack.imgur.com/bTnYh.png

这里可能有一个非常小的、愚蠢的错误,因为我对 React 很陌生,对 Redux 完全陌生

【问题讨论】:

  • 你能验证payload是否在productsReducer文件中有项目吗?
  • 你有console.log()productsReducer中的动作吗?

标签: javascript arrays reactjs redux state


【解决方案1】:

你有一个错误,我不知道你是否是一个 linter,但在 productsReducer.js 中,你正在从 actions 导入 constants,而它应该来自 constants

import { SHOW_PRODUCTS, SELECT_PRODUCT } from '../actions/constants'; // <- from constants instead

const initialState = {
  productsList: []
};

const productsReducer = (state = initialState, action) => {
  switch (action.type) {
    case SHOW_PRODUCTS: 
      return {...state, productsList: action.payload}
  }
  return state;
}

export default productsReducer;

所以你的reducer 实际上不应该被正确地使用case,因为它是undefined,它会返回初始状态。

【讨论】:

  • 我有一个名为 actions 的文件夹,我也将我的常量文件放在其中,因此它被正确导入。我不知道,这可能只是组织文件的一种糟糕方式。如果您查看我发布的链接i.stack.imgur.com/bTnYh.png。动作负载实际上从 action.payload 中返回正确的数据
  • 原来我是从错误的路径导入它...我浪费了一整天试图弄清楚...只是第二天早上才注意到...谢谢您的帮助跨度>
【解决方案2】:

我相信mapStateToProps 你会想要做以下事情:

const mapStateToProps = (state) => {
    return {
        productsList: state.productsList
    };
}

要确认 productsList 是否被传递,您能否在 component.jsrender 函数中添加一个简单的循环,如下所示:

render() {
    const { productsList } = this.props;
    return(
        <div>
            Home Page
            {productsList.map((product, index) => (
                <div key={index}>{product.PROPERTY_NAME_HERE}</div>
            ))}
        </div>
    )
}

【讨论】:

  • 还有更多的事情,你能详细说明this.props.getProducts();component.js 的生命周期事件中this.props.getProducts(); 的用途吗?另外,你可能想从component.js 渲染方法中传递productsList:@ 987654332@
  • 最后,你能分享ProductList组件的代码吗?
  • 是的......现在什么都没有......我被困在无法更新我的状态,所以现在我在这个组件中呈现它。嗯,this.props.getProducts() 的目的是在组件挂载时触发这个函数
  • 也许您现在可以用一个简单的循环替换ProductList 组件以确认productsList 被正确检索,我添加了render 方法代码作为示例
  • 谢谢,但问题是 redux 在我的状态下返回一个空数组
【解决方案3】:

我使用减速器的方式是

import { SHOW_PRODUCTS, SELECT_PRODUCT } from '../actions/products';

const initialState = {
  productsList: []
};

const productsReducer = (state = initialState, action) => {
  switch (action.type) {
    case SHOW_PRODUCTS:
      let nextState = {...state};
      nextState.productsList = action.payload
      return nextState;
  }
  return state;
}

export default productsReducer;

【讨论】:

    【解决方案4】:

    试试这个方法:

    componentWillMount() {
      this.getProducts(); 
    }
    
    getProducts() {
      axios.get('http://localhost:5000/product/list')
      .then((res) => {this.props.showProducts(res.data);})
      .catch(err => console.log(err));
    }
    
    const mapDispatchToProps = dispatch => ({
      showProducts: (data) => {
        dispatch(showProducts(data));
      },
    });
    

    【讨论】:

      猜你喜欢
      • 2022-01-14
      • 1970-01-01
      • 2017-04-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-06-13
      • 2020-08-01
      • 2021-10-17
      相关资源
      最近更新 更多