Как хранить несколько однотипных данных в локальном хранилище?

Я пытался сделать Список дел для обучения для PHP. Я использовал классы начальной загрузки: collapse и list-group. Каждый тег списка имеет 2 значка, которые служат для счетчиков.

Значок 1 = нет времени, когда я выучил или пересмотрел главу.

Значок 2 = нет времени Я фактически использовал концепцию из главы.

Когда я нажимаю на значки, их количество должно увеличиваться на единицу. Позже я добавлю опции для добавления новых глав и подразделов.

На данный момент я хочу сохранить значения значков в моем локальном хранилище для дальнейшего использования.

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

Я уже знаю, как получать и извлекать данные из локального хранилища, но не знаю, как это реализовать в текущей ситуации.

var badges= document.querySelectorAll('.badge');
badges.forEach(function (e) {
	e.addEventListener('click', incrementBadge);
});

function incrementBadge(e){
  let num =Number(e.target.textContent)+1;
  e.target.textContent=num;
}
<link rel = "stylesheet" href = "https://stackpath.bootstrapcdn.com/bootstrap/4.1.0/css/bootstrap.min.css" integrity = "sha384-9gVQ4dYFwwWSjIDZnLEWnxCjeSWFphJiwGPXr1jddIhOegiu1FwO5qRGvFXOdJZ4" crossorigin = "anonymous">

<div class = "container mt-5">
 <div class = "row">
	<div class = "col-lg-6">
	<button class = "btn btn-block btn-info" data-toggle = "collapse" data-target = "#php">Php</button>
	<div class = "collapse" id = "php">
		<ul class = "list-group  mt-0">
			<li class = "list-group-item">Iteration
				<span data-type = "revise"class = "badge badge-info float-right">4</span>
				<span data-type = "practice" class = "badge badge-success float-right mr-3">2</span>
			</li>
			<li class = "list-group-item">Selection
				<span data-type = "revise" class = "badge badge-info float-right">0</span>
				<span data-type = "practice" class = "badge badge-success float-right mr-3">2</span>
			</li> 
		</ul>						
		</div>
	</div>
 </div>
</div>



<script src = "https://code.jquery.com/jquery-3.3.1.slim.min.js" integrity = "sha384-q8i/X+965DzO0rT7abK41JStQIAqVgRVzpbzo5smXKp4YfRvH+8abtTE1Pi6jizo" crossorigin = "anonymous"></script>
<script src = "https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.0/umd/popper.min.js" integrity = "sha384-cs/chFZiN24E4KMATLdqdvsezGxaGsi4hLGOzlXwp5UZB1LY//20VyM2taTB4QvJ" crossorigin = "anonymous"></script>
<script src = "https://stackpath.bootstrapcdn.com/bootstrap/4.1.0/js/bootstrap.min.js" integrity = "sha384-uefMccjFJAIv6A+rW+L4AHf99KvxDjWSu1z9VI8SKNVmz4sk7buKt/6v9KI65qnm" crossorigin = "anonymous"></script>

Сделать это несложно. Вы сами пробовали писать код? Вот документация. Ваша стратегия будет заключаться в настройке следующей логики: 1) назначить значения значка из локального хранилища при загрузке страницы для любых значений, которые установлены в локальном хранилище, и 2) записать в локальное хранилище в событии щелчка, чтобы обновить значение для щелкнул значок. Вероятно, самое сложное - решить, как однозначно идентифицировать значки при их хранении.

Joseph Marikle 02.05.2018 17:02

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

TechXpert 02.05.2018 17:09

Если вы запустите свой сниппет сейчас, что идентифицирует ваши две строки? Это лейблы Iteration и Selection, верно? Если вы не свяжете эти строки с числовым идентификатором, это ваш уникальный идентификатор прямо здесь. Следующий вопрос - как получить этот текстовый идентификатор из разметки в свой javascript. У вас есть идеи, как этого добиться? Если бы это был я, я бы начал с добавления этих строк в качестве атрибута где-нибудь в разметке. Как вы думаете, куда лучше всего пойти?

Joseph Marikle 02.05.2018 17:13

