PersonsFetcher是一个服务器组件,它从API获取数据,然后将其传递给客户端组件,以交互方式呈现数据(过滤、排序等).其他元素ButtonPersonModal(有一个用于创建新Person的表单)不需要提取数据即可工作,所以我将它们放在PersonsFetcher之外.

'use client';

import { Button } from '@/components/ui/button';
import { ListPlus } from 'lucide-react';
import PersonModal from '@/components/PersonModal';
import { useState } from 'react';
import PersonsFetcher from '@/components/PersonsFetcher';

export default function PersonsPage() {
  const [isModalOpen, setIsModalOpen] = useState(false);

  return (
    <>
      <Button onClick={() => setIsModalOpen(true)}>
        <ListPlus className="mr-2 h-4 w-4" /> Add new resource
      </Button>
      <Suspense fallback={<div>Loading...</div>}>
        <PersonsFetcher />;
      </Suspense>
      <PersonModal
        isOpen={isModalOpen}
        setIsOpen={setIsModalOpen}
      />
    </>
  );
}

如您所见,'use client'将使<PersonsFetcher>成为客户端组件(因此,在Next.js中产生错误).但是我需要'use client'才能用useState.

如何解决这一困境?

推荐答案

不完全确定这是否有效,或者它是否是正确的方法在所有tbh🤞…如果一个新的客户端组件具有其自己的按钮和模式状态,然后一个新的服务器组件来呈现这些客户端组件和我们已有的服务器组件PersonsFetcher,如何.

新客户端组件(as it can be standalone to render inside server comp):

'use client';

import { Button } from '@/components/ui/button';
import { ListPlus } from 'lucide-react';
import PersonModal from '@/components/PersonModal';
import { useState } from 'react';

export default function PersonsFormModal() {
  const [isModalOpen, setIsModalOpen] = useState(false);

  return (
    <>
      <Button onClick={() => setIsModalOpen(true)}>
        <ListPlus className="mr-2 h-4 w-4" /> Add new resource
      </Button>
      <PersonModal
        isOpen={isModalOpen}
        setIsOpen={setIsModalOpen}
      />
    </>
  );
}

以及用于呈现它们的新服务器组件(since server comp can render the client but not vice versa)

import PersonsFetcher from '@/components/PersonsFetcher';
import PersonsFormModal from '..';
export default function PersonsPage() {

  return (
    <>
      <PersonsFormModal/>
      <Suspense fallback={<div>Loading...</div>}>
        <PersonsFetcher />;
      </Suspense>
    </>
  );
}

Reactjs相关问答推荐

Shadck/ui Select -当用户 Select 项目时更改状态

React onKeyUp不一致地使用快速Shift+键按压

为什么我的标签在Redux API中不能正常工作?

在Reaction中测试条件组件

在Reaction常量函数中未更新状态变量

使用REACT-RUTER-V6和ZUSTANDreact 中的身份验证

获取未捕获的错误:Gatsby生产版本上的最小化react 错误#418

获取更改后的状态值

我如何在不被 destruct 的情况下将导航栏固定在顶部?

React 错误: 只能用作 元素的子元素,从不直接渲染.请将您的 包裹在

console.logs 没有显示在浏览器控制台上,但显示在我的终端上

ReactJS on AWS Amplify与EC2上的Spring boot服务之间的混合内容错误

如何修改 react/jsx-no-useless-fragment 规则以允许 <>{children}

顶点图表甜甜圈项目边框半径

在嵌套的 Stack Navigator 中的 BottomTabBar 中导航会导致比以前更多的渲染

如何在 React 中单击鼠标的位置动态添加 div?

如何在react 日历中自定义带有圆形边框的日期项?

如何根据react 中的 map 功能一次只打开一个弹出窗口?

如何使用 useEffect 和 if 语句 React

如何在 Reactjs 中判断受保护路由上的用户角色?