为啥这个函数没有在反应中呈现

Posted

技术标签:

【中文标题】为啥这个函数没有在反应中呈现【英文标题】:Why this function doesn't rendering in react为什么这个函数没有在反应中呈现 【发布时间】:2022-01-16 16:13:06 【问题描述】:

首先,感谢您在这里输入

我希望能够像这段代码一样使用,这段代码在反应组件中呈现,但第二个代码不起作用..

先生,我就是这么说的。

    function forFourMultiplyFour(_pictures) 

        if (_pictures.length === 0) 
            return '';
        

        return <div
            style= display: 'flex', justifyContent: 'center' >_pictures.map((el) => 
                return <div style= margin: '5px' >
                    <Img key=el.id src=el.src ></Img>
                    <div style= display: 'flex', justifyContent: 'space-between' >
                        <div>el.title</div>
                        <div>생성일자</div>
                    </div>
                </div>;
            )</div>;
    
    function makeHowManyPage(count) 
        // 태그안에 함수로 또 다른 태그를 감싼다음에 forFourMultiplyFour로 한 것처럼 렌더링할 것을 return 했는데
        // 안되서 state을 배열로 만들어서


        return <div
            className="makeHowManyPage"
            style= display: 'flex', justifyContent: 'center' >
            () => 
                for (let i = 1; i <= count; i++) 
                    return <div>i</div>
                
            
        </div>
    

然后我会像这样渲染

import React,  useState, useEffect  from 'react';
import styled from 'styled-components';
import dummyPictures from '../../../dummyDate';

function Gallery() 

    const [forRenderingOne, setForRenderingOne] = useState(<div></div>);
    const [forRenderingTwo, setForRenderingTwo] = useState(<div></div>);
    const [forRenderingThree, setForRenderingThree] = useState(<div></div>);
    const [forRenderingFour, setForRenderingFour] = useState(<div></div>);
    const [pageCount, setPageCount] = useState(<div>1</div>);
    const [_temp, set_Temp] = useState(['안녕하세요', '안녕하세요', '안녕하세요', '안녕하세요'])

    // 애초에 4개씩 받아서 뿌릴 것

    function forFourMultiplyFour(_pictures) 

        if (_pictures.length === 0) 
            return '';
        

        return <div
            style= display: 'flex', justifyContent: 'center' >_pictures.map((el) => 
                return <div style= margin: '5px' >
                    <Img key=el.id src=el.src ></Img>
                    <div style= display: 'flex', justifyContent: 'space-between' >
                        <div>el.title</div>
                        <div>생성일자</div>
                    </div>
                </div>;
            )</div>;
    

    function makeHowManyPage(count) 
        // 태그안에 함수로 또 다른 태그를 감싼다음에 forFourMultiplyFour로 한 것처럼 렌더링할 것을 return 했는데
        // 안되서 state을 배열로 만들어서


        return <div
            className="makeHowManyPage"
            style= display: 'flex', justifyContent: 'center' >
            () => 
                for (let i = 1; i <= count; i++) 
                    return <div>i</div>
                
            
        </div>
    

    useEffect(() => 
        // 서버에서 줄때 무조건 객체 16개가 든 배열이 응답해와야 정상작동되는 코드다..
        setPageCount(makeHowManyPage(5))

        setForRenderingOne(forFourMultiplyFour(dummyPictures.pictures.slice(0, 4)));
        setForRenderingTwo(forFourMultiplyFour(dummyPictures.pictures.slice(4, 8)));
        setForRenderingThree(forFourMultiplyFour(dummyPictures.pictures.slice(8, 12)));
        setForRenderingFour(forFourMultiplyFour(dummyPictures.pictures.slice(12)));

    , []);

    return (
        <div>
            /* forRenderingOne
            forRenderingTwo
            forRenderingThree
            forRenderingFour */
            
            ()=> return <div>'안녕하세요'</div>
        </div>
    )


export default Gallery

const Img = styled.img`
    width: 15vw;
    height: 20vh;
`

【问题讨论】:

组件不是合适的状态值。状态应该是需要保存的最简单的可能值,以便您的组件可以呈现。组件有责任声明 UI 应该是什么,而不是状态。 【参考方案1】:

如上所述,这段代码 sn-p 不起作用,

    function makeHowManyPage(count) 
        // 태그안에 함수로 또 다른 태그를 감싼다음에 forFourMultiplyFour로 한 것처럼 렌더링할 것을 return 했는데
        // 안되서 state을 배열로 만들어서


        return <div
            className="makeHowManyPage"
            style= display: 'flex', justifyContent: 'center' >
            () => 
                for (let i = 1; i <= count; i++) 
                    return <div>i</div>
                
            
        </div>
    

