Реагировать setState: использовать флажок для изменения логического значения - PullRequest
0 голосов
/ 25 марта 2020

Реагирует на новичка здесь. Проверено в похожих темах и не нашел ответа. Я создаю страницу, где вы создаете элементы и обновляете информацию. Но сейчас я борюсь с простым флажком. Когда это проверено, активное состояние должно измениться на true и наоборот. Однако, когда я нажимаю, статистика не меняется. Я проверил с консольным журналом, и функция работает хорошо, попробовал использовать prevState и простой setState active: true, но я все еще не могу изменить это. Я, вероятно, упускаю что-то очевидное, поэтому спасибо заранее, если вы можете указать на это.

Код приложения

import React from 'react';
import './App.css';
import ProductList from "../ProductList/ProductList";
import NewProd from "../NewProd/NewProd";

class App extends React.Component {
  constructor(props) {
    super(props);
    this.state = {
            name: "", 
            ean: "", 
            type: "", 
            weight: "", 
            color: "", 
            active: null,
            products: [{name: "Cabbage", ean: "00000000", type: "Vegetable", weight: "2kg", color: "Green", active: false}, 
            {name: "Banana", ean: "111111111", type: "Fruit", weight: "0.3kg", color: "Yellow", active: false}, 
            {name: "Chocolate", ean: "22222222222", type: "Candy", weight: "0.2kg", color: "Brown", active: false}, 
            {name: "Orange", ean: "3333333333", type: "Fruit", weight: "0.5kg", color: "Orange", active: false}, 
            {name: "Cucumber", ean: "4444444444", type: "Vegetable", weight: "1kg", color: "Green", active: false}, ]
    };
    this.isActive = this.isActive.bind(this);
};

handleFormSubmit = (e) => {
  e.preventDefault();
  let products = [...this.state.products];

  products.push({
      name: this.state.name,
      ean: this.state.ean,
      type: this.state.type,
      weight: this.state.weight,
      color: this.state.color,
      active: false,
  });
  this.setState({ products, name: "", ean: "", type: "", weight: "", color: "", active: false}
  );
}
handleInputChange = (e) => {
  let input = e.target;
  let name = e.target.name;
  let value = input.value;
  this.setState({[name]: value})
  };

deleteProduct = (delIndex) => {
  let products = [...this.state.products].filter((product, index) => index !== delIndex);
  this.setState({ products });
};
isActive = () => {
  this.setState({active: !this.state.active})
}
render() {
  return (
    <div className="App">
      <ProductList products={this.state.products} 
      deleteProduct={this.deleteProduct}
      isActive={this.isActive} />
      <NewProd handleFormSubmit={this.handleFormSubmit}
      handleInputChange={this.handleInputChange}
      newName={this.state.name}
      newEan={this.state.ean}
      newType={this.state.type}
      newWeight={this.state.weight}
      newColor={this.state.color} />
    </div>
  );
  }
}

export default App;

Код списка

import React from "react";
import "./ProductList.css";

class ProductList extends React.Component {
    render() { 
        const products = this.props.products;
        return (
            <div>
                <h1>Product List</h1>
                <table>
                    <tr>
                        <th>Name</th>
                        <th>EAN Code</th>
                        <th>Type</th>
                        <th>Weight</th>
                        <th>Color</th>
                        <th>Active</th>
                    </tr>
                    {products.map((product, index) => {
                        return (
                            <tr key={index}>
                                <td>{product.name}</td>
                                <td>{product.ean}</td>
                                <td>{product.type}</td>
                                <td>{product.weight}</td>
                                <td>{product.color}</td>
                                <td><input type="checkbox" onChange={this.props.isActive} /></td>
                                <td><button>View</button></td>
                                <td><button>Edit</button></td>
                                <td><button onClick={() => this.props.deleteProduct(index)}>Delete</button></td>
                            </tr>
                        )
                    })}
                </table>
            </div>
        )
    }
}
export default ProductList;

Ответы [ 2 ]

1 голос
/ 25 марта 2020

onChange ожидает функцию обратного вызова, а не логическое значение

