Local storage is a client-side data storage feature. It is completely JavaScript-based, so no need for server end programming required.
Generally, we are using two types of storage in client end programming.
1. LocalStorage: LocalStorage data will be consistent even after a refresh or close the browser window.
2. Session or Cookies storage: Session or cookies-based storage has a time limit. Generally, cookies data destroy after close the browser window.
Highlight key features of LocalStorage.
- Full JavaScript-based, so no need for any server programming.
- Hold value after close the browser window.
- Can store array and object values as well, but need to convert JSON string format. using a method called JSON.stringify() and JSON.parse()
- LocalStorage provides almost 5MB of data storage.
Four methods are related to LocalStorage
1. getItem() => Get a key value from localStorage Object
2. setItem() => Add Key and value to localStorage
3. removeItem() => Remove paticular item by key
Now let start with an example. This is a simple task management application, an HTML form submit the task detail and we will store them to localStorage and render it on the HTML page.
HTML Code
<div class="wrapper"> <h1 class="page-heading">My Task Board</h1> <div class="task-form"> <form method="post" id="taskGenerate"> <div class="form-field"> <label for="taskName">Task Name</label> <input type="text" name="taskName" id="taskName" required="true"> </div> <div class="form-field"> <label for="taskName">Task Time</label> <input type="text" name="taskTime" id="taskTime" required="true"> </div> <div class="form-field"> <label for="taskDescription">Task Description</label> <textarea name="taskDescription" id="taskDescription" required="true"></textarea> </div> <div class="form-field"> <button type="submit">Submit</button> </div> </form> </div> <div class="task-list-wrapper"> <ul id="taskList"class="task-list-items"> </ul> </div> </div>
CSS Code
body{
margin:0px;
padding:0px;
font-size:100%;
font-family:sans-serif;
}
.wrapper{
max-width:768px;
width:100%;
margin:0px auto;
padding:0px 10px;
}
.wrapper .page-heading{
text-align:center;
margin-top:20px;
}
.task-form{
max-width:500px;
display:block;
border:1px solid;
border-radius:5px;
padding:10px;
margin: 0 auto;
}
.task-form .form-field{
width:100%;
margin-bottom:15px;
}
.form-field label{
width:100%;
clear:both;
display:block;
font-size:16px;
}
.form-field input[type=text], .form-field textarea{
width:100%;
clear:both;
display:block;
font-size:16px;
padding:5px;
border-radius:5px;
}
.form-field button{
max-width:100px;
display:block;
width:100%;
padding:10px;
background-color:#15af44e6;
color:#FFFFFF;
font-size:20px;
text-transform: uppercase;
text-transform: uppercase;
border: 1px solid;
border-radius: 5px;
}
.task-list-wrapper{
display:block;
margin-top:20px;
}
.task-list-items{
list-style:none;
margin:0px;
padding:0px;
display: flex;
/* flex-direction: row; */
flex-wrap: wrap;
width: 100%;
}
.task-list-items li {
list-style: none;
display: block;
max-width: 222px;
margin-right: 12px;
/* flex-flow: column; */
margin-bottom: 20px;
/* flex-grow: 2; */
padding: 10px;
width: 100%;
border: 1px solid;
border-radius: 5px;
max-height:200px;
overflow-y:auto;
/* width: calc(100% / 4); */
/* flex: auto; */
/* justify-content: space-between;
}
JavaScript Code
// render localStorage task list
document.addEventListener("DOMContentLoaded", function(){
renderListData();
});
document.addEventListener('click',function(e){
if(e.target && e.target.className == 'removeTask'){
//console.log(e.target.className);
let removeTaskBtn = e.target // document.querySelectorAll('a.removeTask');
//console.log(removeTaskBtn);
if(removeTaskBtn){
event.preventDefault();
let removeIndex = event.target.getAttribute('data-key');
//console.log(removeIndex);
let tasksList = JSON.parse(localStorage.getItem('tasks_mgmt'));
let removeTaskList = tasksList.splice(removeIndex,1);
//console.log(removeIndex, removeTaskList, tasksList);
localStorage.setItem('tasks_mgmt', JSON.stringify(tasksList));
renderListData();
}
}
});
// submit form and store task
document.querySelector('form#taskGenerate').addEventListener('submit', function(event){
event.preventDefault();
let taskName = document.querySelector('#taskName');
let taskTime = document.querySelector('#taskTime');
let taskDescription = document.querySelector('#taskDescription');
let taskStatus = document.querySelector('#taskDescription');
letNewTask = { 'taskName' : taskName.value, 'taskTime' : taskTime.value, 'taskDescription' : taskDescription.value };
//console.log(taskName,taskTime,taskDescription);
let tasksList;
if(localStorage.getItem('tasks_mgmt') == null){
tasksList = [];
} else {
tasksList = JSON.parse(localStorage.getItem('tasks_mgmt'));
}
tasksList.push(letNewTask);
localStorage.setItem('tasks_mgmt', JSON.stringify(tasksList));
taskName.value = '';
taskTime.value = '';
taskDescription.value = '';
renderListData();
});
function renderListData(){
// Handler when the DOM is fully loaded
const tasks = JSON.parse(localStorage.getItem('tasks_mgmt'));
//console.log(tasks);
let taskList = '';
const taskUlEl = document.querySelector('#taskList');
taskUlEl.innerHTML = '';
tasks.forEach(function(task, index){
taskUlEl.innerHTML += '<li data-key="'+ index +'"><h2>'+task.taskName+'</h2> <p><strong>Time: </strong>'+ task.taskTime +'</p> <p>'+ task.taskDescription +'</p> <a class="removeTask" href="#" data-key="'+ index +'">Remove</a> </li>';
});
}