看看这个返回div而不是array的sn-p,

for (let i = 1; i <= count; i++) 
   return <div>i</div>

map 的工作方式不同。

考虑将其更改为,


 function makeHowManyPage(count) 
    // 태그안에 함수로 또 다른 태그를 감싼다음에 forFourMultiplyFour로 한 것처럼 렌더링할 것을 return 했는데
    // 안되서 state을 배열로 만들어서

    let array = [];
    for (let i = 1; i <= count; i++) 
      array.push(<div key=i>i</div>);
    

    return (
      <div
        className="makeHowManyPage"
        style= display: "flex", justifyContent: "center" 
      >
        array
      </div>
    );
  


然后使用,

export default function App() 
  
  // declaration

  let elements = makeHowManyPage(5);

  return (
    <div className="App">
      <h1>Hello CodeSandbox</h1>
      elements
    </div>
  );

【讨论】:

感谢您为我解答!我不能用英语,我很感激【参考方案2】:

我不明白你到底想要什么,我只是写了一些我希望能解决你问题的代码。 我希望它可以帮助您解决问题,尽管它不是最好的解决方案。

首先,我将 Gallery 组件分为两个组件,包括您的 forFourMultiplyFour 函数。

(我没有虚拟图片,所以我使用了图片列表api。)

其次,作为窗台的注释,为useState初始值写简单的值。我认为您只需要两个值,页面和图像数组。 通常人们会得到图像列表更改页面和偏移值而不是切片图像数组。 (如果我有错误的想法,请告诉我。) 所以我只是在单击按钮时更改页面状态。

对于 4*4 的图像排列,我使用了 flex 属性。

import React,  useState, useEffect  from "react";
import axios from "axios";
import ForFourMultiplyFour from "./ForFourMultiplyFour";

function Gallery() 
  const [page, setPage] = useState(1);
  const [images, setImages] = useState([]);
  const URL = "https://picsum.photos/v2/list";
  const LIMIT = 16;

  useEffect(() => 
    async function fetchImages() 
      const  data  = await axios.get(`$URL?page=$page&limit=$LIMIT`);
      setImages(data);
    
    fetchImages();
  , [images, page]);

  useEffect(() => 
    setPage(page)
  , [page])

  return <ForFourMultiplyFour images=images page=page setPage=setPage />;


export default Gallery;


import styled from "styled-components";

function ForFourMultiplyFour( images, setPage, page ) 
  const handlePage = (param) => 
    if (param === "plus") 
      setPage(page + 1);
     else 
      if (page === 1) return;
      setPage(page - 1);
    
  ;
  if (images.length < 1) return <></>;
  return (
    <>
      <ButtonWrapper>
        <Button onClick=() => handlePage("minus")>prev</Button>
        <Button onClick=() => handlePage("plus")>next</Button>
      </ButtonWrapper>
      <div
        style=
          display: "flex",
          justifyContent: "center",
          flexWrap: "wrap"
        
      >
        images.map((el) => 
          return (
            <div style= margin: "5px", flex: "1 1 20%"  key=el.id>
              <Img key=el.id src=el.download_url ></Img>
              <div style= display: "flex", justifyContent: "space-between" >
                <div>생성일자</div>
              </div>
            </div>
          );
        )
      </div>
    </>
  );


const Img = styled.img`
  width: 15vw;
  height: 20vh;
`;

const ButtonWrapper = styled.div`
  display: flex;
`;

const Button = styled.button`
  cursor: pointer;
`;

export default ForFourMultiplyFour;

您可以通过this Code Sandbox link查看结果。

如果这不是您想要的解决方案,请评论我。然后我会尝试帮助您使用其他解决方案。

【讨论】:

感谢您为我解答!我不能用英语,但我很感激我很伤心我能选择的答案是一个非常感谢!

以上是关于为啥这个函数没有在反应中呈现的主要内容,如果未能解决你的问题,请参考以下文章

PHP:exec()函数为啥没有反应呢?

为啥当我使用箭头函数 onClick 时我的变量未定义?

为啥这在更改用户名时不会自行呈现。从火力基地得到反应

在学STM32的USART1,用Printf函数向超级终端打印信息。为啥超级终端没有反应?求帮助。

为啥反应上下文提供程序组件呈现两次[重复]

你如何在 react-table 访问器中调用函数? (反应)