返回嵌套 React 元素的组件不显示

Component returning nested React Elements not displaying

我有一个默认组件 Collection,它使用名为 RenderCollectionPieces 的子组件来显示 UI 元素。我不明白为什么我能够在控制台中看到 image.name 的数据,但 却看不到 UI 元素显示 .

附加信息:

Index.js:

const RenderCollectionPieces = () => {
  const {collectionId} = useParams();  
  let listOfImageObjects = collectionMap[collectionId];
  let imagesPerColumn = Math.ceil(listOfImageObjects.length / 4);
  let columnOrg = [];

  while (columnOrg.length < 4){
    if(imagesPerColumn > listOfImageObjects.length){
      imagesPerColumn = listOfImageObjects.length;
    }
    columnOrg.push(listOfImageObjects.splice(0,imagesPerColumn))
  }
 
  let collectionList = columnOrg.map((col) => {
        return(            
            <Grid item sm={3}>
              {
                col.map((image) => {
                  console.log(image.name)
                  return(
                    <p>{image.name}</p>
                  )
                })
              }
            </Grid>
        )
    });
  return collectionList;
};

const Collection = ({ match }) => {
  const {collectionId} = useParams();
  return(
    <Box sx={{ background:'white'}}>
      <Grid container>           
        <RenderCollectionPieces />          
      </Grid>
  </Box>
  )
};

export default Collection;

我认为你误解了 React 中的状态管理。组件 re-renders 之间你想记住的每个变量都应该使用 useState 钩子包含在状态中。如果您想最初执行一些类似于 while 循环的操作,请在 useEffect 钩子中使用它。

const MyComponent = () => {
  const [myCounter, setMyCounter] = useState(0);

  useEffect(() => {
    console.log("This will be performed at the start");
  }, []);

  return (
    <Fragment>
      <button onClick={() => setMyCounter(myCounter++)} />
      You clicked {myCounter} times
    </Fragment>
  )
}

如果您不熟悉 useStateuseEffect 钩子,我建议您先了解它们以了解 React 如何管理状态和 re-renders:https://reactjs.org/docs/hooks-intro.html

按照 Samuel Oleksak

的建议使用 useEffect/useState 使其正常工作
    const RenderCollectionPieces = (props) => {
    const [columnOrg, setColumnOrg] = useState([]);
    useEffect(() => {
    let columnSetup = []
    let listOfImageObjects = collectionMap[props.collectionId.collectionId];
    let imagesPerColumn = Math.ceil(listOfImageObjects.length / 4);
    
    while (columnSetup.length < 4){
      if(imagesPerColumn > listOfImageObjects.length){
        imagesPerColumn = listOfImageObjects.length;
      }
      columnSetup.push(listOfImageObjects.splice(0,imagesPerColumn))
    }
    setColumnOrg(columnSetup);
  },[]);
  
  return (
      columnOrg.map((column) => {
        return (
          <Grid item sm={3}>
            {
              column.map((image) => {
                return (<img src={image.src} alt={image.name}/>)
              })
            }
          </Grid>
        )
      })
  )
};