Skip to content

context

抽离成组件,provider 间可以嵌套

js
'use client'

// 记录页面中的一个公用弹窗的打开状态

import { createContext, useState } from 'react'

export const ToastContext = createContext({
  toastValue: false,
  setToast: (toast: boolean) => {}
})

export default function ToastProvider({
  children
}: {
  children: React.ReactNode
}) {
  const [toastValue, setToastValue] = useState(false)
  return (
    <ToastContext.Provider
      value={{
        toastValue,
        setToast: (toast: boolean) => {
          setToastValue(toast)
        }
      }}
    >
      {children}
    </ToastContext.Provider>
  )
}
'use client'

// 记录页面中的一个公用弹窗的打开状态

import { createContext, useState } from 'react'

export const ToastContext = createContext({
  toastValue: false,
  setToast: (toast: boolean) => {}
})

export default function ToastProvider({
  children
}: {
  children: React.ReactNode
}) {
  const [toastValue, setToastValue] = useState(false)
  return (
    <ToastContext.Provider
      value={{
        toastValue,
        setToast: (toast: boolean) => {
          setToastValue(toast)
        }
      }}
    >
      {children}
    </ToastContext.Provider>
  )
}

然后在 layout.tsx 或者在别的需要的地方包裹组件

js
import ToastProvider from './toast-provider'

export default function RootLayout(props: {
  children: React.ReactNode
  modal: React.ReactNode
}) {
  return (
    <html>
      <body>
          <ToastProvider>
            {props.children}
          </ToastProvider>
      </body>
    </html>
  )
}
import ToastProvider from './toast-provider'

export default function RootLayout(props: {
  children: React.ReactNode
  modal: React.ReactNode
}) {
  return (
    <html>
      <body>
          <ToastProvider>
            {props.children}
          </ToastProvider>
      </body>
    </html>
  )
}

使用

js
import { useContext } from 'react'
import { ToastContext } from './toast-provider'

const toastShareValue = useContext(ToastContext)

// console.log(toastShareValue.toastValue)
// toastShareValue.setToast(true)
import { useContext } from 'react'
import { ToastContext } from './toast-provider'

const toastShareValue = useContext(ToastContext)

// console.log(toastShareValue.toastValue)
// toastShareValue.setToast(true)