【问题标题】:Passing List Children to the Parent将列表子项传递给父项
【发布时间】:2019-06-22 07:13:17
【问题描述】:
    
    
       I am new to React and trying to understand the basics. I have a child component called movieList that return a list of movies in a table form. 
    const movieList = () =>{ 
        const {movies} = props;
        return (){
        <tbody>
          <Fragment>
            {movies.map((movie, i) => (
            <tr key={i}>
              <td>{movie.title}</td>
              <td>{movie.genre.name}</td>
              <td>{movie.numberInStock}</td>
              <td>{movie.dailyRentalRate}</td>
              <td><button className="btn btn-danger btn-sm" onClick={props.onClick} movie={props.movie}>Delete</button></td>
    
            </tr>
            ))}
    
          </Fragment>
        </tbody>
        } }
    
    
And the Parent

class Movies extends Component {
        constructor(props) {
            super(props);
            this.state = { movies: getMovies(), }

        }

        handleDelete = (movie) => {
            console.log(movie);

        }


        render() {


            return (
                <MoviesList movies={this.state.movies} onClick={() => this.handleDelete(movie)} />
            );
        }
    }

我在桌子上正确地得到了电影列表。但我想在按钮单击时将按钮作为删除目标。我知道我需要将电影作为子组件movieList的道具传递,但我似乎无法弄清楚如何传递电影以便我能够删除。使用 onClick 属性上调用的 handleDelete 函数,我在控制台上得到一个未定义的值。而我希望在点击时获得电影的价值。我如何在 React 中做到这一点。

【问题讨论】:

  • 嗨 Olasunkanmi,试试下面的解决方案,如果有帮助,请告诉我:)

标签: javascript reactjs jsx


【解决方案1】:

很酷,因此您有一个电影列表,您只需要删除正确的电影。我们将尝试通过数组中的索引删除电影。我们将使用array.filter() 方法。参考沙箱:https://codesandbox.io/s/intelligent-dan-uskcy

家长

class Movies extends React.Component {
  constructor(props) {
    super(props);
    this.state = {
      movies: [
        { genre: { name: "Avengers: End Game" }, numberInStock: 100000, dailyRentalRate: 1 },
        { genre: { name: "Harry Potter" }, numberInStock: 20000, dailyRentalRate: 2 },
        { genre: { name: "DBZ" }, numberInStock: 200000, dailyRentalRate: 1}
      ]
    }; // assuming movies is an array
  }

  handleDelete = movieIndex => {
    const { movies } = this.state;
    const updatedMovies = movies.filter((movie, index) => {
      return index !== movieIndex;
    });

    this.setState({
      movies: updatedMovies
    });
  };

  render() {
    return (
      <MovieList movies={this.state.movies} handleDelete={this.handleDelete} />
    );
  }
}

所以handleDelete() 将索引作为参数,我们使用它来创建一个新的电影数组,其中不包括您传入的索引的电影。

然后在MovieList 组件的.map() 中,我们也将使用可用的索引参数,并在事件处理程序props.handleDelete(i) 中传递该索引。这将调用父组件中定义的handleDelete() 函数并更新状态。

孩子

const MovieList = (props) =>{ 
  const {movies} = props;
  return (
    <tbody>
    <Fragment>
      {movies.map((movie, i) => (
      <tr key={i}>
         <td>{movie}</td>
         <td>{movie.genre.name}</td>
         <td>{movie.numberInStock}</td>
         <td>{movie.dailyRentalRate}</td>
         <td><button className="btn btn-danger btn-sm" onClick={() => props.handleDelete(i)} movie={props.movie}>Delete</button></td>
          </tr>
       ))}
     </Fragment>
   </tbody>
  )
}

【讨论】:

    【解决方案2】:

    您需要通过回调传递电影元素。将您的子组件 onlick 更改为:

    onClick={() => props.onClick(movie)}
    

    之后,您需要将回调中的数据传递给您父级中的函数

    onClick={movie => this.handleDelete(movie)}
    

    或者只是

    onClick={this.handleDelete}
    

    那么您需要做的就是从您所在州的列表中删除该电影。然后 React 将从 DOM 中删除该元素:

    handleDelete = (movie) => {
       const { movies } = this.state;
       const newMoviews = movies.slice();
       newMovies.splice(newMovies.findIndex(m => m.title === movie.title), 1)
       this.setState({ movies: newMovies });
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-08-19
      • 2018-12-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多