【发布时间】:2019-03-06 20:21:14
【问题描述】:
我有一个类组件:
import React, { Component, Fragment } from 'react';
import ReactPlayer from 'react-player';
import storage from '../../utils/localStorage';
const STORAGE_VIDEOS_DATA_KEY = 'VIDEOS_DATA';
class VideoItem extends Component {
constructor(props) {
super(props);
this.state = {
playingStatus: false,
videoId: 318298217,
};
}
componentDidMount() {
window.addEventListener(
'beforeunload',
this.saveStateToLocalStorage
);
}
componentWillUnmount() {
window.removeEventListener(
'beforeunload',
this.saveStateToLocalStorage
);
this.saveStateToLocalStorage();
}
handlePlayingStatus = () => {
this.seekToPoint();
this.setState({
playingStatus: true,
});
}
setVideoProgress = videoProgress => {
this.setState({
videoProgress: videoProgress.playedSeconds,
});
}
onVideoPause = () => {
this.saveStateToLocalStorage();
this.setState({
playingStatus: false,
});
}
onVideoEnd = () => {
console.log('backend call - video end status');
}
seekToPoint = () => {
const { videoId } = this.state;
const videosData = storage.hasKey(STORAGE_VIDEOS_DATA_KEY) &&
JSON.parse(storage.getItem(STORAGE_VIDEOS_DATA_KEY));
const toReturnVideoPoint = videosData[videoId] || 0;
this.player.seekTo(Number(toReturnVideoPoint));
}
saveStateToLocalStorage = () => {
const { videoProgress, videoId } = this.state;
const videosPlayedDuration = {
[videoId]: videoProgress,
};
storage.setItem(STORAGE_VIDEOS_DATA_KEY, JSON.stringify(videosPlayedDuration));
};
render() {
const { playingStatus, videoId } = this.state;
return (
<Fragment>
<ReactPlayer
ref={player => { this.player = player; }}
playing={playingStatus}
url={`https://player.vimeo.com/video/${videoId}`}
onPause={this.onVideoPause}
onEnded={this.onVideoEnd}
onProgress={this.setVideoProgress}
/>
<button onClick={this.handlePlayingStatus}>GO BACK TO THE PREVIOUS POINT</button>
</Fragment>
);
}
}
export default VideoItem;
如您所见,它是一个类组件。我正在尝试对其进行改造,以便使用带有钩子的功能组件实现更少的代码。我试过了,但是 ComponentDidMount 中发生的事情重复了太多次。
如何在 useEffect 挂钩中停止过多的 componentDidMount 逻辑重新渲染?
【问题讨论】:
标签: reactjs