Сначала я попытался использовать заголовок главы и данные текущего списка для ключа данных, которые нужно сохранить, и я получил значение значка, по которому щелкают, с некоторым регулярным выражением. Спасибо, Джозеф, я думаю, у меня есть идея. Я буду использовать массив с названием главы (т.е. php), а числовой идентификатор строк будет использоваться в качестве индекса для массива. но я все еще не могу придумать, как определить, какие значки и их значения, сохранить их в паре ключ-значение и получить их позже

TechXpert 02.05.2018 17:20

Отлично. Как определить значок. Вы уже знаете, какой из них был выбран при доступе к e.target. Исходя из этого, вы уже получаете доступ к значению с помощью .textContent, который работает. Вы можете использовать e.target.getAttribute('your-attribute-name'). При этом вы можете разместить свой ключ для этого значения на самом значке с помощью <span class = "badge badge-info float-right" your-attribute-name = "whatever">. Вы также можете получить доступ к родительскому атрибуту с помощью e.target.parentNode.getAttribute('whatever'). Выбор за вами. Не могли бы вы обновить свой вопрос аналогичной логикой?

Joseph Marikle 02.05.2018 17:26

Я просто добавил идентификаторы для значков (потренироваться и пересмотреть) Оттуда, как мне перейти к получению их индивидуальных значений. key = php [индекс строки], значение = ??

TechXpert 02.05.2018 17:28
id - это атрибут, который вы можете использовать, но с ним нужно быть осторожным. Чтобы ваш HTML был действительным, они должны быть уникальными. В настоящее время ваши id не уникальны. Кроме того, значение, которое вы им присвоили, является не столько уникальным идентификатором, сколько категорией. Я бы предложил заменить их с id = "revise" и id = "practice" на data-type = "revise" и data-type = "practice" соответственно. соглашение data- не требуется, но более семантически корректно указывать префикс ваших настраиваемых атрибутов с помощью data-.
Joseph Marikle 02.05.2018 17:31

Я понял вашу точку зрения, и оттуда, как мне продолжить в js для хранения значений значков. Какие-либо предложения. Я просто не могу правильно думать, лол.

TechXpert 02.05.2018 17:36

Итак, теперь вы можете выбрать тип значка, но у вас все еще нет строки. Вы можете использовать тот же процесс для идентификации строк (например, <li class = "list-group-item" data-id = "selection">). Из вашего javascript вы получаете доступ к этим значениям с помощью getAttribute. Внутри атрибута click вы можете создать уникальный идентификатор (строка + тип), обратившись к e.target.parentNode.getAttribute('data-id') и e.target.getAttribute('data-type'). Оттуда вы можете объединить их в уникальную строку (например, "iteration.practice") или добавить их в объект javascript (например, [{id:"iteration",type:"practice"}]).

Joseph Marikle 02.05.2018 17:45

Таким образом, используя приведенный выше пример, можно создать уникальную строку с помощью let key = e.target.parentNode.getAttribute('data-id') + '.' + e.target.getAttribute('data-type'). Это будет ваш ключ, который вы будете использовать в своем локальном хранилище.

Joseph Marikle 02.05.2018 17:46

Спасибо за ваше предложение. Код теперь может храниться с парой ключ-значение, но другая проблема заключается в том, как получить значения из LS и отобразить их обратно на значки в соответствующих строках.

TechXpert 02.05.2018 18:13

Верный. Какой формат вы выбрали для ключа локального хранилища?

Joseph Marikle 02.05.2018 18:19

ключ = e.target.parentNode.getAttribute ('data-id') + '.' + e.target.getAttribute ('тип данных'); например, iteration.practice = 3;

TechXpert 02.05.2018 18:20
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
13
415
1

Ответы 1

Теперь, когда вы создали базу кода, в которой хранятся данные, ваша проблема получения данных становится тривиальной. Вы уже перебираете значки, поэтому на этом же этапе вы можете легко установить значение на основе локального хранилища. Если ключ не существует в локальном хранилище, .getItem вернет null. Это позволяет вам установить значение по умолчанию, используя логический оператор ИЛИ. Ваш код "получения" может быть следующим:

let key = e.parentNode.getAttribute('data-id') + '.' + e.getAttribute('data-type');
e.textContent = localStorage.getItem(key) || 0;

StackOverflow помещает редактор фрагментов в песочницу, поэтому код локального хранилища в следующем фрагменте закомментирован. Однако вы можете увидеть это в действии в этой скрипке.

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

