在Next.js中使用“use client”时无法更改标题

uemypmqf  于 2023-06-22  发布在  其他
关注(0)|答案(1)|浏览(213)

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

'use client'

 ....

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

export default Demo(){
 return ...
}

'use client'正在产生问题,因为当我删除它时,标题会发生变化,但问题是我无法删除它,因为这个组件使用onClick,它给出了一个错误,而没有'' use client '
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>
}
3yhwsihp

3yhwsihp1#

正如您在doc上看到的,您不能在客户端组件中使用metadata。以下是他们警告的一段话:
静态和动态metadatagenerateMetadata仅在服务器组件中受支持。
因此,与其将整个页面作为客户端组件,您可以将客户端文件中需要交互的部分移动并将其导入服务器页面,正如他们所说的那样:
为了提高应用程序的性能,我们建议尽可能将客户端组件移动到组件树的叶子上。
在本例中,您可以将当前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 ...
}

相关问题