@petroshevchenko1525

Почему аргументы функциии updater написаны вот таким образом?

Есть код одного React приложения.
В метод setState аргументом обычно передают объект, например вот так:
updateSearchInput = (e) => {
    this.setState({
      searchInput: e.target.value
    });
};

Но в данном коде в setState аргументом передают не обьект а передают функцию, вот так:
filter = () => {
    this.setState(
      ({ searchInput: searchInput, startDataArray: data, category }) => {
        return {
          filteredDataArray: data[category].filter(item =>
            item.firstName.toLowerCase().includes(searchInput.toLowerCase())
          )
        };
      }
    );
  };


Я хотел разобраться что это такое и зашел на официальный сайт реакта, и там узнал что первым аргументом в setState можно передавать функцию updater. Но все равно не понимаю некоторые вещи в данном коде.

Если тот код что находится после return мне понятен, то то что передано в аргументы updater функции мне не понятно:
1) Зачем в свойство searchInput я как значение передаю свойство searchInput?
2) Почему свойству startDataArray передаются аж два значения : data и category? Разве можно свойству обьекта давать два значения? Если да, то зачем в конкретном случае так сделали?
3) Почему в даном случае в метод filter передали аргументом функцию updater а не обьект?

Напишу весь код файла чтобы было лучше понятно:
const daysArray = ["yesterday", "today", "tomorrow"];

class App extends React.Component {
  state = {
    day: 1,
    startDataArray: [],
    filteredDataArray: [],
    searchInput: "",
    category: "first"
  };

  componentDidMount() {
    this.fetchData();
  }

  fetchData = async () => {
    const response = await fetch(`/data/${daysArray[this.state.day]}.json`);
    const data = (await response.json()).group;
    this.setState({
        startDataArray: data,
        category: Object.keys(data)[0] 
      },this.filter);
  };

  changeDay = (argDay) => {
    this.setState({
        day: argDay
      },this.fetchData);
  };

  updateSearchInput = (e) => {
    this.setState({
      searchInput: e.target.value
    });
  };

  filter = () => {
    this.setState(
      ({ searchInput: searchInput, startDataArray: data, category }) => {
        return {
          filteredDataArray: data[category].filter(item =>
            item.firstName.toLowerCase().includes(searchInput.toLowerCase())
          )
        };
      }
    );
  };

  changeCategory = (event) => {
    this.setState({ 
        category: event.target.dataset.category 
    },this.filter);
  };

  render() {
    const {searchInput, category, startDataArray, filteredDataArray} = this.state;

    return (
      <div>
        <TableSearch value={searchInput} onChange={this.updateSearchInput} onSearch={this.filter}/>
        
        {daysArray.map((day, i) => (
          <button key={day} onClick={() => this.changeDay(i)} className={i === this.state.day ? "active" : ""}>{day}</button>
        ))}
        
        <br />
            
        {Object.keys(startDataArray).map(item => (
          <button data-category={item} onClick={this.changeCategory} className={item === category ? "active" : ""}>{item} category</button>
        ))}
        
        <TableData data={filteredDataArray} />
      </div>
    );
  }
}
  • Вопрос задан
  • 133 просмотра
Решения вопроса 2
@davidnum95
Вам бы жс подучить, прежде чем за реакт браться. Тривиальные примеры же.
Зачем в свойство searchInput я как значение передаю свойство searchInput?

Это уже к вас вопрос - зачем? Можно было просто:
({ searchInput, startDataArray: data, category })
Почему свойству startDataArray передаются аж два значения : data и category? Разве можно свойству обьекта давать два значения? Если да, то зачем в конкретном случае так сделали?

Запятую после data не видим?
data - это просто "псевдоним" для startDataArray, чтоб меньше буковок писать, category - просто отдельный параметр.
Почему в даном случае в метод filter передали аргументом функцию updater а не обьект?

Какой updater передали? Вы о чем вообще? filter принимает колбэк, который должен возвращать true/false соответственно. С чего вы взяли что туда нужно передавать объект?
Ответ написан
hzzzzl
@hzzzzl
Почему свойству startDataArray передаются аж два значения : data и category? Разве можно свойству обьекта давать два значения? Если да, то зачем в конкретном случае так сделали?


https://learn.javascript.ru/destructuring-assignme...

this.setState(
      ({ searchInput: searchInput,   // хз зачем они так написали
         startDataArray: data,   // в функции будет переменная data которая = this.state.startDataArray
         category  // более короткая запись чем category: category
      }) => {
        return {
          filteredDataArray: data[category].filter(item =>  // здесь data это state.startDataArray
            item.firstName.toLowerCase().includes(searchInput.toLowerCase())
          )
        };
      }
    );


Почему в даном случае в метод filter передали аргументом функцию

почему, this.filter не принимает аргументов

fetchData = async () => {
//
    this.setState({
        startDataArray: data,
        category: Object.keys(data)[0] 
      },
      // выполнить this.filter() после того, как стейт заполнится новыми данными
      this.filter);
  };

  filter = () => { // это просто стрелочная функция без аргументов
    this.setState(
      // берем параметры из стейта, заодно переименовываем startDataArray
      ({ searchInput: searchInput, startDataArray: data, category }) => {
        return {
          // возвращаем новое значение стейта
          filteredDataArray: data[category].filter(item =>
            item.firstName.toLowerCase().includes(searchInput.toLowerCase())
          )
        };
      }
    );
  };
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы