MERN SHOW
Let's add a function that will select a holiday when a mouse hovers over one in our list
First, let's add a property to state
const [holidays, setHolidays] = useState([]);
const [holiday, setHoliday] = useState(null);
Let's call setHoliday on mouseover. Again because we want to pass an argument, we must wrap this in an anonymous function
<tr key={index} onMouseOver={() => setHoliday(holiday)}></tr>
Let's show our Show component if holiday has a non false-y value, right after our table
<Show holiday={holiday} />
Create and import the Show component
const Show = ({ holiday }) => {
if (holiday === null) {
return null;
}
const celebrated = holiday.celebrated ? "Yes" : "No";
return (
<div>
<h2>{holiday.name}</h2>
<h3>Celebrated: {celebrated}</h3>
<p>{holiday.description}</p>
<p>Likes: {holiday.likes}</p>
<ul>
{holiday.tags.map((tag) => (
<li>{tag}</li>
))}
</ul>
</div>
);
};
export default Show;
Import into App.js
import Show from "./components/Show.js";
COMPLETED CODE:
App.js
import "bulma/css/bulma.css";
import { useEffect, useState } from "react";
import NewForm from "./components/NewForm";
import Show from "./components/Show";
const App = () => {
const [holidays, setHolidays] = useState([]);
const [holiday, setHoliday] = useState(null);
const addHoliday = (holiday) => {
setHolidays([...holidays, holiday]);
};
const deleteHoliday = (id) => {
fetch("/holidays/" + id, {
method: "DELETE",
}).then((response) => {
setHolidays(holidays.filter((day) => day._id !== id));
});
};
useEffect(() => {
fetch("/holidays")
.then(
(data) => data.json(),
(err) => console.log(err)
)
.then(
(parsedData) => setHolidays(parsedData),
(err) => console.log(err)
);
}, []);
return (
<div className="container">
<h1 className="title">Holidays! Celebrate!</h1>
<NewForm handleAddHoliday={addHoliday} />
<Show holiday={holiday} />
<table>
<tbody>
{holidays.map((holiday) => {
return (
<tr key={holiday._id} onMouseOver={() => setHoliday(holiday)}>
<td> {holiday.name}</td>
<td onClick={() => deleteHoliday(holiday._id)}>X</td>
</tr>
);
})}
</tbody>
</table>
</div>
);
};
export default App;