useContext - 当我在 child 中设置状态时,我的 parent 不呈现

useContext - my parent does not render when i set state in the child

我不太擅长 React js.. 我只是想创建一个“全局值”让 parent 的 child 看到那个值所以我发现 useContext 允许一起分享价值观。所以我想使用 (useState) 所以我可以从 child 中设置它,这样它就可以在我的 parent 中单独呈现,但似乎不起作用..它改变了值但不在 parent(我是怎么弄明白的.. 在 运行 时,我更改了值,然后删除了 <Home video = {video}/> 并再次放它以显示我的视频)

这是代码

const videoIDContext = React.createContext({
  video:"",
  setVideo: () => {}
});

function UserMain() {
  const [video, setVideo] = useState("");
  return (
    <Grid container direction="column" style={{ height: "100%" }}>
    
//some code
       <videoIDContext.Provider value = {[video,setVideo]}>
        <Home video = {video}/>
       </videoIDContext.Provider >

    </Grid>
  );
}


function Home({ video, data, reel, Tips, upload }) {
  return (
//some code

        <Grid item xs="12" md="5" justify="space-around" 
          alignItems="center">
          <UploadElements />
        </Grid>

      <Grid
        container
        item
        xs={12}
        justify="space-evenly"
        alignItems="stretch"
        style={{ margin: "10px" }}
        spacing={2}
      >
        <MainVideo videoSrc={video} videoName="Nature" />

      </Grid>
  );
}
function UploadElements() {

  let videoContext1 = useContext(videoIDContext)

  const submit = async event => {
    event.preventDefault()
// (postVideoAndPpt) this function used to send data to my back end and save my video path in my data base it works fine 
    const resultVideo = await postVideoAndPpt({ppt: file , video: videoFile, Name: Name});
    console.log(resultVideo);
    videoContext1.setVideo(resultVideo.videoPath)
    setVideos([resultVideo.video, ...videos])
    // console.log(pptFiles);
    // console.log(videos);
  }

  return (
<div className="floatingDiv" style={{ height: "200px" }}>
  <form onSubmit={submit} style={{ width: "100%" }}>
       // my inputs  works fine .. just to summarize it its 2 input of type file that user
       // can upload video in it 

   </form>

 </div>
  );
}

我在这里遗漏了什么吗?

首先像

一样导出你的“上下文”
const videoIDContext = React.createContext({
          video:"",
          setVideo: () => {}
        });
         
        export { videoIDContext };

然后将它导入到您想要使用它的地方,例如

import { videoIDContext } from './dir';

您正在调用 videoContext1.setVideo(),但您使用数组 <videoIDContext.Provider value = {[video,setVideo]}> 填充了上下文。

这个数组没有方法setVideo。要么在调用 useContext:

时破坏数组
let [video, setVideo] = useContext(videoIDContext);

或者您使用对象填充上下文:

<videoIDContext.Provider value = {{video,setVideo}}>

所以我找到了答案,我的视频 ID 在 child 中成功接收但没有呈现,所以我需要做的是像这样在我的视频显示中添加密钥

<video key={videoSrc} className="video" width="100%" controls>
     <source src={videoSrc} type="video/mp4" />
</video>

因此,当此键更改时,它会单独重新呈现