useEffect с async и Cookies.get в NextJS

Я пытаюсь получить эффект использования данных cookie, а затем использовать эти данные, мой компонент выглядит так ...

const Favourites = (props) => {
  const [isClick, setClick] = useState(false);

  const activityId = props.activityId

  useEffect(() => {
    const favourites = Cookies.get('favourites')
    if (favourites[activityId] === true) {
      setClick(true)
    }
  })

  return (
    <>
      <div className="heart">
        <Heart isClick={isClick} onClick={() => setClick(!isClick)} />
      </div>

    </>
  );
}

это то, что я получаю, когда использую console.log (Cookies.get ('избранное')) -

{"5edf47240dcb4713d3942e1b":true,"5edf47240dcb4713d3942e2b":true,"5fa10bd8f70458050ffe68af":true}

изменение

const favourites = Cookies.get('favourites')

to

const favourites = {"5edf47240dcb4713d3942e1b":true,"5edf47240dcb4713d3942e2b":true,"5fa10bd8f70458050ffe68af":true}

производит желаемый эффект.

избранное - это массив идентификаторов активности, хранящихся в localstorage с использованием js-cookie. это в основном список любимых действий пользователей, если им нравится действие и нажмите кнопку с сердечком, тогда идентификатор активности сохраняется в качестве ключа, а значение устанавливается на true

указанное выше не работает, для setClick не установлено значение true, если activityId в массиве избранного имеет значение true. Если я console.log (Cookies.get ('favourites')) и скопирую результат в избранное const, тогда он будет работать


person JakeKempo    schedule 30.11.2020    source источник
comment
Что такое activityId (возможно, значение состояния? Остерегайтесь того, что это отсутствующая зависимость) и какую библиотеку вы используете для Cookies?   -  person Yoshi    schedule 30.11.2020
comment
Вы также можете вставить то, что находится в favourites   -  person Aadil Mehraj    schedule 30.11.2020
comment
Не могли бы вы уточнить, что именно означает не работает?   -  person Victor    schedule 30.11.2020
comment
Я обновил вопрос   -  person JakeKempo    schedule 30.11.2020
comment
Поскольку activityId поступает от реквизита, он нужен вам как зависимость от useEffect. Также Cookies.get синхронно, поэтому весь async/await лишний.   -  person Yoshi    schedule 30.11.2020
comment
Я считаю, что тебе просто нужно сделать JSON.decode по этому поводу   -  person Victor    schedule 30.11.2020
comment
JSON.parse работал @Victor   -  person JakeKempo    schedule 30.11.2020
comment
Собираюсь опубликовать ответ, для краткости   -  person Victor    schedule 30.11.2020


Ответы (1)


Судя по вашему изменению, то, что показывает console.log, на самом деле является string. Итак, выполнение JSON.decode того, что возвращает Cookies.get, должно помочь:

const favourites = JSON.decode(Cookies.get('favourites'));
person Victor    schedule 30.11.2020