在 Next.js 中将回调从服务器组件传递到客户端组件

2023-12-06

我陷入了创建自定义按钮组件,将其标记为客户端组件,然后传递其onClick来自服务器端组件的回调,它给了我这个错误:

 error Error: Event handlers cannot be passed to Client Component props.
  <button onClick={function} className=... children=...>
                  ^^^^^^^^^^
If you need interactivity, consider converting part of this to a Client Component.
    at stringify (<anonymous>)
digest: "280571554"

这是我的WelcomeComponent.tsx file:

import { faPizzaSlice } from "@fortawesome/free-solid-svg-icons";
import { FontAwesomeIcon } from "@fortawesome/react-fontawesome";
import { Brand, Button } from "@/components/Common";
import Image from "next/image";

const WelcomeComponent = () => {
  return (
    <div className="border flex items-center justify-center flex-wrap space-x-10 py-10">
      <div className="font-semibold flex flex-col">
        <div className="mr-3 flex items-center text-3xl">
          <span className="mr-2">Welcome to</span>
          <Brand size="large" />
        </div>
        <h2 className="text-2xl">We Serve you with happiness.</h2>
        <Button
          text="Order Now"
          icon={<FontAwesomeIcon className="w-6" icon={faPizzaSlice} />}
          onClick={() => {
            console.log("c");
          }}
        />
      </div>
      <Image
        className="w-auto h-auto"
        height={0}
        width={300}
        src="/man.jpg"
        priority
        alt=""
      />
    </div>
  );
};

export default WelcomeComponent;

这是我的Button.tsx file:

interface Props {
  text: string;
  icon: React.JSX.Element;
  onClick: () => void;
}

const Button = ({ text, icon, onClick }: Props) => {

  return (
    <button
      onClick={onClick}
      className="shadow-lg my-5 flex items-center justify-center text-white bg-orange-400 hover:bg-orange-500 rounded-md p-3 w-40 space-x-2"
    >
      <span className="text-md">{text}</span>
      {icon}
    </button>
  );
};

export default Button;

正如你所看到的,我想通过onClick回调到Button我在中调用的组件WelcomeComponent.tsx.

我正在使用 Next.jsv13.4.


那是因为服务器组件被编译为 HTML 并发送到浏览器,无需额外的 JavaScript,即您的情况下的单击处理程序。这使得您只能将非函数值从服务器组件传递到客户端组件。

调用的组件Button应该是一个客户端,"use client"在顶部,因为您需要从那里传递一个函数,这没关系,就像来自 Vercel 的 Lee Robinsonsays:

客户端组件不是取消选择,也不是逃避。您可以将服务器组件视为现有模型的补充。我理解想要在很多事情上使用服务器组件的情绪(不错!),但在某些事情上使用客户端组件也是完全可以的。

"use client"; // Need to send a JavaScript function to the browser ????????

import { faPizzaSlice } from "@fortawesome/free-solid-svg-icons";
import { FontAwesomeIcon } from "@fortawesome/react-fontawesome";
import { Brand, Button } from "@/components/Common";
import Image from "next/image";

const WelcomeComponent = () => {
  return (
    <div className="border flex items-center justify-center flex-wrap space-x-10 py-10">
      <div className="font-semibold flex flex-col">
        <div className="mr-3 flex items-center text-3xl">
          <span className="mr-2">Welcome to</span>
          <Brand size="large" />
        </div>
        <h2 className="text-2xl">We Serve you with happiness.</h2>
        <Button
          text="Order Now"
          icon={<FontAwesomeIcon className="w-6" icon={faPizzaSlice} />}
          onClick={() => {
            console.log("c");
          }}
        />
      </div>
      <Image
        className="w-auto h-auto"
        height={0}
        width={300}
        src="/man.jpg"
        priority
        alt=""
      />
    </div>
  );
};

甚至客户端组件也会首先使用 Next.js 在服务器上呈现,所以如果是为了SEO,就不用担心。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 Next.js 中将回调从服务器组件传递到客户端组件 的相关文章

