繁体   English   中英

如何在 nextjs 中单击按钮时动态导入和渲染组件?

[英]How to both dynamically import and render a component on button click in nextjs?

我知道本主题中有几个 nextjs 和 reactjs 问题,但我认为这足够具体,可以单独讨论。 所以我有一个 NextJS 项目,我希望按钮在单击时消失,然后动态导入组件并呈现它。

由于两件事,动态导入组件至关重要。

  1. 因为我们在依赖“窗口”的组件中使用一个库
  2. 因为该组件会影响加载时间,我们只在单击“初始化按钮”时才需要它

到目前为止,这是我的 index.js 代码:

 import Head from "next/head"; import Image from "next/image"; import Link from "next/link"; import dynamic from "next/dynamic" import React, { useEffect, useState } from "react"; import { Inter } from "@next/font/google"; const inter = Inter({ subsets: ["latin"] }); export default function Home() { return ( <> <Head> <title>My page</title> <meta name='description' content="Some desc. content" /> <meta name='viewport' content='width=device-width, initial-scale=1' /> <link rel='icon' href='/favicon.ico' /> </Head> <button onClick={initSurvey()}>Initialize.</button> </> ) } function initSurvey(){ console.log("The button is working.") const Survey = dynamic(() => import(",:/components/SurveyComponent"), { ssr: false, }) }
 <script src="https://cdnjs.cloudflare.com/ajax/libs/react/16.6.3/umd/react.production.min.js"></script> <script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/16.6.3/umd/react-dom.production.min.js"></script>

请记住,这不是我能做的全部,我只是清理了失败的尝试,以便为您提供一个清晰、可读和可理解的片段。

先感谢您!

通过查看React.lazy文档和本指南,我设法找到了这个解决方案:

import { lazy, Suspense, useState } from "react";

const dynamicComponent = lazy(() => import('../components/MyDynamicComponent');

export default function Home() {

   const [dynComp, setDynComp] = useState(<div/>);

   const loadDynamicComponent = () => {

      return (
         <Suspense fallback={<div>Loading...</div>}>
            <dynamicComponent/>
         </Suspense>
      )
   }

   return (
      <>
         <button onClick={ () => setDynComp(<div>{loadDynamicComponent()}</div>)}>Initialize!</button>
         { dynState }
      </>
   );

}

测试一下,让我知道它是否对您有帮助!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2023 STACKOOM.COM