Как разрешить сообщение консоли с предупреждением «UNSAFE_componentWillReceiveProps» в hook

#reactjs

Вопрос:

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

DebounceInput.js

 /* eslint-disable react/prop-types */
import React, { useState, useCallback } from 'react'

function useDebouncedValue(initialVal, delay, callback) {
  // state to store value of the input
  const [val, setValue] = useState(initialVal)
  // state to store the timer
  const [timer, setTimer] = useState(null)

  // function to be called on every change of input
  const handleInputChange = useCallback(
    (event) => {
      // assigning the value to a local variable
      // Or you can make the event persist if you want to pass around the event obj
      const inputVal = event.target.value
      // setting the value for immediate use
      setValue(inputVal)
      // the same old code checking amp; clearing if a callback is already scheduled
      if (timer) {
        clearTimeout(timer)
      }
      // setting a new callback to execute
      const timerId = setTimeout(() => callback(inputVal), delay)
      setTimer(timerId)

      // if components unmounts when there is a scheduled callback
      // then clearing out the callback
      return () => {
        if (timer) {
          clearTimeout(timer)
        }
      }
    },
    [callback, delay, timer]
  )

  // returning the val and the debounceChange which can be assigned
  // to a input onchange handler

  return [val, handleInputChange]
}

export default function InputComp({
  onDebouncedValChange,
  delay = 400,
  type,
  placeholder,
  value,
}) {
  const [val, handleInputChange] = useDebouncedValue(
    value,
    delay,
    onDebouncedValChange
  )

  return (
    <input
      type={type}
      placeholder={placeholder}
      value={val}
      onChange={handleInputChange}
    />
  )
}
/* eslint-disable react/prop-types */
import React, { useState, useCallback } from 'react'

function useDebouncedValue(initialVal, delay, callback) {
  // state to store value of the input
  const [val, setValue] = useState(initialVal)
  // state to store the timer
  const [timer, setTimer] = useState(null)

  // function to be called on every change of input
  const handleInputChange = useCallback(
    (event) => {
      // assigning the value to a local variable
      // Or you can make the event persist if you want to pass around the event obj
      const inputVal = event.target.value
      // setting the value for immediate use
      setValue(inputVal)
      // the same old code checking amp; clearing if a callback is already scheduled
      if (timer) {
        clearTimeout(timer)
      }
      // setting a new callback to execute
      const timerId = setTimeout(() => callback(inputVal), delay)
      setTimer(timerId)

      // if components unmounts when there is a scheduled callback
      // then clearing out the callback
      return () => {
        if (timer) {
          clearTimeout(timer)
        }
      }
    },
    [callback, delay, timer]
  )

  // returning the val and the debounceChange which can be assigned
  // to a input onchange handler

  return [val, handleInputChange]
}

export default function InputComp({
  onDebouncedValChange,
  delay = 400,
  type,
  placeholder,
  value,
}) {
  const [val, handleInputChange] = useDebouncedValue(
    value,
    delay,
    onDebouncedValChange
  )

  return (
    <input
      type={type}
      placeholder={placeholder}
      value={val}
      onChange={handleInputChange}
    />
  )
}
 

Search.js:

 const Search = () => {
  const [query, setQuery] = useState('')
  
  const dispatch = useDispatch()
 
  useEffect(() => {
    if (query?.trim()) {
      sessionStorage.setItem('searchTerm', query)
      dispatch(getSearch(query))
      setShowSection(true)
    } else {
      sessionStorage.removeItem('searchTerm')
      setShowSection(false)
    }
  }, [query, dispatch])
  return (
     <DebouncedInput
                      onDebouncedValChange={(val) => {
                        setQuery(val)
                      }}
                      placeholder="Type here to search.."
                      type="text"
                      value={query ?? ''}
                    />
                   
 )
}
 

Но в консоли разработчика есть красное предупреждающее сообщение, которое меня раздражает:
введите описание изображения здесь

Не удалось использовать крючки memo, useCallback, так как он уже вызван в компоненте hook. Каков правильный способ решения этого предупреждения? Что произойдет в среде prod, если я ее проигнорирую

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

1. Что такое InfiniteScroll ? Если это тот компонент, который вы создали, нам нужно будет его увидеть. Я предполагаю, однако, что это компонент, который вы импортируете, и в этом случае вам нужно будет обновить версию библиотеки, которая содержит бесконечный список (при условии, что разработчики библиотеки выпустили более новую версию, устраняющую проблему).

2. попробуйте удалить <React.StrictMode> и запустить снова