You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

NextJS中模板组件作为属性传递报错的问题求助

解决方案

方法1:拆分独立客户端组件

  1. 创建新的客户端组件文件(如BookTable.tsx),开头添加'use client'指令:
'use client';

import { DataTable, Column, Button } from '你的组件库路径';
import { Book } from '你的类型定义路径';

function buttonsTemplate(book: Book) {
  return (
    <div>
      <Button>Remove</Button>
      <Button>Modify</Button>
    </div>
  );
}

export default function BookTable({ books }: { books: Book[] }) {
  return (
    <div>
      <DataTable value={books}>
        <Column field="code" header="Code"></Column>
        <Column field="name" header="Name"></Column>
        <Column header="Operation" body={buttonsTemplate}></Column>
      </DataTable>
    </div>
  );
}
  1. 在原page.tsx(默认是服务端组件)中引入并使用该客户端组件:
import BookTable from './BookTable';
import { BOOKS } from '你的数据路径';

export default function Management() {
  return (
    <div>
      <BookTable books={BOOKS} />
    </div>
  );
}

方法2:将当前页面转为客户端组件

如果页面不需要服务端渲染特性,直接在page.tsx开头添加'use client'指令,让整个页面成为客户端组件,即可消除函数传递限制:

'use client';

import { DataTable, Column, Button } from '你的组件库路径';
import { Book, BOOKS } from '你的数据和类型路径';

function buttonsTemplate(book: Book) {
  return (
    <div>
      <Button>Remove</Button>
      <Button>Modify</Button>
    </div>
  );
}

export default function Management() {
  return (
    <div>
      <DataTable value={BOOKS}>
        <Column field="code" header="Code"></Column>
        <Column field="name" header="Name"></Column>
        <Column header="Operation" body={buttonsTemplate}></Column>
      </DataTable>
    </div>
  );
}

问题原因

Next.js App Router中,page.tsx默认是Server Component,而你使用的DataTable/Column属于Client Component。服务端组件不能直接向客户端组件传递函数(use server标记仅适用于服务端操作,不适合UI组件)。通过拆分客户端组件或转换页面类型,让函数在客户端环境内传递,就能解决该错误。

内容的提问来源于stack exchange,提问作者Lomírus

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 11:16:21