Reactjs 如何添加用于从列表中删除单个项的事件处理程序?
我有以下代码,我想添加一个偶数处理程序,用于检测何时单击了delete按钮,然后从列表中删除特定项 收藏夹.jsReactjs 如何添加用于从列表中删除单个项的事件处理程序?,reactjs,Reactjs,我有以下代码,我想添加一个偶数处理程序,用于检测何时单击了delete按钮,然后从列表中删除特定项 收藏夹.js constructor(props) { super(props); this.state = { movies: [] }; this.clearSaved = this.clearSaved.bind(this); this.handleDelete = this.hand
constructor(props) {
super(props);
this.state = {
movies: []
};
this.clearSaved = this.clearSaved.bind(this);
this.handleDelete = this.handleDelete.bind(this);
}
export default ({ movies }) => {
return(
<div id="saved-movies-list">
<ul className="saved-movies-list">
{ movies.map(movie => <li key={ movie.imdbID }><Movie movie={ movie } /></li>) }
</ul>
</div>
)
};
const Movie = ({movie}) => {
return (<div className="movie-card" id={movie.imdbID}>
{
// eslint-disable-next-line
movie.poster == 'N/A' ?
<div className="movie-card-poster missing">
<img className="d-block h-100" src={movie_poster} alt="" />
</div>
:
<div className="movie-card-poster">
<img className="d-block h-100" src={movie.poster} alt="" />
</div>
}
<div className="body">
<div style={{ maxWidth: '80%' }}>
<h5 class="card-title">{movie.title}</h5>
</div>
<p className="text-secondary">{ movie.year }</p>
{!movie.runtime ? "" : <p className="text-secondary">{ movie.runtime }</p>}
<p className="plot">{movie.description}</p>
<a href="#" className="delete-movie" title="Remove this movie"><FontAwesomeIcon icon="minus-circle" size="1x" /></a>
</div>
</div>)
}
MovieList.js
constructor(props) {
super(props);
this.state = {
movies: []
};
this.clearSaved = this.clearSaved.bind(this);
this.handleDelete = this.handleDelete.bind(this);
}
export default ({ movies }) => {
return(
<div id="saved-movies-list">
<ul className="saved-movies-list">
{ movies.map(movie => <li key={ movie.imdbID }><Movie movie={ movie } /></li>) }
</ul>
</div>
)
};
const Movie = ({movie}) => {
return (<div className="movie-card" id={movie.imdbID}>
{
// eslint-disable-next-line
movie.poster == 'N/A' ?
<div className="movie-card-poster missing">
<img className="d-block h-100" src={movie_poster} alt="" />
</div>
:
<div className="movie-card-poster">
<img className="d-block h-100" src={movie.poster} alt="" />
</div>
}
<div className="body">
<div style={{ maxWidth: '80%' }}>
<h5 class="card-title">{movie.title}</h5>
</div>
<p className="text-secondary">{ movie.year }</p>
{!movie.runtime ? "" : <p className="text-secondary">{ movie.runtime }</p>}
<p className="plot">{movie.description}</p>
<a href="#" className="delete-movie" title="Remove this movie"><FontAwesomeIcon icon="minus-circle" size="1x" /></a>
</div>
</div>)
}
导出默认值({movies})=>{
返回(
{movies.map(movie=>)}
)
};
Movie.js
constructor(props) {
super(props);
this.state = {
movies: []
};
this.clearSaved = this.clearSaved.bind(this);
this.handleDelete = this.handleDelete.bind(this);
}
export default ({ movies }) => {
return(
<div id="saved-movies-list">
<ul className="saved-movies-list">
{ movies.map(movie => <li key={ movie.imdbID }><Movie movie={ movie } /></li>) }
</ul>
</div>
)
};
const Movie = ({movie}) => {
return (<div className="movie-card" id={movie.imdbID}>
{
// eslint-disable-next-line
movie.poster == 'N/A' ?
<div className="movie-card-poster missing">
<img className="d-block h-100" src={movie_poster} alt="" />
</div>
:
<div className="movie-card-poster">
<img className="d-block h-100" src={movie.poster} alt="" />
</div>
}
<div className="body">
<div style={{ maxWidth: '80%' }}>
<h5 class="card-title">{movie.title}</h5>
</div>
<p className="text-secondary">{ movie.year }</p>
{!movie.runtime ? "" : <p className="text-secondary">{ movie.runtime }</p>}
<p className="plot">{movie.description}</p>
<a href="#" className="delete-movie" title="Remove this movie"><FontAwesomeIcon icon="minus-circle" size="1x" /></a>
</div>
</div>)
}
const Movie=({Movie})=>{
报税表(
{
//eslint禁用下一行
movie.poster==‘不适用’?
:
}
{movie.title}
{movie.year}
{!movie.runtime?“:{movie.runtime}
}
{movie.description}
)
}
我需要将事件附加到此行:
<a href="#" className="delete-movie" title="Remove this movie"><FontAwesomeIcon icon="minus-circle" size="1x" /></a>
但是,我不知道该怎么做?写这个。道具。。。不行 导出默认值({movies})=>{
常量handleDelete=(id)=>{
//使用项目id在此处写入删除逻辑
}
返回(
{
movies.map(电影=>
-
handleDelete(movie.imbID)}
/>
)
}
)
};
在Moive.js中
const Movie=({Movie,onDelete})=>{
返回(
...
...
)
}
我将带有参数项id的
handleDelete作为onDelete函数传递给每个子组件。对于事件处理程序,可以使用简单的onClick
事件,如下所示:
{ movies.map(movie => <li onClick={()=>handleClick(movie.imdbID)} key={ movie.imdbID }><Movie movie={ movie } /></li>) }
在要声明电影的文件中,也声明此函数
将其作为道具传递给电影
,并使用like
在电影中
组件:
在你的电影
组件中添加一个回调道具,调用你喜欢的任何东西,例如:onDelete
然后添加调用回调属性的handleClick
处理程序
const handleClick=(事件)=>{
event.preventDefault();
props.onDelete();//此回调来自您的“电影”道具。
}
并将其传递给锚元素的onClick
属性
在MovieList
组件中:
在MovieList
组件中添加回调道具,并将其称为onDeleteMovie
导出默认值(道具)=>{
然后将其放入您的电影
的onDelete
道具中,如下所示:
{ movies.map(movie => <li onClick={()=>handleClick(movie.imdbID)} key={ movie.imdbID }><Movie movie={ movie } /></li>) }
{props.movies.map((电影,索引)=>
//因为imdbID毕竟不是唯一的,所以使用索引
props.onDeleteMovie(索引)}
/>
)}
在收藏夹中组件:
在Favorites
组件中添加一个类似以下内容的handleDelete
方法
handleDelete(索引){
const movies=[…this.state.movies];
电影.剪接(索引,1);
this.setState({movies});
}
并将其传递给您的MovieList
sonDeleteMovie
prop
您尝试过什么吗?这是否回答了您的问题?TypeError:无法访问未定义TypeError的属性“setState”:props.handleDelete不是函数TypeError:props.handleDelete不是函数我也犯了一个错误,我编写了电影而不是MovieList,并从状态传递了电影。我猜你有一些类似于收藏夹组件的东西。别担心,我也在更新。好吧,它们有公共imdbID吗?预计所有项目都会被删除。这就是为什么我在不知道数据的情况下使用索引。我可以最后一次将答案更改为使用索引。我已经最后一次更新了答案。这样试试看。祝你好运。:-)