Как я могу воспроизводить видео в React на mouseEnter

#reactjs #html5-video #setstate #mouseenter

#reactjs #html5-видео #setstate #mouseenter

Вопрос:

Я хотел бы воспроизвести видео на mouseeEnter и сделать паузу на mouseLeave. Каждый раз, когда я пытаюсь это сделать, я получаю TypeError: не удается прочитать свойство ‘play’ undefined.

Когда я консолью.войти e.currentTarget Я получаю правильный тег.

Это то, что я делал до сих пор

 
import { MoviesList, MoviesListEl, Title, VideoWrap, MediaWrap, MovieDesc, MobilePreview } from "./styles"

export default class FetchRandomMovies extends React.Component {
  state = {
    loading: true,
    movies: []
  }

  async componentDidMount() {
    const url = "https://itunes.apple.com/us/rss/topmovies/limit=100/json"
    const response = await fetch(url)
    const data = await response.json()

    this.setState({ movies: data.feed.entry, loading: false })
  }

  getInitialState(e) {
    return {
      isPlaying: false
    }
  }
  mouseEnter = e => {
    this.setState({ isPlaying: true })
    console.log(e)
  }
  mouseLeave = e => {
    this.setState({ isPaused: false })
  }

  render() {
    if (this.state.loading) {
      return <div>loading...</div>
    }

    if (!this.state.movies.length) {
      return <div>didn't get movies</div>
    }
    return (
      <MoviesList>
        {this.state.movies.map(item => (
          <MoviesListEl key={item.title.label}>
            <Title>
              <span>{item.title.label}</span>
              <span>{item.category.attributes.term}</span>
            </Title>
            <MediaWrap>
              <img src={item["im:image"][2].label} alt="" />
              <VideoWrap>
                <video onMouseEnter={e => this.mouseEnter(e.currentTarget).play()} controls>
                  <source src={item.link[1].attributes.href} type="video/x-m4v" />
                </video>
              </VideoWrap>
            </MediaWrap>
            <MovieDesc>{item.summary.label}</MovieDesc>
            <MobilePreview href={item.link[1].attributes.href} />
          </MoviesListEl>
        ))}
      </MoviesList>
    )
  }
}
  

Вероятно, в этой строке что-то не так:

<video onMouseEnter={e => this.mouseEnter(e.currentTarget).play()} controls>

Заранее благодарю вас

Ответ №1:

Вы вызываете .play() неправильное значение. Вы собираетесь вызвать .play() e.currentTarget , но это не то, что говорит ваш код. Ваш код вызывает .play() void возврат из this.mouseEnter(e.currentTarget) .

Вы можете исправить это несколькими способами, самый простой — вызвать play() mouseEnter обратный вызов. Поскольку предполагается, что этот обратный вызов принимает событие, мы хотим передать его e , а не e.currentTarget . Но поскольку e это аргумент по умолчанию, мы можем просто предоставить нашу функцию onMouseEnter .

 <video onMouseEnter={this.mouseEnter} controls>
  
 mouseEnter = e => {
    e.currentTarget.play();
    this.setState({ isPlaying: true });
    console.log(e);
}
  

Комментарии:

1. Привет, спасибо за ваш ответ. Используя ваше решение на этот раз, я получаю: 'onMouseEnter' is not defined no-undef : (

2. Хорошо, что-то было не так с кешем, я думаю? Я перезапустил «запуск npm», и теперь все работает отлично. Большое вам спасибо за ваше время и помощь 🙂