var badges= document.querySelectorAll('.badge');
badges.forEach(function (e) {
  let key = e.parentNode.getAttribute('data-id') + '.' + e.getAttribute('data-type');
	//e.textContent = localStorage.getItem(key) || 0;
	e.addEventListener('click', incrementBadge);
});

function incrementBadge(e){
  let num =Number(e.target.textContent)+1;
  let key = e.target.parentNode.getAttribute('data-id') + '.' + e.target.getAttribute('data-type');
  //localStorage.setItem(key, num);
  e.target.textContent=num;
}
<link rel = "stylesheet" href = "https://stackpath.bootstrapcdn.com/bootstrap/4.1.0/css/bootstrap.min.css" integrity = "sha384-9gVQ4dYFwwWSjIDZnLEWnxCjeSWFphJiwGPXr1jddIhOegiu1FwO5qRGvFXOdJZ4" crossorigin = "anonymous">

<div class = "container mt-5">
 <div class = "row">
	<div class = "col-lg-6">
	<button class = "btn btn-block btn-info" data-toggle = "collapse" data-target = "#php">Php</button>
	<div class = "collapse" id = "php">
		<ul class = "list-group  mt-0">
			<li class = "list-group-item" data-id = "iteration">Iteration
				<span data-type = "revise"class = "badge badge-info float-right">4</span>
				<span data-type = "practice" class = "badge badge-success float-right mr-3">2</span>
			</li>
			<li class = "list-group-item" data-id = "selection">Selection
				<span data-type = "revise" class = "badge badge-info float-right">0</span>
				<span data-type = "practice" class = "badge badge-success float-right mr-3">2</span>
			</li> 
		</ul>						
		</div>
	</div>
 </div>
</div>



<script src = "https://code.jquery.com/jquery-3.3.1.slim.min.js" integrity = "sha384-q8i/X+965DzO0rT7abK41JStQIAqVgRVzpbzo5smXKp4YfRvH+8abtTE1Pi6jizo" crossorigin = "anonymous"></script>
<script src = "https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.0/umd/popper.min.js" integrity = "sha384-cs/chFZiN24E4KMATLdqdvsezGxaGsi4hLGOzlXwp5UZB1LY//20VyM2taTB4QvJ" crossorigin = "anonymous"></script>
<script src = "https://stackpath.bootstrapcdn.com/bootstrap/4.1.0/js/bootstrap.min.js" integrity = "sha384-uefMccjFJAIv6A+rW+L4AHf99KvxDjWSu1z9VI8SKNVmz4sk7buKt/6v9KI65qnm" crossorigin = "anonymous"></script>

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

TechXpert 02.05.2018 19:34

@TechXpert Круто! Рад, что смог помочь. :)

Joseph Marikle 02.05.2018 19:37

Привет, Джозеф, я только что завершил финальную версию проекта и хочу, чтобы вы рассмотрели его: jsfiddle.net/yuvraj034c/pznjpb2c Однако локальное хранилище и значки и не увеличиваются на скрипте Js. Он отлично работает в моем текстовом редакторе: есть некоторые примечания, которые вам нужно запомнить: во-первых, при добавлении подразделов, напишите идентификатор главы, а затем *, а затем имя подраздела. Например, если вы хотите добавить циклы в php, напишите циклы php * в поле ввода для подразделов. Чтобы удалить подраздел: напишите php.loops (не *) в поле ввода удаления.

TechXpert 03.05.2018 14:38

Если вы хотите удалить главу, введите главу в поле удаления и нажмите кнопку del. Затем откройте консоль и скопируйте предоставленный код, измените значение здесь на имя удаляемой главы (в данном случае php) и перезагрузите страницу.

TechXpert 03.05.2018 14:44

Я хочу еще раз поблагодарить вас за помощь в разработке логики и кода для локального хранилища. Я бы никогда так не подумал. Это вторая или третья рабочая программа, которую я создал для личного пользования. Я все еще изучаю веб-разработку. Я знаю html / css / bootstrap / javascript до ajax (в настоящее время изучаю), базовый php и все. Можете ли вы дать мне несколько советов о том, что и как учить эффективно и быстро.

TechXpert 03.05.2018 14:48

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