This is my first React project and I'm pretty sure I'm not managing state correctly but I don't know what to search for for learning a better approach.
I have a parent / child component interaction. The parent passes a true or false to the child depending on user selection on the parent. The user can also make a choice in the child component (when visible) to change that same true or false variable.
I'm pretty sure I want to only manage that true / false state on the parent but I haven't been able to discover how to do that. This is the best I have come up with. On initial load everything works properly but subsequent interactions the parent no longer communicates with the child.
Parent Component:
const App = ()=> { const [drawerVisible, setDrawerVisible] = useState<boolean>(false); //useEffect(() => { setDrawerVisible(drawerVisible)}, [drawerVisible] ) const showDrawer = () => { console.log('App show drawer before: ' + drawerVisible); setDrawerVisible(true); console.log('App drawer after: ' + drawerVisible) }; return <Layout> <UserDrawer drawerVisible={drawerVisible} /> </Layout> }; export default App; Child Component:
interface DrawerVisible { drawerVisible:boolean } const UserDrawer = ({drawerVisible}:DrawerVisible) => { console.log('child passed in: ' + drawerVisible); const [drawerHidden, setDrawerHidden] = useState<boolean>(drawerVisible); useEffect(() => { setDrawerHidden(drawerVisible)}, [drawerVisible] ) const onClose = () => { setDrawerHidden(false); }; return <Drawer title="User Details" placement={'right'} closable={true} onClose={onClose} visible={drawerHidden} getContainer={false} style={{ position: 'absolute' }} > <Logout /> </Drawer> } export default UserDrawer; As I mentioned on initial load everything works. The console log shows correct values and the drawer shows.
Console Log:
App show drawer before: false App.tsx:47 App drawer after: false UserDrawer.tsx:10 child passed in: true UserDrawer.tsx:10 child passed in: true //Not sure why UserDrawer is being called twice? However subsequent interactions never get passed to the child.
Console Log:
//Clicked show drawer button 3 times App show drawer before: true App.tsx:47 App drawer after: true App.tsx:45 App show drawer before: true App.tsx:47 App drawer after: true App.tsx:45 App show drawer before: true App.tsx:47 App drawer after: true What can I try next?