将Pass Dispatch传递给onClick事件Redux

4

我正在研究我的第一个React/Redux应用程序,一直遇到将dispatch actions映射到组件中的onClick事件方面的问题。

我已经尝试了几种不同的方法来将onClick事件绑定到dispatch上,但最终总是出现以下两个错误之一:

ReferenceError: onMovieClick is not defined

或者当我成功地绑定函数时,会出现与dispatch is not defined相关的错误。

我的目标 我正在尝试实现从store中删除(filter)电影的功能。

actions/movieActions.js

import * as actionTypes from './actionTypes'

export const createMovie = (movie) => {
  return {
    type: actionTypes.CREATE_MOVIE,
    movie
  }
};

export const deleteMovie = (id) => {
  console.log('action triggered. movie index:' + id)
  return {
    type: actionTypes.DELETE_MOVIE,
    id
  }
}

reducers/movieReducers.js

export default (state = [], action) => {
  switch (action.type){
    case 'CREATE_MOVIE':
      return [
        ...state,
        Object.assign({}, action.movie)
      ];
    case 'DELETE_MOVIE':
      return [
        state.filter(({ id }) => id  !== action.id)
      ]
    default:
          return state;
  }
};

components/MovieList.js

import React from 'react'
import Slider from 'react-slick'
import { dispatch, connect } from 'react-redux'
import {Icon} from 'react-fa'
import { deleteMovie } from '../../actions/movieActions'

import 'slick-carousel/slick/slick.css'
import 'slick-carousel/slick/slick-theme.css'
import './MovieList.scss'

class MovieList extends React.Component{
  constructor(props){
    super (props)
  }

  handleClick(id) {
    dispatch(deleteMovie(id))
  }

  onMovieClick(id){
   dispatch.deleteMovie(id)
  }

  render () {
    // Settings for slick-carousel
    let settings = {
      infinite: true,
      speed: 500
    }

    return (
      <div className='col-lg-12'>
        {this.props.movies.map((b, i) =>
          <div key={i} className="col-lg-2">
            <Slider {...settings}>
              {b.images.map((b, z) =>
                <div className="img-wrapper">
                  <Icon name="trash" className="trash-icon" onClick={() =>
                    console.log(this.props.movies[i].id),
                    onMovieClick(this.props.movies[i].id)
                  }/>
                  <img className="img-responsive" key={z} src={b.base64}></img>
                </div>
              )}
            </Slider>
            <div className="text-left info">
              <h2>{b.title}</h2>
              <p>{b.genre}</p>
            </div>
          </div>
        )}
      </div>
    )
  }
}

// map state from store to props

const mapStateToProps = (state) => {
  return {
    movies: state.movies
  }
};

// Map actions to props
const mapDispatchToProps = (dispatch) => {
  return {
    onMovieClick: (id) => {
      dispatch(deleteMovie(id))
    }
  }
}

export default connect(mapStateToProps, mapDispatchToProps)(MovieList)

如果有人有时间,我希望你能给予一些建议。

涉及到IT技术的问题。


你在 MovieList 的方法和 props 中都定义了 onMovieClick,导致重复定义。 - Mμ.
请注意,如果您选择“在新标签页中打开”,我不认为这将起作用。 - Christo
1个回答

4

因为你通过connect传递了onMovieClick,所以你实际上可以从MovieList组件的props中调用它。首先,我会在MovieList组件中删除onMovieClick方法定义,并在Icon的onclick处理程序中使用this.props.onMovieClick,如下所示:

<Icon name="trash" className="trash-icon" onClick={() =>
  console.log(this.props.movies[i].id),
  this.props.onMovieClick(this.props.movies[i].id)
}/>


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接