part2c
Getting data from server
json-server
db.json in the root folder:
{ "notes": [ { "id": 1, "content": "HTML is easy", "date": "2022-1-17T17:30:31.098Z", "important": true }, { "id": 2, "content": "Browser can execute only JavaScript", "date": "2022-1-17T18:39:34.091Z", "important": false }, { "id": 3, "content": "GET and POST are the most important methods of HTTP protocol", "date": "2022-1-17T19:20:14.298Z", "important": true } ]}
pnpm i -g json-serverjson-server --port 3001 --watch db.json
Visit http://localhost:3001/notes
axios
pnpm i axiospnpm i json-server -D
Add command in scripts section of package.json
{ // ... "scripts": { // ... "server": "json-server -p 3001 --watch db.json" },}
pnpm run server
import ReactDOM from "react-dom/client";import axios from "axios";import App from "./App";
axios.get("http://localhost:3001/notes").then((response) => { const notes = response.data; ReactDOM.createRoot(document.getElementById("root")).render( <App notes={notes} /> );});
Check the http://localhost:3000/
effect-hooks
import ReactDOM from "react-dom/client";import App from "./App";
ReactDOM.createRoot(document.getElementById("root")).render(<App />);
import { useState, useEffect } from 'react'import axios from 'axios'import Note from './components/Note'
const App = () => { const [notes, setNotes] = useState([]) const [newNote, setNewNote] = useState('') const [showAll, setShowAll] = useState(true)
useEffect(() => { console.log('effect') axios .get('http://localhost:3001/notes') .then(response => { console.log('promise fulfilled') setNotes(response.data) }) }, []) console.log('render', notes.length, 'notes')
// ...}
Exercises
2.11 The phonebook step 6
{ "persons":[ { "name": "Arto Hellas", "number": "040-123456", "id": "1" }, { "name": "Ada Lovelace", "number": "39-44-5323523", "id": "2" }, { "name": "Dan Abramov", "number": "12-43-234345", "id": "3" }, { "name": "Mary Poppendieck", "number": "39-23-6423122", "id": "4" } ]}
Serve it on http://localhost:3001/persons
Modify the application and use effect hook to fetch the data from json-server.
My solutions
My solutions:
(Please complete your own solutions before click here.)
2.11 The phonebook step 6
Set db.json
pnpm i axiospnpm i json-server -Dpnpm json-server -p 3001 --watch db.json
import { useState, useEffect } from "react";import axios from "axios";import Filter from "./components/Filter";import PersonForm from "./components/PersonForm";import Persons from "./components/Persons";var _ = require("lodash");
const App = () => { const [persons, setPersons] = useState([]); const [newName, setNewName] = useState(""); const [newNumber, setNewNumber] = useState(""); const [filterName, setFilterName] = useState("");
useEffect(() => { console.log("effect"); axios.get("http://localhost:3001/persons").then((response) => { setPersons(response.data); }); }, []); console.log("render", persons.length, "persons");
const handleNameChange = (event) => { event.preventDefault(); setNewName(event.target.value); }; const handleNumberChange = (event) => { event.preventDefault(); setNewNumber(event.target.value); };
const addPerson = (event) => { event.preventDefault();
if (persons.filter((person) => _.includes(person, newName)).length > 0) { alert(`${newName} is already added to phonebook`); return; } setPersons( persons.concat({ name: newName, number: newNumber, id: persons.length + 1, }) ); setNewName(""); setNewNumber(""); };
const handleFilterName = (event) => { event.preventDefault(); setFilterName(event.target.value); };
const personsToShow = persons.filter((person) => _.includes(person.name.toLowerCase(), filterName.toLowerCase()) );
return ( <div> <h2>Phonebook</h2> <Filter filterName={filterName} onChange={handleFilterName} /> <h2>Add a new</h2> <PersonForm addPerson={addPerson} newName={newName} newNumber={newNumber} handleNameChange={handleNameChange} handleNumberChange={handleNumberChange} /> <h2>Numbers</h2> <Persons personsToShow={personsToShow} /> </div> );};
export default App;
pnpm start