随机推荐

  • 同一域的 Django 和 Node 进程

    嗨我有两个过程 Django 和 MYSQL 节点 express 和 mongodb 1 如何配置这两个进程指向不同的 url 喜欢 Django 指向 api abc com v1 节点指向 api abc com v2 2 我所有的用
  • Windows Phone 8 设备作为感应门禁卡

    Lumia 920 中的 NFC 硬件可以模拟 125 kHz 感应卡吗 看起来 NFC 硬件实现的标准是门禁卡使用的标准的超集 但我对这些无线电标准没有足够的了解 无法理解手机是否只能作为此类信号的接收器或发射器 我还希望获得一篇很好的概
  • 从文件中读取数字C++

    我想从文本文件中读取数字 该文件包含以下数字 3 5 7 9 20 25 30 40 55 56 57 60 62 1 4 7 11 14 25 44 47 55 57 100 5 100 1000 1005 12 1000 1001 空格
  • 在 Node.js 中同时生成的发票具有相同的编号。如何实现独特性?

    在我的 Node js 应用程序中 我想启用生成带有发票的 PDF 的功能 一切都很顺利 直到两个或更多人同时 在不同的机器上 生成发票 然后 系统会提示他们提供具有相同编号的不同发票 例如发票号码 355 这是将发票保存到MySQL的方法
  • 无法编译 yesod,hGetContents 参数无效

    我正在尝试创建 Yesod 项目 但无法退出1st step 以下是我初始化和构建的步骤 stack new someproj yesodweb postgres cd someproj stack build 我没有做任何额外的编码 只是
  • 解析 R 脚本中的命令行参数

    有没有方便的方法来自动解析传递给 R 脚本的命令行参数 类似perl的东西Getopt Long CRAN上有3个包 getopt 类似 C 的 getopt 行为 optparse 受 Python 启发的命令行解析器optparse l
  • 如何在变量中取加号

    我想计算两个数字 这很简单 但是有什么办法可以将运算符放入变量中然后进行计算吗 var x 5 var y 5 var p var z x p y button click function alert z div class button
  • C++ 循环中向量::size() 的性能问题

    在下面的代码中 std vector
  • 覆盖默认的 Java 外观

    我想覆盖 java 的外观和感觉 我只是想以不同的方式显示按钮 我想要 Windows 外观和感觉的所有功能 但只是按钮不同 我希望你明白我的意思 Color color new Color 220 220 220 200 UIManage
  • 为什么调用字符串方法(例如 .replace 或 .strip)不会修改(变异)字符串?

    我尝试使用此代码进行简单的字符串替换 X hello world X replace hello goodbye 为什么不X改变 从 hello world to goodbye world 这是因为Python 中的字符串是不可变的 意思
  • 在 clustermap 上为等于零的值设置特定颜色

    我想在使用seaborn 进行聚类图的图形输出方面获得一些帮助 在我的数据中 我缺少转换为 0 的数据 我想为等于零的值设置白色 为其余值设置调色板 有没有办法在cmap中指出它 import pandas as pd from rando
  • 使用 JavaScript 检测时区缩写

    我需要一种方法来检测给定日期对象的时区 我不需要偏移量 也不想要完整的时区名称 我需要获取时区缩写 例如 GMT UTC PST MST CST EST 等 这可能吗 我得到的最接近的是解析结果date toString 但即使这样也不会给
  • 如何使用Microsoft Graph API获取Office365邮件的MIME内容?

    如何使用 Microsoft Graph API 获取 Office365 邮件的 MIME 内容以便我可以创建 EML 文件 或者是否有其他方法可以使用 Microsoft graph API 创建 Office365 中找到的邮件的 E
  • 从 HttpListener 解析 POST 参数

    假设我有 HttpListener 它监听一些端口和IP 当我发送 POST 请求时 它会捕获它 如何从 HttpListenerRequest 解析 POST 参数 HttpListenerContext context listener
  • VBScript 创建一个多维数组并添加到它?

    这对我来说太棒了哈哈 我几乎检查了谷歌搜索上的每个页面 但我仍然不明白该怎么做 我想在 VB 脚本中创建一个名为 data2 的多维数组 尝试我见过的示例 但出现 下标超出范围 错误 Dim data2 sub grabdata SQL q
  • 在 C# 中使用不同的用户凭据将文件保存到文件系统

    如何使用与当前登录用户不同的用户将文件保存到文件系统 我目前正在使用 NET Framework 4 0 如果您有其他用户的登录凭据 您可以冒充他们 使用 DLL Import 在 Win32 中调用 LogonUser DllImport
  • 安装 Apple 的网络链接调节器工具

    我已经在运行 Lion 的机器上安装了 xcode 4 3 1 我在任何地方都找不到网络链接调节器工具 我已经检查了实用程序文件夹 还有xcode contents developer 目录 没有这样的运气 我是否需要安装特定组件或者该工具
  • CodeIgniter - 声明全局变量的最佳位置

    我只想用一个 variable在几个地方 不仅是视图和控制器 而且在routes php和其他配置文件 我不想要这样的事情 使用 Config 类加载配置文件 使用 CIget instance等等 我只想声明一个给定的 variable
  • 有没有简单的方法在 Windows 版 xampp 中安装 SSH?

    有没有简单的方法在 Windows 版 xampp 中安装 SSH 我不相信是这样 即使可以 您也无法像在 nix 机器上所期望的那样无缝访问 apache 和 mysql 如果你已经死心了 最好的选择就是安装 openssh 服务器 ht
  • 在 Next.js 中将回调从服务器组件传递到客户端组件

    我陷入了创建自定义按钮组件 将其标记为客户端组件 然后传递其onClick来自服务器端组件的回调 它给了我这个错误 error Error Event handlers cannot be passed to Client Componen