Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/reactjs/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Reactjs SetState内部使用效应导致无限循环_Reactjs - Fatal编程技术网

Reactjs SetState内部使用效应导致无限循环

Reactjs SetState内部使用效应导致无限循环,reactjs,Reactjs,我不会在初始呈现中发送initialfileList。 因此,我试图在intialfileList值更改时更新状态(文件)。 但我不明白为什么代码会进入无限循环。。有人能帮忙吗 编辑: 我试图实现的是表单中有两个上传(比如上传A和上传B)以及复选框。当用户在Upload A中上传图像(比如imgc)并点击复选框时,我希望img c也能在Upload B中自动上传。啊,我明白了。这个怎么样 export const Upload = ({ initialfileList = [] }) =>

我不会在初始呈现中发送initialfileList。 因此,我试图在intialfileList值更改时更新状态(文件)。 但我不明白为什么代码会进入无限循环。。有人能帮忙吗

编辑:
我试图实现的是表单中有两个上传(比如上传A和上传B)以及复选框。当用户在Upload A中上传图像(比如imgc)并点击复选框时,我希望img c也能在Upload B中自动上传。

啊,我明白了。这个怎么样

export const Upload = ({ initialfileList = [] }) => {
  console.log("called...")
  const [files,setFiles] = useState(initialfileList)
  useEffect(() => {
    setFiles(initialfileList)
  }, [initialfileList])
  return(
    .....
   )
}
export const Upload=({initialfileList=[]})=>{
const[files,setFiles]=useState(initialfileList);
useffect(()=>{
函数是不同的文件(原始文件、新文件){
返回originFiles.length!==newFiles.length;//或此处的任何逻辑。
}
if(不同文件(文件、初始文件列表)){
setFiles(initialfileList);
}
},[initialfileList]);
返回{files.length};
};

BTW,您可能需要考虑将状态移动到父级。

< P>听起来您需要提升状态——而不是在本地存储文件集,将单个文件存储在父组件中,将其传递到上载A和上载B,并通过<代码> SETFILLISTISE/<代码>函数(它更新父组件中的状态)

i、 e:

//父组件
常量父项=()=>{
const[fileList,setFileList]=useState([]
返回(
)
}
const Upload=({fileList,setFileList})=>{
返回(
)
}

这样,正在更新的任何一个上载组件都将同时更新。

您如何知道它处于无限循环中?通过登录控制台。。我能猜到的唯一潜在问题是,
initialfileList
在父级中不断更新。是这样吗?但是初始呈现中不会发送初始文件列表。。只有选中复选框时,才会发送文件。您能否确定文件进入无限循环的原因。
export const Upload = ({ initialfileList = [] }) => {
   const [files, setFiles] = useState(initialfileList);
   useEffect(() => {
      function isDifferentFiles(originFiles, newFiles) {
         return originFiles.length !== newFiles.length; // or whatever logic here.
      }
      if (isDifferentFiles(files, initialfileList)) {
         setFiles(initialfileList);
      }
   }, [initialfileList]);
   return <div>{files.length}</div>;
};