Почему useEffect не обновляет состояние при удалении элемента

#javascript #reactjs

Вопрос:

я понятия не имею, почему useEffect работает так, при обновлении состояния и добавлении элементов в SearchData(состояние использования) он работает правильно и обновляет состояние, но когда я удаляю элемент из SearchData, useEffect не запускается.

основная функция

 const tableSearch = (e) => {
    let value = e.currentTarget.value;
    let input = e.currentTarget;
    let mainData = props.data;
    let itemKey = e.currentTarget.parentNode.parentNode.id;
    if (input.checked) {
      addEl(mainData, itemKey, value);
    }
    if (!input.checked) {
      deleteEl(itemKey, value);
    }
  };
   

добавить элемент (это работает правильно)

  //add element on check
  const addEl = (mainData, itemKey, value) => {
    for (let i = 0; i < mainData.length; i  ) {
      if (mainData[i][itemKey] !== null amp;amp; mainData[i][itemKey].includes(value)) {
        tempData.push(mainData[i])
      }
    }
    if(searchData){
        let tempArr = tempData.concat(searchData)
        setSearchData(tempArr)
    }else{
        setSearchData(tempData)
    }
    
  }; 

проблема здесь (удалить элемент)

  //delete element on uncheck
  const deleteEl = (itemKey, value) => {
    for (let i = 0; i < searchData.length; i  ) {
      if (searchData[i][itemKey].includes(value)) {
          console.log(searchData[i][itemKey])
        let index = searchData.indexOf(searchData[i]);
        searchData.splice(index, 1);
      }
    }
    setSearchData(searchData);
  };

  useEffect(() => {
    if (searchData) {
      setData(searchData);
    pagination();
    }
  }, [searchData]); 

Ответ №1:

вы не можете так поступить с searchData (searchData.splice), вы можете установить его только с помощью setSearchData

 const deleteEl = (itemKey, value) => {
    setSearchData(data=>{
        for (let i = 0; i < data.length; i  ) {
            if (data[i][itemKey].includes(value)) {
                console.log(data[i][itemKey])
                let index = data.indexOf(data[i]);
                data.splice(index, 1);
            }
        }
        return data;
   })
};
 

Ответ №2:

Вы не можете обновить состояние таким образом (в вашей функции удаления). Используйте временную переменную, как вы делали в своей функции addEl, а затем обновите состояние с ее помощью. Что-то вроде

 const deleteEl = (itemKey, value) => {
    let tempArr = searchData
    for (let i = 0; i < tempArr.length; i  ) {
      if (tempArr[i][itemKey].includes(value)) {
          console.log(tempArr[i][itemKey])
        let index = tempArr.indexOf(searchData[i]);
        tempArr.splice(index, 1);
      }
    }
    setSearchData(tempArr);
  };
 

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

1. Эффект использования в любом случае не срабатывает, я копирую этот код в свой, и он только добавляет элементы, а не удаляет их