【问题标题】:React router component not destroying when user leaves the page用户离开页面时反应路由器组件不会破坏
【发布时间】:2020-05-04 20:30:57
【问题描述】:

我有一个视频播放器(jsmpeg 播放器),它向服务器打开一个 websocket 来播放实时视频。视频服务器的工作方式是计算连接的客户端数量。它在客户端 > 0 处开始流式传输。这部分有效。当我的视频播放器单独在一个独立的 react-app 中时,当我关闭选项卡/重新打开时,它可以很好地处理所有事情。

我适应了使用 react-router。我想要相同的逻辑,但不是打开和关闭选项卡,而是转到一个新的 react-router 页面。我有一个主页和一个播放器页面。当我打开播放器页面时它运行良好,服务器意识到客户端连接并启动,但是当我回到主页时它“保持活动状态”并且似乎没有卸载/结束连接。当我返回播放器页面时,它会打开第二个连接,依此类推,直到我关闭终止所有客户端的选项卡。

当我离开页面时如何关闭播放器?我想从 player.js 中导航出来,就像关闭一个标签一样。当我导航回播放器时,该组件可以重新渲染/安装。

我的 app.js

import React, { Component } from 'react';
import { BrowserRouter, Route, Switch } from 'react-router-dom';

import Home from './components/Home';
import About from './components/About';
import Contact from './components/Contact';
import Error from './components/Error';
import Navigation from './components/Navigation';
import Player from './components/Player.js';
class App extends Component {
  render() {
    return (
       <BrowserRouter>
        <div>
          <Navigation />
            <Switch>
             <Route path="/" component={Home} exact/>
             <Route path="/player" component={Player}/>
            <Route component={Error}/>
           </Switch>
        </div>
      </BrowserRouter>
    );
  }
}

export default App;

我的播放器

import React from 'react';
import JsmpegPlayer from './JsmpegPlayer';
import '../App.css';

const videoOptions = {
  poster: ''
};

const videoOverlayOptions = {autoplay: true};

const player = () => {
    return (
      <div>
        <header>
          <JsmpegPlayer
            wrapperClassName="video-wrapper"
            videoUrl="ws://<my ip>:9999"
            options={videoOptions}
            overlayOptions={videoOverlayOptions}
          />
        </header>
      </div>
    );
}

export default player;

jsmpeg 播放器

import React, {Component} from 'react';
import JSMpeg from '@cycjimmy/jsmpeg-player';

export default class JsmpegPlayer extends Component {
  constructor(props) {
    super(props);

    this.els = {
      videoWrapper: null,
    };
  };

  render() {
    return (
      <div
        className={this.props.wrapperClassName}
        ref={videoWrapper => this.els.videoWrapper = videoWrapper}>
      </div>
    );
  };

  componentDidMount() {
    // Reference documentation, pay attention to the order of parameters.
    // https://github.com/cycjimmy/jsmpeg-player#usage
    console.log('I was triggered during componentDidMount')
    new JSMpeg.VideoElement(
      this.els.videoWrapper,
      this.props.videoUrl,
      this.props.options,
      this.props.overlayOptions
    );
  };
};

【问题讨论】:

    标签: javascript reactjs react-router web-component react-component


    【解决方案1】:

    当组件卸载时,您需要销毁您的 JSMpeg 实例。创建实例时保存实例,如下所示this.videoPlayer = new JSMpeg.VideoElement(...),然后在componentWillUnmount 调用this.videoPlayer.destroy()

    您需要对大多数第三方库执行此操作,因为实例将继续存在于内存中,并且会随着时间的推移而累积,从而导致内存泄漏

    【讨论】:

    • 您好,这很有帮助,感谢您的回复。您所指的这些部分会进入我的“玩家”课程吗? ComponentDidMount 在 jsmpeg 播放器的实际源代码中,但我的播放器类将是我拥有 this.videoPlayer 的类,所以我假设你的意思是那里。再次感谢
    猜你喜欢
    • 2020-07-01
    • 2020-10-23
    • 2020-09-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-03
    • 1970-01-01
    • 2016-09-20
    • 2019-10-21
    相关资源
    最近更新 更多