DEV Community

Cover image for Create a Notes app with React and javascript Localstorage.
Gbadebo ifedayo
Gbadebo ifedayo

Posted on • Edited on

Create a Notes app with React and javascript Localstorage.

A notes app is a crucial tool for recording information that has to be retrieved later.
In this tutorial, we'll create a working notes app with features like note deletion, we'll utilise react hooks to store the notes and use localstorage to keep our notes even when the browser is closed.

The prerequisites for this project are:

  • Knowledge of CSS, Javascript, React.js
  • Latest version of Node.js installed

Getting started

If you have npm and Node.js installed, create a new react app notes-app. We'll achieve this using npx create-react-app

Creating our components

First, we make a components folder in the app's src directory which will store our components - Note, Notes and Createnote. Additionally, it will have a CSS folder in which our app's styles will be kept.

Storing necessary data

Both the text that is presently being typed and the list of notes that we currently have must be stores in order for them to be used in the notes application.
To achieve this, in our Notes.js file we import react and useState from react.

import React,{useState} from 'react'

Enter fullscreen mode Exit fullscreen mode

Then we use the useState hook to store our notes array and input text.

    const [notes,setNotes]=useState([])
    const [text,setText]=useState('')
Enter fullscreen mode Exit fullscreen mode

Building the basic procedures of the notes app

We will create the functions that will update input text, save and delete a note.

    const updateText=(e)=>{
        setText(e.target.value)
    }

    const saveNote=()=>{
        setNotes((prevState)=>[
            ...prevState , {
                key:uuid(),
                id:uuid(),
                text:text,
            }
        ]);
        setText('');
    }

    const deleteNote =(id)=>{
        const filteredNotes=notes.filter((note)=>{return note.id !== id});
        setNotes(filteredNotes);
    }
Enter fullscreen mode Exit fullscreen mode

In the above code

  • updateText function takes the user's keyboard input and stores it in the text variable using the useState hook.

  • saveNote function creates a new object and adds it to the existing notes array. We create a key and an id for the object in order to construct arrays in React and delete a note respectively.
    They are generated with uuid v4. You can install it as follows:

npm install uuidv4
Enter fullscreen mode Exit fullscreen mode

And use it as follows:

import { v4 as uuid } from "uuid";
Enter fullscreen mode Exit fullscreen mode

The text parameter will be assigned to the value of text, that is our desired text cotent for the note. The value of text was then set to empty in order to create new content for our future note.

  • deleteNote function takes in the id of our note as a parameter, uses the filter method to return all notes except for that which it's id has been passed to the function.

Constructing the body of our notes app

We want the structure of our notes app to first display all saved notes, then display an input field to create a new note.

 return(
        <div className='Notes'>
            {notes.map((note)=>(
            <Note deleteNote={deleteNote} id={note.id} text={note.text}/>
            ))}
            <Createnote updateText={updateText} saveNote={saveNote} inputText={text} />
        </div>
    )
Enter fullscreen mode Exit fullscreen mode

First of all, we call a map method on the notes array, the note is passed deleteNote, id, and text props which will be utilised to make it perform it's functions. The id and text prop are passed to the value of the note's id key and text key respectively.

Then, we include our Createnote component and pass the necessary functions to the updateText and saveNote props. text is passed to the inputText prop and is used in the Createnote component to update the value of our textarea.

Preparing the Note component

After we created the notes app's general framework, the next task is to head over to Note.js and develop the Note component by typing the following:

import React from "react"


function Note({id,deleteNote,text}){
    return(
        <div className="note">
            <div className="note-body">{text}</div>
            <div className="note-footer">
                <button onClick={()=> deleteNote(id)}>Delete</button>
            </div>
        </div>
    )
}

export default Note
Enter fullscreen mode Exit fullscreen mode

The note-body div contains the content of the note therefore the value of text is passed to it. Remember that this is the content that is stored in the note object when a new note is saved.
The note-footer div contains the delete button that performs a function when clicked. The function calls our deleteNote function located in Notes.js with id passed as a parameter.

