#javascript #reactjs #redux
#javascript #reactjs #переопределение
Вопрос:
Я не знаю, что происходит с компонентом, я пытаюсь отобразить массив объектов из mongo здесь, но он ничего не показывает в printInventory, но если я вызову this.props.inventory, и он заберет все данные! Что происходит?
printInventory = () => {
this.props.inventory.map((inventory) => {
return (
<CardInventario
cardTitle={inventory.name}
quantity={inventory.quantity}
description={inventory.price}
/>
)
})
}
в этих функциях.
Далее я собираюсь показать действия и редукторы:
inventoryReducer:
import {TAKE_INVENTORY} from '../../types/inventoryTypes';
const INITIAL_STATE ={
inventory: []
}
function invetoryReducer(state = INITIAL_STATE,action){
switch (action.type) {
case TAKE_INVENTORY:
return {...state, inventory: action.payload}
break;
default:
return state;
break;
}
}
export default invetoryReducer;
и вот действия инвентаризации:
import axios from 'axios'
import { TAKE_INVENTORY } from '../../types/inventoryTypes'
export const takeInventory = () => async (dispatch) =>{
const res = await axios.get('http://localhost:3001/inventory')
dispatch({
type: TAKE_INVENTORY,
payload: res.data
})
}
И полный компонент:
import React, { Component } from 'react'
import { Link } from 'react-router-dom'
import { connect } from 'react-redux'
import axios from 'axios'
/* Components and Styles */
import CardInventario from '../components/CardInventario'
import '../assets/styles/container/Stock.scss'
/* Redux */
import * as inventoryActions from '../actions/inventoryActions'
class Stock extends Component {
componentDidMount() {
this.props.takeInventory();
}
printInventory = () => {
this.props.inventory.map((inventory) => {
return (
<CardInventario
cardTitle={inventory.name}
quantity={inventory.quantity}
description={inventory.price}
/>
)
})
}
render() {
console.log(this.props.inventory)
return (
<>
<div className="container">
<div className="additem">
<Link to="/additem" className="additem__link">
<p className="link-add">
Añadir Item a Stock
</p>
</Link>
</div>
<div className="stock" key="stock">
{this.printInventory()}
</div>
</div>
</>
)
}
}
const mapStateToProps = (reducers) => {
return reducers.inventoryReducer;
}
export default connect(mapStateToProps, inventoryActions)(Stock);
Ответ №1:
Прежде всего, пожалуйста, используйте правильное отображение. inventoryReducer — это не тот, который вы хотите отобразить. инвентарь внутри этого объекта — тот, который вы хотите.
const mapStateToProps = (reducers) => {
return reducers.inventoryReducer.inventory;
}
Также, если вы получаете данные в this.props.inventory, это должно быть связано с дублированными ключами
Пожалуйста, попробуйте следующее
printInventory = () => {
this.props.inventory.map((inventory, index) => {
return (
<CardInventario
key={index}
cardTitle={inventory.name}
quantity={inventory.quantity}
description={inventory.price}
/>
)
})
}
Если у вас нет идентификатора, вместо этого можно использовать индекс (хотя и не рекомендуется)
printInventory = () => {
this.props.inventory.map((inventory) => {
return (
<CardInventario
key={inventory.id}
cardTitle={inventory.name}
quantity={inventory.quantity}
description={inventory.price}
/>
)
})
}
Комментарии:
1. Ошибка? Какую ошибку вы видите? Вы имеете в виду, что он все еще пуст? Если вы имели в виду пустой, то я сомневаюсь в части рендеринга самого CardInventario
2. Неперехваченная ошибка типа: _this.props.inventory.map не является функцией в Stock.printInventory (Stock.jsx: 19) в Stock.render (Stock.jsx:43)
3. вышеуказанная ошибка произошла в компоненте <Stock>: в наличии (создано ConnectFunction) в ConnectFunction (создано Context. Потребитель)
4. Ну, я обновил ответ. Похоже, что ваша функция отображения была правильной. В редукторе есть объект, а не массив. Таким образом, инвентарь внутри него должен быть тем, который вы хотели заполнить
5. Пожалуйста, покажите мне результат этого.props.inventory, который вы видите здесь, и пробовали ли вы мое решение выше? Я обновил ответ