【发布时间】:2019-12-05 16:22:54
【问题描述】:
我有一个渲染 2 个 <video> 元素的反应组件。
在任何时候只有 1 个元素是可见的,并且有一些更新状态的逻辑,所以这些切换。
我有一个 id 数组,在每次渲染状态/播放器切换时,我想用随机视频更新正在播放的视频。
(为了这个问题,我添加了一个按钮来切换状态)
如果我在渲染方法中注销我的状态,我可以看到 url 属性按预期更新,但视频不会更改源。
我选择将元素的visibility 切换为display:none 或类似的东西
{playerOne.visible &&
<LandingPageVideoPlayer url={playerOne.url} />
}
在重新渲染状态时会导致闪烁。
我不知道如何在重新渲染时更改视频元素的来源。
组件
const LandingPageVideoPlayer = ({ url, isActive }) => {
const playerClassName = `video-player ${isActive ? 'video-player--is-active' : null}`
return (
<video className={playerClassName} autoPlay loop muted>
<source src={url} type='video/mp4' />
</video>
)
}
class LandingPage extends Component {
MOCK_URL_SOURCE = [
'ehZqNokVylyWk',
'hDqq4LalRAUiQ',
'yjTccXlnh6LXW',
'3FjEPbKqEPhPpmC8uY',
'3ohs7NLUXtNW98mtIQ'
]
state = {
playerOne: {
visible: true,
url: `https://media0.giphy.com/media/3ohs7NLUXtNW98mtIQ/giphy.mp4`
},
playerTwo: {
visible: false,
url: `https://media0.giphy.com/media/3FjEPbKqEPhPpmC8uY/giphy.mp4`
}
}
randomItem = () => {
return this.MOCK_URL_SOURCE[Math.floor(Math.random() * this.MOCK_URL_SOURCE.length)]
}
toggle = () => {
this.setState(prevState => ({
playerOne: { visible: !prevState.playerOne.visible, url: `https://media0.giphy.com/media/${this.randomItem()}/giphy.mp4` },
playerTwo: { visible: !prevState.playerTwo.visible, url: `https://media0.giphy.com/media/${this.randomItem()}/giphy.mp4` }
}))
}
render() {
const { playerOne, playerTwo } = this.state
if (!playerOne || !playerTwo) {
return null
}
return (
<div className='landing-page'>
<button onClick={this.toggle}></button>
<LandingPageVideoPlayer url={playerOne.url} isActive={playerOne.visible} />
<LandingPageVideoPlayer url={playerTwo.url} isActive={playerTwo.visible} />
</div>
)
}
}
export default LandingPage
视频播放器 SCSS
.video-player {
position: absolute;
object-fit: cover;
width: 100%;
height: 100vh;
visibility: hidden;
&--is-active {
visibility: visible;
}
}
【问题讨论】:
标签: javascript reactjs html5-video