в соответствии с документами, вот способ, которым вы должны следовать

<input
  name="isGoing"
  type="checkbox"
  checked={this.state.isGoing} // booean condition here for checked or not
  onChange={this.handleInputChange} />

handleInputChange(event) {
    const target = event.target;
    const value = target.name === 'isGoing' ? target.checked : target.value;
    const name = target.name;

    this.setState({
      [name]: value
    });
  }
0 голосов
/ 25 марта 2020

Вам необходимо обновить состояние продукта в массиве products. Попробуйте это:


    import React from 'react';
    import './App.css';
    import ProductList from "../ProductList/ProductList";
    import NewProd from "../NewProd/NewProd";

    class App extends React.Component {
      constructor(props) {
        super(props);
        this.state = {
                name: "", 
                ean: "", 
                type: "", 
                weight: "", 
                color: "", 
                active: null,
                products: [{name: "Cabbage", ean: "00000000", type: "Vegetable", weight: "2kg", color: "Green", active: false}, 
                {name: "Banana", ean: "111111111", type: "Fruit", weight: "0.3kg", color: "Yellow", active: false}, 
                {name: "Chocolate", ean: "22222222222", type: "Candy", weight: "0.2kg", color: "Brown", active: false}, 
                {name: "Orange", ean: "3333333333", type: "Fruit", weight: "0.5kg", color: "Orange", active: false}, 
                {name: "Cucumber", ean: "4444444444", type: "Vegetable", weight: "1kg", color: "Green", active: false}, ]
        };
        this.isActive = this.isActive.bind(this);
    };

    handleFormSubmit = (e) => {
      e.preventDefault();
      let products = [...this.state.products];

      products.push({
          name: this.state.name,
          ean: this.state.ean,
          type: this.state.type,
          weight: this.state.weight,
          color: this.state.color,
          active: false,
      });
      this.setState({ products, name: "", ean: "", type: "", weight: "", color: "", active: false}
      );
    }
    handleInputChange = (e) => {
      let input = e.target;
      let name = e.target.name;
      let value = input.value;
      this.setState({[name]: value})
      };

    deleteProduct = (delIndex) => {
      let products = [...this.state.products].filter((product, index) => index !== delIndex);
      this.setState({ products });
    };
    isActive = () => {
      this.setState({active: !this.state.active})
    }

    setProductActive = (product, active) => {
      this.setState((state) => ({
        products: state.products.map(p => p.name === product.name ? { ...p, active } : p)
      }))
    }

    render() {
      return (
        <div className="App">
          <ProductList products={this.state.products} 
          deleteProduct={this.deleteProduct}
          setProductActive={this.setProductActive} />
          <NewProd handleFormSubmit={this.handleFormSubmit}
          handleInputChange={this.handleInputChange}
          newName={this.state.name}
          newEan={this.state.ean}
          newType={this.state.type}
          newWeight={this.state.weight}
          newColor={this.state.color} />
        </div>
      );
      }
    }

    export default App;

import React from "react";
import "./ProductList.css";

class ProductList extends React.Component {
    render() { 
        const products = this.props.products;
        return (
            <div>
                <h1>Product List</h1>
                <table>
                    <tr>
                        <th>Name</th>
                        <th>EAN Code</th>
                        <th>Type</th>
                        <th>Weight</th>
                        <th>Color</th>
                        <th>Active</th>
                    </tr>
                    {products.map((product, index) => {
                        return (
                            <tr key={index}>
                                <td>{product.name}</td>
                                <td>{product.ean}</td>
                                <td>{product.type}</td>
                                <td>{product.weight}</td>
                                <td>{product.color}</td>
                                <td><input type="checkbox" checked={product.active} onChange={(e) => this.props.setProductActive(product, e.target.checked)} /></td>
                                <td><button>View</button></td>
                                <td><button>Edit</button></td>
                                <td><button onClick={() => this.props.deleteProduct(index)}>Delete</button></td>
                            </tr>
                        )
                    })}
                </table>
            </div>
        )
    }
}
export default ProductList;

Я добавил setProductActive метод. Надеюсь, это поможет.

...