我的Next.js13应用程序中有一个/demo路由,它使用的是App Router.但是我无法更改页面的标题(我当前得到的标题是localhost:3000/demo).

我有以下代码.

/demo/page.js:

'use client'

 ....

export const metadata = {
  title: 'Demo - ModalJS',
};

export default Demo(){
 return ...
}

'use client'造成了问题,因为当我删除它时,标题会更改,但问题是我不能删除它,因为该组件使用onClick,这会给出一个错误,但不会给出‘’使用客户端‘’

Demo内部的代码如下:

export default function Demo() {
    

    const [title, setTitle] = useState("Title of your modal");
    const [desc, setDesc] = useState("You description goes here");
    const [theme, setTheme] = useState("light");

    const handleclick = ()=>{
        const modal = new ModalJS( ... stuff related to this library)
        
        modal.show()       //trigger this when you want to show modal
    }


    return <section id={styles.demosection}>
        <div className={styles.demotitle}>Demo</div>
        <div className={styles.form}>
            <label htmlFor="title" className={styles.label}>Title:</label> <br />
            <input type="text" name="title" id={styles.title} className={styles.input} value={title} onChange={(e)=>setTitle(e.target.value)}/>
<br /><br />
            <label htmlFor="desc" className={styles.label}>Description:</label> <br />
            <input type="text" name="desc" id={styles.desc} className={styles.input} value={desc} onChange={(e)=>setDesc(e.target.value)}/>
<br /><br />
            <label htmlFor="theme" className={styles.label}>Theme:</label> <br />
            <select type="select" name="theme" id={styles.theme} className={styles.input} onChange={(e)=>setTheme(e.target.value)}>
                <option value="light">light</option>
                <option value="dark">dark</option>
            </select>
<br /><br />

        </div>
        <div className={styles.showbtndiv}>
            <button className={styles.showbtn} onClick={()=>handleclick()}>Show Modal</button>
        </div>
    </section>
}

推荐答案

正如您可以在doc上看到的那样,客户端组件中不能包含metadata.以下是他们对此发出警告的引言:

静态的和动态的metadatagenerateMetadata are only supported in Server Components.

因此,您可以移动客户端文件中需要交互的部分并将其导入到服务器页面中,而不是将整个页面作为客户端组件,因为它们是say:

为了提高应用程序的性能,我们建议尽可能将客户端组件移动到组件树的树叶中.

在您的示例中,您可以将当前app/demo/page.js文件的内容移动到app/demo/demo.js文件中,例如,不使用metadata,然后将其导入:

// app/demo/page.js

import Demo from "./demo";

export const metadata = {
  title: 'Demo - ModalJS',
};

export default Page(){
 return <div><Demo/></div>
}
// app/demo/demo.js

'use client'

// ....

export default Demo(){
 return ...
}

Javascript相关问答推荐

我可以使用querySelectorAll获取单元格索引吗?

订阅操作顺序

使用Astro和React的动态API

如何解决(不忽略)reaction详尽的linter规则,而不会在获取数据时导致无限的reender循环

如何保持子画布元素的1:1宽高比?

不渲染具有HTML参数的React元素

如何通过在提交时工作的函数显示dom元素?

如何为GrapesJS模板编辑器创建自定义撤销/重复按钮?

我试图实现用户验证的reduxstore 和操作中出了什么问题?

Chart.js V4切换图表中的每个条,同时每个条下有不同的标签.怎么做?

如何将数据块添加到d3力有向图中?

如何在Bootstrap中减少网格系统中单个div的宽度

变量在导入到Vite中的另一个js文件时成为常量.

如何在我的Next.js项目中.blob()我的图像文件?

获取';无法解决导入和导入";slick-carousel/slick/slick-theme.css";';错误

如果没有页面重新加载Angular ,innerHTML属性绑定不会更新

使每个<;li>;元素的 colored颜色 与随机生成的 colored颜色 列表不同(不重复

如何用javascript更改元素的宽度和高度?

在D3条形图中对具有相同X值的多条记录进行分组

未捕获的不变违规:即使在使用DndProvider之后也应使用拖放上下文