javascript—将组件状态传递给next.js中应用程序的所有组件的替代方法

67up9zun  于 2021-09-23  发布在  Java
关注(0)|答案(1)|浏览(353)

我想通过考试 setState 组件的方法( SnackBar )到的所有子组件 _app.js . 如果我将snackbar的setstate方法传递给_app.js的所有子组件,那么这将是一项非常乏味的任务。因为,从_app.js到单个组件节点大约有4个层次。包括,,

_app.js -> pages -> layouts -> sections -> components

_app.js的片段在这里。

function MyApp({ Component, pageProps }) {

    const [ toastOpen, setToastOpen ] = React.useState({
        msg: '',
        open: false
    });

    React.useEffect(() => {
        pageProps = { ...pageProps, setToastOpen };
    }, []);

    return (
        <React.Fragment>
            <ToastMessage
                message={ toastOpen.msg }
                setOpenState={ setToastOpen }
                openState={ toastOpen.open }
            />
            <Component {...pageProps} />
        </React.Fragment>
    )
}

有什么方法可以直接导入 setToastOpen 方法,并在需要时使用它?

wgx48brx

wgx48brx1#

react有一个名为context api的特殊功能,使用该功能,您可以跳过传递到组件中的道具链。。
我建议您查看下面的参考资料,以了解上下文api-
https://reactjs.org/docs/context.html
https://www.freecodecamp.org/news/react-context-in-5-minutes

contextapi示例

为上下文创建一个单独的文件 Toast-context.js ,您可以使用任何您想要的名称。

import React, { useState } from "react"
    const ToastContext = React.createContext({
    message: "",
    toastOpen: false,
    toggleToast: () => { },
    changeMessage: () => { }
})

export const ToastContextProvider = ({children}) => { 
/*you need to use 
this component to wrap App.js so that the App.js and all of its children 
and their children components and so on will get the access to the 
context*/

    const [toastOpen, setToastOpen] = useState(false);
    const [message, setMessage] = useState("");

    const toggleToast = () => {
    setToastOpen(true)
    }

    const changeMessage = (message) => {
    setMessage(message);
    }

    return (
        <ToastContext.Provider value={
            toastOpen,
            message,
            toggleToast,
            changeMessage
        }>
            {children}
        </ToastContext.Provider>
    )
}

现在在 App.js 使用toastcontextprovider组件 Package 组件所需的文件

import React, { useContext } from "react";
import { ToastContextProvider } from "./Toast-context";
import { ToastContext } from "./Toast-context";

function MyApp({ Component, pageProps }) {
    const { message, toastOpen, toggleToast, changeMessage } =
        useContext(ToastContext);

    return (
        <ToastContextProvider>
            {toastOpen && <div className="toast">{message}</div>}
        </ToastContextProvider>
    );
}

只需在所需的任何组件中使用usecontext钩子导入上下文。你不需要用你的衣服包起来 <ToastContextProvider> 在每个组件中。只需使用usecontext钩子,就可以看到状态和调用函数方法来更改状态。
另外,请务必参考上述链接以了解有关上下文api的更多信息。非常感谢。

相关问题