【问题标题】:Control audio tag via react state通过反应状态控制音频标签
【发布时间】:2017-05-12 16:33:07
【问题描述】:

我的反应组件中有这段代码:

componentDidMount() {
    this.setState({
      audioContainer: document.getElementById('audio'),
    });
  }

并且在需​​要时我会执行一些操作:

this.state.audioContainer.start()

我认为这不是最好的选择。

按照上面的解决方案,我这样做了:

从“反应”导入反应; 从 'prop-types' 导入 PropTypes;

class AudioControl extends React.Component {

  componentDidMount() {
    if (this.props.start) {
      this.start();
    }
  }

  componentWillReceiveProps({ start }) {
    if (start !== this.props.start && start === true) {
      this.start();
    }
  }

  start() {
    this._audio.start();
  }

  render() {
    return (
      <audio ref={a => this._audio = a}>
        <source src="url" type="audio/mp3" />
      </audio>
    );
  }
}

AudioControl.defaultProps = {
  start: false,
};

AudioControl.propTypes = {
  start: PropTypes.bool,
};


export default AudioControl;

我在父组件处导入:

<AudioControl start />

我得到了这个错误: 动态页面加载失败 TypeError: this._audio.start is not a function

【问题讨论】:

  • 问题应该是为什么它首先处于状态。有必要吗?
  • 是的,我想知道渲染时是否有类似 的东西
  • 您可以将 REF 用于您的音频组件(在 render() 方法中),然后您可以以适当的反应方式控制它。如果你能展示更多代码,你的整个组件,尤其是你如何渲染那个音频组件,那么我可能会给你一些更清晰的例子,谢谢

标签: reactjs


【解决方案1】:

不建议使用状态来保持对 DOM 元素的引用。改用 React ref,并带有一个实例变量。

class AudioControl extends React.Component{

  start(){
    this._audio.play()
  }

  render(){
    return (
      //..
      <audio ref={(a) => this._audio = a} />
      //..
    )
  }
}

【讨论】:

  • 这看起来不错,我要试试 :)
  • 这是正确的方法,使用 REF,正如我在上述问题下评论的那样(我一开始没有看到你的答案)
  • 我尝试了这个解决方案,但出现错误。我编辑了我的帖子,你能帮我看看吗?
  • 我知道了,改游戏开始
猜你喜欢
  • 2023-03-11
  • 1970-01-01
  • 1970-01-01
  • 2019-05-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多