Реагировать: Обработка отображенных состояний

#javascript #json #reactjs #state

#javascript #json #reactjs #состояние

Вопрос:

Я очень новичок в кодировании и пытаюсь разобраться в проблеме, с которой я столкнулся. Я использую axios для извлечения файла json и сохранения его в состоянии. (Я также использую Redux для заполнения формы) Затем я использую .map() для разбиения массива и отображения одного значения из каждого объекта в массиве.

 example json:
unit :
[
    { 
        designName : x, 
        quantity : 0, 
    },
    { 
        designName : y, 
        quantity : 0, 
    },
    { 
        designName : z, 
        quantity : 0, 
    }
]

  

Затем я добавил входные данные для выбора количества отображаемого значения, и теперь я хочу вернуть это значение обратно в состояние, чтобы отправить весь измененный json обратно в API с помощью Axios.
Я чувствую, что я близок, но я не уверен, что мне нужно делать с функцией handleQuantity.
Вот мой код:

 import React, { Component } from 'react';
import store from '../../redux_store'
import axios from 'axios';
import { Button, Card } from 'react-bootstrap'
import { Link } from 'react-router-dom'

store.subscribe(() => {
})

class developmentSummary extends Component {
    constructor(props) {
        super(props)

        this.state = {
            prjName: store.getState()[0].developmentName,
            units: []
        }
    }
    componentDidMount() {
        axios.get('https://API')
            .then(
                res => {
                    console.log(res)
                    this.setState({
                        units: res.data.buildings
                    })
                    console.log(this.state.units.map(i => (
                        i.designName
                    )))
                }
            )
    } 
   handleQuantity() {
    }

    render() {
        return (
            <>
                <div className="Text2">
                    {this.state.prjName}
                </div>
                <div className="Text2small">
                    Please select the quantity of buildings from the list below
                </div>
                <ul>
                    {this.state.units.map((object, i) => (
                        <div className="Card-center">
                            <Card key={i} style={{ width: "50%", justifyContent: "center" }}>
                                <Card.Body>{object.designName}</Card.Body>
                                <Card.Footer>
                                    <input
                                        className="Number-picker"
                                        type="number"
                                        placeholder="0"
                                        onChange={this.handleQuantity}
                                        
                                    />
                                </Card.Footer>
                            </Card>
                        </div>
                    ))}
                </ul>
  

Заранее спасибо!

Ответ №1:

Вы должны передать изменение event , unit объект и index в handleQuantity , а затем вставить измененную единицу измерения как новый объект между неизмененными единицами измерения.

Вот код:

 <input
  className="Number-picker"
  type="number"
  placeholder="0"
  onChange={(event) => this.handleQuantity(event, object, i)}
/>;
  

И код для handleQuantity

 handleQuantity = (event, unit, index) => {
  const inputedNumber =  event.target.value; // get your value from the event (  converts string to number)
  const changedUnit = { ...unit, quantity: inputedNumber }; // create your changed unit

  // place your changedUnit right in between other unchanged elements
  this.setState((prevState) => ({
    units: [
      ...prevState.units.slice(0, index),
      changedUnit,
      ...prevState.units.slice(index   1),
    ],
  }));
}