Building our Createnote component

We have successfully completed the structure of our note, but we still need a textarea to collect the user's input and store it as a new note. In Createnote.js, we add the following:

import React from 'react'

function Createnote({updateText,saveNote,inputText}){

    return (
        <div className='note' >
            <textarea onChange={updateText} maxLength={100} placeholder='Type Here...' value={inputText} ></textarea>
            <div className='note-footer'>
                <button onClick={saveNote}>Save note</button>
            </div>
        </div>
    )
}


export default Createnote
Enter fullscreen mode Exit fullscreen mode

All text is inputed into a textarea with a maximum length of 100 characters, the value is also set to inputText so that the textarea can be cleared once we save the note. We add onChange attribute to the textarea in order to update the text in our Notes component. The note-footer div contains the delete button that perform the saveNote function when clicked.
Next, we include a counter to let the user know how many characters are still available for input.

    const maxLength=100;
    const counter=maxLength-inputText.length;
    return (
        <div className='note' >
            <textarea onChange={updateText} maxLength={100} placeholder='Type Here...' value={inputText} ></textarea>
            <div className='note-footer'>
                <span>{counter}</span>
                <button onClick={saveNote}>Save note</button>
            </div>
        </div>
    )
Enter fullscreen mode Exit fullscreen mode

Storing notes with localstorage

Our notes app is complete but we don't what to lose our saved notes when the browser is closed, we prevent this by using javascript localstorage and useEffect hook. notes is included in the square bracket of the useEffect function to make sure our notes are saved upon every render in which notes is updated.

    useEffect(()=>{localStorage.setItem('Notes',JSON.stringify(notes))},[notes]);

    useEffect(()=>{const data=JSON.parse(localStorage.getItem('Notes'));setNotes(data)},[]);

Enter fullscreen mode Exit fullscreen mode

useEffect has to be imported from react for this to work.

import React,{useState,useEffect} from 'react'
Enter fullscreen mode Exit fullscreen mode

Linking our components

We've created our Note and Createnote conponents, next we import them in Notes.js in order to make our note app fully functional.

import Note from './Note'
import Createnote from './Createnote'
import Note from './Note'
Enter fullscreen mode Exit fullscreen mode

Our app won't display yet because we still haven't imported the Notes component into App.js. We complete the body of our notes app with the following:

import React from 'react'
import './App.css';
import Notes from './components/Notes.js'

function App() {

  return (
    <div className="App">
      <h1>Notes</h1>
      <Notes />
    </div>
  );
}

export default App;

Enter fullscreen mode Exit fullscreen mode

Styling our app

The styles for notes app will be stored in our notes.css file located in our css folder.

.note{
    height: 250px;
    margin-right: 10px;
    border-radius: 35px;
    width: 30%;
    position: relative;
    display: inline-block;
    vertical-align: top;
    border: 2px solid black;
    margin-bottom: 20px;
    background-color: #f9ce69;
}
textarea{
    outline: none;
    resize: none;
    border: none;
    background: transparent;
    box-sizing: border-box;
    max-width: 100%;
    min-width: 100%;
    max-height: 82%;
    min-height: 82%;
    font-size: 25px;
    line-height: 35px;
    padding: 10px 0 0 10px;
}

.note-body{
    line-height: 35px;
    padding: 10px 0 0 10px;
    font-size: 25px;
    height: 82%;
}


button{
    background-color: #4741a6;
    padding: 10px 15px;
    float: right;
    border: none;
    border-radius: 15px;
    font-size: 15px;
    color: white;

    position: absolute;
    bottom: 10px;
    right: 10px;
}
span{
    color: red;
    padding-left: 10px;
    font-weight: 600;
}


Enter fullscreen mode Exit fullscreen mode

Conclusion

This article demonstrated how to build a straightforward notes app which saves notes even if the browser is lost. Additionally, it explains how to use react hooks to store items and carry out specific tasks automatically.
The Github repository is located here and a live demo of the site is hosted on vercel.

Top comments (0)