【发布时间】:2020-08-04 21:17:08
【问题描述】:
为什么我在这个组件中得到了额外的重新渲染,我就是不知道为什么?此问题是在组件内部引起的,而不是由父级引起的。每次状态更改时,它都会在控制台“内部预览容器”中显示两次
我什至在useEffect() 中使用useRef() 将旧值与当前值进行比较,结果显示了两次
文件未定义然后文件{ image: "", video: "", name: "", render: false, hideImage: true }
import React, { useEffect, useState } from "react";
import "./PreviewContainer.scss";
import axios from "axios";
import { withRouter } from "react-router-dom";
function PreviewContainer(props) {
console.log("Inside Preview Container");
const [files, setFiles] = useState({ image: "", video: "", name: "", render: false, hideImage: true });
const [muted, setMuted] = useState(true);
let history = props.history;
let insideMovie = props.insideMovie;
let formData = props.formData;
useEffect(() => {
console.log("inside useEffect");
axios.post("http://localhost/netflix/index.php", formData).then((response) => {
if (response.data) {
let movie;
if (insideMovie) {
movie = JSON.parse(response.data.movie);
} else movie = response.data;
setFiles({
hideImage: true,
image: movie.image.split("/")[2],
video: movie.video.split("/")[2],
name: movie.name,
render: true,
});
} else {
history.push("/404");
}
});
}, [formData, insideMovie, history]);
const muteToggle = () => {
setMuted(!muted);
};
const showImage = () => {
setFiles({ ...files, hideImage: false });
};
return (
<div className="preview-container">
{files.render ? (
<>
<img
className="preview-image"
alt={files.name}
src={require(`../../assets/entities/thumbnails/${files.image}`)}
hidden={files.hideImage}
></img>
<video onEnded={showImage} className="preview-video" muted={muted} autoPlay hidden={!files.hideImage}>
<source src={require(`../../assets/entities/previews/${files.video}`)} type="video/mp4"></source>
</video>
</>
) : null}
<div className="preview-overlay">
<div className="mainDetails">
<h3>{files.name}</h3>
<div className="video-controls">
<button>
<i className="fas fa-play"></i> Play
</button>
<button onClick={muteToggle}>{muted ? <i className="fas fa-volume-mute"></i> : <i className="fas fa-volume-up"></i>}</button>
</div>
</div>
</div>
</div>
);
}
export default withRouter(PreviewContainer);
【问题讨论】:
-
useEffect将触发 每次 依赖项数组中的变量更改(在您的情况下,formData、insideMovie、history。如果你想要它触发一次,只需将依赖数组留空[] -
@DavidBuzatu 问题没有解决,顺便说一句 useEffect 里面的代码无论如何只执行一次
-
@DavidBuzatu 我的意思是即使我离开 [] 额外的重新渲染仍在发生
-
您确定每次更改状态时都会发生这种情况,而不仅仅是第一次更改?
-
@Tarukami 我认为是的,因为在我更改静音状态的按钮上,它只会导致双重重新渲染
标签: reactjs