Функциональное состояние реакции против разницы объектов

#reactjs #setstate

#reactjs #setstate

Вопрос:

Проходя курс React, я столкнулся со странной ситуацией удаления объекта из состояния. Автор курса использовал обновление нефункционального состояния, но я попытался сделать его функциональным и получил ошибку. Было бы здорово, если бы вы объяснили принципиальную разницу в этих двух подходах. Для начала состояние выглядит так:

 {
  items: {item11 : {_item1Props_}, item2: {item2Pros}},
  order: {_some_suff_in_the_cart}
}
  

Для удаления item2 был выполнен следующий код:

 deleteItem = key => {
  const items= {...this.state.items, [key]: null};
  this.setState({items});
}
  

Все компоненты, использующие состояние, обновлены без ошибок (корзина, просмотр и так далее).
Пытаясь сделать setState функциональным, я получил ошибку в методах рендеринга других компонентов со следующим кодом:

 deleteItem = key => {
  this.setState(prevState =>(
    {
     items: 
      {...prevState.items, [key]: null}
    }
  ));
}
  

Более того, следующий код также не удался:

 deleteItem = key => {
  const items= {...this.state.items, [key]: null};
  this.setState(prevState => ({items}));
}
  

Итак, должно быть принципиальное различие в этих методах?
Заранее благодарю вас!

UPD код компонентов: Есть два компонента, использующих состояние:

 TypeError: _this$props$details is null
  

Происходит из компонента, который отображает элемент:

 class Item extends Component {
  render() {
    const {name, desc, price, status, image} = this.props.details;
    const isAvailable = status === "available";
    return (
      <li className="menu-item">
        <img src={image} alt={name}/>
        <h3 className="item-name">
          {name}
          <span className="price">{formatPrice(price)}</span>
        </h3>
        <p>{desc}</p>
        <button 
          disabled={!isAvailable}
          onClick={()=>{this.props.addToOrder(this.props.index)}}
        >
          {isAvailable ? "Add To Cart" : "Sold Out"}
        </button>
      </li>
    );
  }
}
  

и

 TypeError: this.props.item is null
  

из компонента, который используется для редактирования элементов:

 class EditItemForm extends Component {
  handleChange = (e) => {
    const updatedItem = {
      ...this.props.item,
      [e.target.name]: e.target.value
    };
    this.props.updateItem(this.props.index, updatedItem);
  }

  render() {
    return (
      <div className="item-edit">
        <input 
          name="name" 
          type="text" 
          onChange={this.handleChange}
          value={this.props.item.name}
        />
        <input 
          name="price" 
          type="text" 
          onChange={this.handleChange}
          value={this.props.item.price}
        />
        <select 
          name="status" 
          value={this.props.item.status}
          onChange={this.handleChange}
        >
          <option value="available">Available</option>
          <option value="unavailable">Sold Out</option>
        </select>
        <textarea 
          name="desc" 
          type="text" 
          onChange={this.handleChange}
          value={this.props.item.desc}
        />
        <input 
          name="image" 
          type="text"  
          onChange={this.handleChange}
          value={this.props.item.image}
        />
      </div>
    );
  }
}
  

UPD2:
Я зарегистрировал методы render () упомянутых компонентов и обнаружил, что версия объекта вообще удаляет свойство, поэтому значение null не передается компонентам, в то время как функционал сохраняет значение null при передаче состояния компонентам.

Комментарии:

1. Этот второй фрагмент должен сработать. Какую именно ошибку вы получаете из-за этого?

2. @Tholle Я обновил описание

3. происходят ли множественные удаления в быстрой последовательности или существуют другие вызовы setState?

4. @lecstor никаких других обновлений не происходит, только это

5. единственное наблюдение, которое я могу сделать, это то, что с нефункциональной версией setState дочерние компоненты не видят null значения, которое они видят с версией функции, и они, очевидно, не обрабатывают его. Кажется, я не могу воспроизвести это различие.