Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/reactjs/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Reactjs 如何添加用于从列表中删除单个项的事件处理程序?_Reactjs - Fatal编程技术网

Reactjs 如何添加用于从列表中删除单个项的事件处理程序?

Reactjs 如何添加用于从列表中删除单个项的事件处理程序?,reactjs,Reactjs,我有以下代码,我想添加一个偶数处理程序,用于检测何时单击了delete按钮,然后从列表中删除特定项 收藏夹.js constructor(props) { super(props); this.state = { movies: [] }; this.clearSaved = this.clearSaved.bind(this); this.handleDelete = this.hand

我有以下代码,我想添加一个偶数处理程序,用于检测何时单击了delete按钮,然后从列表中删除特定项

收藏夹.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>)
}
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
    s
    onDeleteMovie
    prop

    
    
    您尝试过什么吗?这是否回答了您的问题?TypeError:无法访问未定义TypeError的属性“setState”:props.handleDelete不是函数TypeError:props.handleDelete不是函数我也犯了一个错误,我编写了电影而不是MovieList,并从状态传递了电影。我猜你有一些类似于收藏夹组件的东西。别担心,我也在更新。好吧,它们有公共imdbID吗?预计所有项目都会被删除。这就是为什么我在不知道数据的情况下使用索引。我可以最后一次将答案更改为使用索引。我已经最后一次更新了答案。这样试试看。祝你好运。:-)