i am creating a netflix clone like app and in here in my /youtube/movie component when i use useLOcation hook and fetch data from another component (./movielist)
it says "Property 'movie' does not exist on type 'Location'"
in my ./movie.js file so what i am doing wrong here and why i am unable to fetch data from uselocation hook
./movie.js
import { Link, useLocation } from "react-router-dom";
import "./movie.css";
import { Publish } from "@material-ui/icons";
export default function Movie() {
const location = useLocation();
const movie = location.movie;
return (
<div className="product">
<div className="productTitleContainer">
<h1 className="productTitle">Movie</h1>
<Link to="/newproduct">
<button className="productAddButton">Create</button>
</Link>
</div>
<div className="productTop">
<div className="productTopRight">
<div className="productInfoTop">
<img src={movie.img} alt="" className="productInfoImg" />
<span className="productName">{movie.title}</span>
</div>
<div className="productInfoBottom">
<div className="productInfoItem">
<span className="productInfoKey">id:</span>
<span className="productInfoValue">{movie._id}</span>
</div>
<div className="productInfoItem">
<span className="productInfoKey">genre:</span>
<span className="productInfoValue">{movie.genre}</span>
</div>
<div className="productInfoItem">
<span className="productInfoKey">year:</span>
<span className="productInfoValue">{movie.year}</span>
</div>
<div className="productInfoItem">
<span className="productInfoKey">limit:</span>
<span className="productInfoValue">{movie.limit}</span>
</div>
</div>
</div>
</div>
<div className="productBottom">
<form className="productForm">
<div className="productFormLeft">
<label>Movie Title</label>
<input type="text" placeholder={movie.title} />
<label>Year</label>
<input type="text" placeholder={movie.year} />
<label>Genre</label>
<input type="text" placeholder={movie.genre} />
<label>Limit</label>
<input type="text" placeholder={movie.limit} />
<label>Trailer</label>
<input type="file" placeholder={movie.trailer} />
<label>Video</label>
<input type="file" placeholder={movie.video} />
</div>
<div className="productFormRight">
<div className="productUpload">
<img
src={movie.img}
alt=""
className="productUploadImg"
/>
<label for="file">
<Publish />
</label>
<input type="file" id="file" style={{ display: "none" }} />
</div>
<button className="productButton">Update</button>
</div>
</form>
</div>
</div>
);
}
./movieList.js
import { DataGrid } from "@material-ui/data-grid";
import { DeleteOutline } from "@material-ui/icons";
import "./movielist.css";
import { Link } from "react-router-dom";
import { useContext, useEffect } from "react";
import { deleteMovie, MoviesLogin } from "../../ContextAPI/MovieContext/ApiLoginCall";
import { MovieContext } from "../../ContextAPI/MovieContext/Auth";
export default function MovieList() {
const { movies, dispatch } = useContext(MovieContext);
useEffect(() => {
MoviesLogin(dispatch);
}, [dispatch]);
const handleDelete = (id) => {
deleteMovie(id, dispatch);
};
const columns = [
{ field: "_id", headerName: "ID", width: 90 },
{
field: "movie",
headerName: "Movie",
width: 200,
renderCell: (params) => {
return (
<div className="productListItem">
<img className="productListImg" src={params.row.img} alt="" />
{params.row.title}
</div>
);
},
},
{ field: "genre", headerName: "Genre", width: 120 },
{ field: "year", headerName: "year", width: 120 },
{ field: "limit", headerName: "limit", width: 120 },
{ field: "isSeries", headerName: "isSeries", width: 120 },
{
field: "action",
headerName: "Action",
width: 150,
renderCell: (params) => {
return (
<>
<Link
to={{ pathname: "/movie/" params.row._id, movie: params.row }}
>
<button className="productListEdit">Edit</button>
</Link>
<DeleteOutline
className="productListDelete"
onClick={() => handleDelete(params.row._id)}
/>
</>
);
},
},
];
return (
<div className="productList">
<DataGrid
rows={movies}
disableSelectionOnClick
columns={columns}
pageSize={8}
checkboxSelection
getRowId={(r) => r._id}
/>
</div>
);
}
code - https://github.com/priyanshu740/netflix-clone-mern
tutorial from where i am taking refrence - https://github.com/safak/youtube/blob/mern-netflix-app/admin/src/App.js(i am at 3 hr 26 min)
CodePudding user response:
You need to pass the data in the state property. so just do this:
<Link to={{ pathname: "/movie/" params.row._id, state: {movie: params.row} }}>
and where you are destructuring it out of location, just do this:
const movie = location.state?.movie;
CodePudding user response:
The way you're passing to
prop into Link
router component is alright.
In movie
component you can use destructuring as follows for history
object.
const { location } = history;
const { state } = location;
const { movie } = state || {};