Выбор и хранение DIV на ReactJs

У меня есть приложение, в котором вы выбираете некоторые продукты (DIVS), которые меняют цвет границы (с состоянием). Я хотел бы знать, как я могу сохранить эти действия onClick, чтобы, когда люди нажимают на другую ссылку и возвращаются, выбираются те же DIV?

Я знаю, что могу использовать файлы cookie или сеансы, но как определить каждый DIV в React и сделать их автоматическим выбором, например, после обновления страницы? Как вам, ребята, это удается? Спасибо.

На какой версии React вы работаете?

ruby_newbie 23.10.2018 18:45

Сейчас пользуюсь студией Rekit. У них нет версии для реагирования в документации, но я последую вашему совету и посмотрю, как это пойдет. Большое тебе спасибо.

Guilherme Nunes 23.10.2018 18:57
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Навигация по приложениям React: Исчерпывающее руководство по React Router
Навигация по приложениям React: Исчерпывающее руководство по React Router
React Router стала незаменимой библиотекой для создания одностраничных приложений с навигацией в React. В этой статье блога мы подробно рассмотрим...
Массив зависимостей в React
Массив зависимостей в React
Все о массиве Dependency и его связи с useEffect.
0
2
36
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Если вы хотите сохранить состояние после перезагрузки, возможно, вам стоит взглянуть на HTML Web Storage.

В порядке предпочтения я бы использовал:

1) Если вы используете React 16.3 или более позднюю версию, используйте api контекста реакции 2) Если у вас не версия 16.3 или выше, вы можете использовать библиотеку, такую ​​как redux или flux 3) вы можете использовать локальное хранилище HTML.

Вот дополнительная информация о Redux vs context api:
https://daveceddia.com/context-api-vs-redux/

Веб-хранилище наименее желательно, потому что оно не применяет никаких правил управления состоянием, как это делают другие варианты.

хотя вам все равно нужно сохранить свое хранилище в localStorage, чтобы оно длилось после полного обновления страницы.

Jimi Pajala 23.10.2018 18:56

Ну, это зависит от того, что именно он имеет в виду под «чтобы, когда люди нажимают на другую ссылку и возвращаются, выбираются те же DIV?». Если он имеет в виду навигацию на своем собственном сайте, ему не нужно хранить в localStorage.

ruby_newbie 23.10.2018 18:58

Тоже правда. В случае использования Redux можно порекомендовать проверить npmjs.com/package/redux-persist и просто указать, что если фактическая постоянство при обновлении страницы не требуется (как если бы учитывалась только навигация по страницам), это можно было бы решить так же легко, как просто сохранить значения в состоянии higher order component, который затем передает свое состояние в качестве реквизита дочерним компонентам. Также я не рекомендую использовать Redux или React Context API для простых задач.

Jimi Pajala 23.10.2018 19:03

Я согласен, что HOC решит эту проблему, а redux-persist - отличный инструмент. Тем не менее, я думал, основываясь на формулировке вопроса в дополнение к тому факту, что OP не знает, какую версию реакции он использует, что HOC может быть слишком продвинутым по теме, но определенно заслуживает упоминания.

ruby_newbie 24.10.2018 00:40

Вот пример с локальным хранилищем:

import React from 'react';

class App extends React.Component {

  constructor(props) {
    super(props);
    this.state = { list: null };
  }

  onSearch = (e) => {
    e.preventDefault();

    const { value } = this.input;

    if (value === '') {
      return;
    }

    const cached = localStorage.getItem(value);
    if (cached) {
      this.setState({ list: JSON.parse(cached) });
      return;
    }

    fetch('https://search?query=' + value)
      .then(response => response.json())
      .then(result => {
        localStorage.setItem(value, JSON.stringify(result.list));
        this.setState({ list: result.list });
      });

  }

  render() {
    return (
      <div>

        <form type = "submit" onSubmit = {this.onSearch}>
          <input type = "text" ref = {node => this.input = node} />
          <button type = "button">Search</button>
        </form>

        {
          this.state.list &&
          this.state.list.map(item => <div key = {item.objectID}>{item.title}</div>)
        }
      </div>
  }

}
Ответ принят как подходящий

Судя по вашему вопросу, похоже, что вы

  • на вашей странице есть продукты, которые вы представляете как элементы <div>
  • меняют границу при нажатии
  • хотите, чтобы они отображались выбранными, когда пользователь обновляет страницу

React касается представления некоторых данных, но не решает, как вы разместите эти данные на странице. Похоже, вы хотите где-то сохранить список выбранные продукты, а затем снова загрузить этот список на страницу, когда пользователь обновится. API веб-хранилища может быть полезным, но файлы cookie и сеансы могут делать то же самое.

Тебе следует

  • выберите, что хранить (возможно, список идентификаторов товаров)
  • выберите, где его хранить (localStorage, cookie, сервер или, возможно, в URL-адресе с https://reach.tech/router)
  • когда ваша страница реакции загружается (componentDidMount для некоторого компонента), прочтите список из localstorage в свое состояние
  • сопоставьте свой список «выбранных продуктов» с вашими отдельными продуктами в render

Итак, если вы загрузили список из одного из вариантов хранения в свое состояние как selectedProductIds, а ваш список продуктов находится в состоянии как products

isSelected = (product) => {
   this.state.selectedProductIds.includes(product.id)
}

render() {
  return <section>
    { this.state.products.map((product) =>
        <div className = {this.isSelected(product) ? 'selected item' : 'item'}>
           {product.name}
        </div>
    )}
  </section>
}

Синхронизация состояния React с каким-либо другим механизмом хранения может стать довольно запутанной.

Другие вопросы по теме