【问题标题】:React - How to go back to default state?React - 如何回到默认状态?
【发布时间】:2022-01-23 06:38:13
【问题描述】:

我正在播放 Youtube 视频。一旦输入了某些内容,API 服务器就会回复一个 URL,该 URL 在与 Youtube 相同的播放器中播放。 API 的视频结束后如何返回 YouTube 视频?

播放器视频代码(Typescript)如下所示,由videoUrlProp 提供,该状态处理来自父组件的 URL 响应。

const Player: React.FC<IProps> = ({
  onProgress,
  videoUrlProp,
}:
IProps) => {

// Don't mind this segment.
  const { playerRef, isPlaying } = useStore(
    (state) => ({ playerRef: state.playerRef, isPlaying: state.isPlaying }),
    shallow
  );

  // We check if the source is the original. This is used to resize the player.
  const isOriginalVideo = videoUrlProp.includes("youtube");

  return (
    <div className="player">
      <ReactPlayer
        url={videoUrlProp}
        controls={true}
        onProgress={onProgress}
        width={isOriginalVideo ? "100%" : "70%"}
        height={isOriginalVideo ? "100%" : "100%"}
        className="react-player"
        ref={playerRef}
        playing={isPlaying}
      />
    </div>
  );
};

export default Player;

我正在为播放器使用react-player;这就是在父组件中声明状态的方式:

const [videoUrl, setVideoUrl] = useState(
    "https://www.youtube.com/watch?v=something"
  );

欢迎任何帮助。谢谢!

*编辑:我对 stackoverflow 的提问还是有点陌生​​,如果我遗漏了一些数据或者我是否应该以不同的方式写下来,请务必告诉我!泰! :)

【问题讨论】:

    标签: javascript reactjs typescript react-hooks react-player


    【解决方案1】:

    状态没有“重置”功能。但是很容易模拟出来。

    如果你设置你的状态并公开默认/初始值,那么你会得到类似的东西:

    const defaultVideoUrl = "https://www.youtube.com/watch?v=something"
    

    然后在你的组件某处,声明状态:

    const [videoUrl, setVideoUrl] = useState(defaultVideoUrl);
    

    然后你在视频结束时设置回默认值,according to the docs 是通过使用onEnded 属性:

    <ReactPlayer
      ...otherProps
      onEnded={() => setVideoUrl(defaultVideoUrl)}
    />
    

    【讨论】:

    • 我应该在任何地方使用videoUrl 吗?就目前而言,道具是包含新网址和默认网址的道具。
    • 当然。这是当前播放视频的网址。所以这似乎很重要。
    • 如果原始视频由 API 作为道具 (videoUrlProp) 提供。我应该如何处理?我应该将道具分配给默认状态吗? const [videoUrl, setVideoUrl] = useState(viddeoUrlProp);.
    • 您能详细描述一下您的目标吗? “由 API 作为道具服务”实际上没有任何意义,因为远程 API 对反应道具一无所知。所以我想我不明白。我假设您将默认视频 (A) 定义为常量,然后用户想要播放不同的视频 (B)。然后播放视频 B。视频 B 播放完后,播放会重新播放视频 A。我有这个权利吗?
    • 对不起,@alex。是的,你的建议是正确的。它会播放视频,直到用户与该工具交互。显示第二个视频,最终返回到原始视频。我在父组件中有一个从服务器获取 videoUrl 的状态:const [videoUrl, setVideoUrl] = useState( "https://www.youtube.com/watch?v=4b4MUYve_U8" ); 然后将其作为道具传递:&lt;Player videoUrlProp={videoUrl} /&gt;
    【解决方案2】:

    您可以将函数道具传递给您的子组件,当视频结束时调用它,并使用 useEffect 触发父组件中的重置。

    useEffect(()=> { 
       if (isVideoFinished) props.reset(true)
    }, [isVideoFinished])
    

    在你的父组件中简单地做

    const reset = (shouldReset) => {
      if (shouldReset) {
        setVideoUrl('reset to whatever you want')
      }
    }
    

    【讨论】:

    • 对不起,本,但我不完全理解您的建议。如何处理返回的函数?如果可能,请查看此链接中的PlayerMain,以便我更好地向您展示这些组件是如何组合在一起的。 :) codesandbox.io/s/elated-hugle-yfxn2?file=/src/Main.tsx
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-11
    • 2017-04-20
    • 1970-01-01
    • 2021-11-29
    相关资源
    最近更新 更多