Built at: 2024-10-16T09:55:25.150Z Skip to content

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
}
]
}
Terminal window
pnpm i -g json-server
json-server --port 3001 --watch db.json

Visit http://localhost:3001/notes

axios

Terminal window
pnpm i axios
pnpm i json-server -D

Add command in scripts section of package.json

package.json
{
// ...
"scripts": {
// ...
"server": "json-server -p 3001 --watch db.json"
},
}
Terminal window
pnpm run server
index.js
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 />);

Exercises

2.11 The phonebook step 6

db.json
{
"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 axios
pnpm i json-server -D
pnpm json-server -p 3001 --watch db.json
App.js
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;
Terminal window
pnpm start