首页 > 解决方案 > 子组件从父组件获取道具导致的无限渲染

问题描述

我有一个获取数据然后将道具传递给子子组件的组件。这会导致子组件导致无限重新渲染。我想知道发生了什么这是我的代码的样子

const Page: FunctionComponent<pageProps> = (): JSX.Element => {
    const [userInfo, setUserInfo] = useState<userInfoStruct>();
    const [data, setData] = useState<any>();

    useEffect(() => {

       // fetch info from localstore
       setUserInfo(dataFromLocalStorage);
       fetchSomeData(); // do stuff... and setData(fetchResult)
    }, [userInfo]);

    return (
     <div>
       <ButtonsAndStuff />
       <DisplayData data={data} />
     </div>
    )
};

我的子组件看起来像这样

const DisplayData: FunctionComponent<displayDataProps> = ({ data }): JSX.Element => {
    const data_: Array<any> = data.map(d =>  (d.value))

    return (
     <div>
       {data_.map(i => {
         return (
          <div>
           {i}
          </div>
         )
       })}
     </div>
    )
};

不幸的是,我的组件不断重新渲染并做出反应,说问题来自我的子组件,特别是在子组件中获取道具的级别,即这条线

const DisplayData: FunctionComponent<displayDataProps> = ({ data }): JSX.Element => {/*... */};

我不知道此时出了什么问题。

温度

useEffect(() => {
        let userName: string = localStorage.getItem("userName");
        let user: string = localStorage.getItem("user");

        if (userName === undefined || user === undefined) {
            return;
        } else {
            setUserInfo({ user: user, userName: userName });
            setIsAuth(true);
        }

        /*  */
        if (blogData.length < 1) {
            fetchBlogData(user, blogIndex).then(result => {
                console.log(result)
               
                setBlogData(result);
            });
        } else {
            return;
        }
        /*  */
    }, []);

标签: javascriptreactjstypescript

解决方案


您的问题似乎不是由您的子组件引起的,而是由您的这部分代码引起的:

const [userInfo, setUserInfo] = useState<userInfoStruct>();
const [data, setData] = useState<any>();

useEffect(() => {

    // fetch info from localstore
    setUserInfo(dataFromLocalStorage);
    fetchSomeData(); // do stuff... and setData(fetchResult)
}, [userInfo]);

Assuming that dataFromLocalStorage isn't just a string/number, it's probably a unique array/object every time. You alter userInfo, which therefore makes the [userInfo] dependency list change, therefore re-executing your effect, ad infinitum.

If you only want to execute the effect once, use [] as dependency list.


推荐阅读