问题
I have created an Ionic React app using Ionic 5 tab template.
I want to pass an object from App component to tab component.
Is there any way to do it ?
Tab1 and Tab2 are my tab components.
Note: I want this object to be used in both Tab components with two way data binding i.e. whenever that object is changed in one Tab component, it must be updated in second Tab component.I want to achieve it without using Redux or any third party library.
My App component is like below:
<IonApp>
<IonReactRouter>
<IonTabs>
<IonRouterOutlet>
<Route path="/tab1"
component=Tab1
exact={true} />
<Route path="/tab2"
component=Tab2
exact={true} />
<Route path="/" render={() => <Redirect to="/tab1" />} exact={true} />
</IonRouterOutlet>
<IonTabBar slot="bottom">
<IonTabButton tab={"Title1"} href={"/tab1"}>
<IonIcon icon={settings} />
<IonLabel>{"Title1"}</IonLabel>
</IonTabButton>
<IonTabButton tab={"Title2"} href={"/tab2"}>
<IonIcon icon={settings} />
<IonLabel>{"Title2"}</IonLabel>
</IonTabButton>
</IonTabBar>
</IonTabs>
</IonReactRouter>
</IonApp>
回答1:
you can use React.Context with React Hooks for simple state interactions between the tabs, you can then move up to React.useReducer
Below is a basic example using React.Context
- Example on CodeSandbox.io
import React from "react";
// create the context
export const Context = React.createContext();
// create the context provider, we are using use state to ensure that
// we get reactive values from the context...
export const TheProvider = ({ children }) => {
// the reactive values
const [sharedValue, setSharedValue] = React.useState("initial");
// the store object
let state = {
sharedValue,
setSharedValue
};
// wrap the application inthe provider with the initialized context
return <Context.Provider value={state}>{children}</Context.Provider>;
};
export default Context;
Wrap the application in the provider
import { TheProvider } from "./some-context";
const App: React.FC = () => {
return (
<IonApp>
<TheProvider>
{/* here the provider wraps the whole application to allow */}
{/* access to the context that is defined */}
<IonReactRouter>
<IonTabs>
<Route
path="/"
render={() => <Redirect to="/tab1" />}
exact={true}
/>
<IonRouterOutlet>
<Route path="/tab1" component={Tab1} exact={true} />
<Route path="/tab2" component={Tab2} exact={true} />
</IonRouterOutlet>
<IonTabBar slot="bottom">
<IonTabButton tab={"Title1"} href={"/tab1"}>
<IonLabel>{"Title1"}</IonLabel>
</IonTabButton>
<IonTabButton tab={"Title2"} href={"/tab2"}>
<IonLabel>{"Title2"}</IonLabel>
</IonTabButton>
</IonTabBar>
</IonTabs>
</IonReactRouter>
</TheProvider>
</IonApp>
);
};
And now an example use in a tab
const Tab2 = () => {
// use react hooks to get the context and the information that is stored
// in the context, the value and the function to modify the value
const { sharedValue, setSharedValue } = React.useContext(AppContext);
return (
<IonPage>
<IonHeader>
<IonToolbar>
<IonTitle>TAB ONE</IonTitle>
</IonToolbar>
</IonHeader>
<IonContent>
<>
<h2>TAB TWO</h2>
<div>{sharedValue}</div>
<IonButton
onClick={() =>
setSharedValue("From Tab 2: " + new Date().getMilliseconds())
}
>
Update Value
</IonButton>
</>
</IonContent>
</IonPage>
);
};
回答2:
you can use your Tab Component in render props of <Route>
and pass your object in Tab Component.
<Route
path="/tab1"
exact={true}
name="routeName"
render={props => (
<Tab1 object={yourObject} />
)} />
aslo you can pass all props like this <Tab1 {...props}/>
.
Or you can use Redux https://react-redux.js.org/
来源:https://stackoverflow.com/questions/60689482/react-ionic-5-how-to-pass-object-from-app-component-to-tab-component