Tengo un archivo de proveedor de contexto con el siguiente código
import React from "react"; export const Ordering = React.createContext({ ordering: false, }); export const Ordering2 = React.createContext({ ordering2: true, });Como puedo tener muchos más contextos, quiero combinarlos/componerlos .
Basado en esta pregunta Demasiados proveedores de React Context, el combinador de contexto de código es el siguiente
import React from "react"; interface Props { components: Array<React.JSXElementConstructor<React.PropsWithChildren<any>>>; children: React.ReactNode; } export const Compose = (props: Props) => { const { components = [], children, ...rest } = props; return ( <> {components.reduceRight((acc, Comp) => { return <Comp {...rest}>{acc}</Comp>; }, children)} </> ); };Como se menciona en la solución en la pregunta, estoy tratando de usar esto en la aplicación como se muestra a continuación, pero aparece el error como se muestra en la imagen.
export const App = () => { return ( <Compose components={[Ordering, Ordering2]}> <div className="app"> <EateryInfo orderStatus={Ordering} /> <MenuButton orderStatus2={Ordering2} /> </div> </Compose> ); }Si no uso el combinador, uso los proveedores de contexto como se muestra a continuación y funciona bien.
¿Puedes por favor guiarme en lo que está mal? Gracias.
export const App = () => { const [ordering, setOrdering] = useState(false); const [ordering2, setOrdering2] = useState(false); const handleOrdering = () => { setOrdering((s) => !s); }; const handleOrdering2 = () => { setOrdering2((s) => !s); }; return ( <Ordering.Provider value={{ ordering: ordering }}> <Ordering2.Provider value={{ ordering2: ordering2 }}></Ordering2.Provider> <div className="app"> <EateryInfo orderStatus={Ordering} /> <MenuButton orderStatus2={Ordering2} /> </div> </Ordering.Provider> ); }Como ve en su último ejemplo: los objetos de contexto no son los componentes del proveedor. Los contienen en la propiedad .Provider . Compose quiere una variedad de componentes, así que pásalos:
<Compose components={[Ordering.Provider, Ordering2.Provider]}> Tampoco he visto el tipo React.JSXElementConstructor antes, y espero que los componentes se escriban como React.ComponentType ; pero tal vez cualquiera funcione.