next.js 如何在react客户端组件与父服务器组件之间共享状态?

wz1wpwve  于 2023-08-04  发布在  React
关注(0)|答案(1)|浏览(157)

在我的next.js应用程序中,我有一个包含两个组件的页面:AB中的至少一个。

  1. // page.tsx
  2. import A from './A'
  3. import B from './B'
  4. const Page = () => {
  5. return (
  6. <div>
  7. <A />
  8. <B />
  9. </div>
  10. )
  11. }
  12. export default Page
  1. // A.tsx
  2. 'use client';
  3. import { useState } from 'react'
  4. const A = () => {
  5. const [count, setCount] = useState(0)
  6. return (
  7. <div>
  8. <p>you clicked {count} times</p>
  9. <button onClick={() => setCount(count + 1)}>click me</button>
  10. </div>
  11. )
  12. }
  13. export default A
  1. // B.tsx
  2. 'use client';
  3. import { useState } from 'react'
  4. const B = () => {
  5. const [count, setCount] = useState(0)
  6. return (
  7. <div>
  8. <p>you clicked {count} times</p>
  9. <button onClick={() => setCount(count + 1)}>click me</button>
  10. </div>
  11. )
  12. }
  13. export default B

假设我想在服务器上静态呈现Page。但是,我也想在客户端实现状态。同步AB的状态,同时保持Page作为服务器组件的最佳方法是什么?

mzmfm0qo

mzmfm0qo1#

您可以使用上下文API来实现这一点。您可以在客户端组件中呈现您的上下文提供程序,并将其注入到页面中:

  1. // page.tsx
  2. // ...
  3. const Page = () => {
  4. return (
  5. <MyProvider>
  6. <A />
  7. <B />
  8. </MyProvider>
  9. )
  10. }
  11. // ...

字符串
上下文可能看起来像这样:

  1. // CountProvider.tsx
  2. "use client";
  3. interface CountContextType {
  4. count: number;
  5. setCount: Dispatch<SetStateAction<number>>;
  6. }
  7. export const CountContext = createContext<CountContextType>({
  8. count: 0,
  9. setCount: () => {},
  10. });
  11. export default function CountProvider({children}: {children: React.ReactNode}) {
  12. const [count, setCount] = useState<number>(0);
  13. return (
  14. <CountContext.Provider value={{ count, setCount }}>
  15. {children}
  16. </CountContext.Provider>
  17. );
  18. }


最后,您可以从子组件访问和修改相同的上下文计数,从而有效地共享状态。例如,在组件A中,而不是使用:

  1. const [count, setCount] = useState(0);


您可以用途:

  1. const {count, setCount} = useContext(CountContext);

展开查看全部

相关问题