当前位置: 首页 > 知识库问答 >
问题:

Reactjs更新祖父母状态

薛楷
2023-03-14

我刚刚开始使用ReactJs开发,并一直遵循serverless-stack.com教程。我已经准备好扩展应用程序并创建一个模板,带有n个子组件,但是在管理孙子组件之间的用户会话时遇到了麻烦。

我有管理用户会话的App.js。但是我在孙子组件中有我的注销按钮,我无法让它调用App.js signOut()函数。

App.js

function App(props) {
  const [isAuthenticating, setIsAuthenticating] = useState(true);
  const [isAuthenticated, userHasAuthenticated] = useState(false);

  useEffect(() => {
    onLoad();
  }, []);

  const onLoad = async () => {
    try {
      await Auth.currentSession();
      userHasAuthenticated(true);
    } catch (e) {
      if (e !== "No current user") {
        alert(e);
      }
    }
    setIsAuthenticating(false);
  }

  const signOut = async () => {
    console.log("Signing out.");
    await Auth.signOut();
    userHasAuthenticated(false);
    console.log("signed out.");
  };

  return (
    <BrowserRouter>
        <Switch>
...
          <Layout
            path='/'
            name='Home'
            {...props}
            onLogout={signOut}
          />
        </Switch>
    </BrowserRouter>
  );
}

export default withRouter(App);

我的布局组件有一系列不同的组件,如页眉、页脚、导航等。。

function Layout(props) {
  return (
    <div className='app'>
...// header component
          <NavBar
            onLogout={props.onLogout}
            isAuthenticated={props.isAuthenticated}
          />
... //main body and footer components
</div>
);
}
export default Layout;

最后,我的NavBar孙子组件:

function NavBar(props) {
  useEffect(() => {
    onLoad();
  }, []);

  async function onLoad() {
    console.log("Is authed at navbar? " + props.isAuthenticated);

  }

  return (
    <React.Fragment>
      <Nav className='ml-auto' navbar>
.. // other NavItems
        <UncontrolledDropdown nav direction='down'>
          <DropdownToggle nav>
            <img
              src={"../../assets/img/usermenu.png"}
              className='img-avatar'
              alt='user menu icon'
            />
          </DropdownToggle>
          <DropdownMenu right>
...
            <DropdownItem onClick={props.onLogout}>
              <i className='fa fa-lock'></i> Logout
            </DropdownItem>
          </DropdownMenu>
        </UncontrolledDropdown>
      </Nav>
    </React.Fragment>
  );
}

export default NavBar;

当我加载站点并进行身份验证时,控制台会写出“是否在navbar上进行了身份验证?True”。因此我知道孙子正确地获得了isAuthenticated状态。但是,当我单击注销按钮时,不会发生任何事情,控制台中也不会出现警告或错误。

共有1个答案

宋昊然
2023-03-14

起初,在Navbar组件中,我看到了这个函数

async function onLoad() {
    console.log("Is authed at navbar? " + props.isAuthenticated);
}

我跟踪看看你在哪里传递了props.is身份验证。我确实是在这里找到的

<Layout
  path='/'
  name='Home'
  props={props}
  onLogout={signOut}
/>

为什么有一个名为props的道具???如果要将传递给父级的所有道具向下传递给其子级(传递道具),请使用“排列”操作符。您可以在这里看到答案:这意味着什么…rest在React JSX中

 类似资料:
  • 我试图了解如何构建具有不同"页面"或"视图"的ReactJS应用程序。 我将以下组件作为我的基础应用程序,并且我正在React状态中使用currentState属性在视图中的活动组件之间切换。 它执行此任务,但在启动dataLoaded回调时,组件从不接收更新的recipes数组。 如何根据应用程序中的更新状态更新道具? 还是我处理这整件事的方式错了?

  • 问题内容: constructor(){ super(); this.state = { address: { street:null, city:null, postalCode: null } }; } postalCodeChange(e){ this.setState.address.postalCode = e.target.value; console.log(this.state);

  • 我是reactjs的新手,我不知道如何从父组件中更改子组件的状态。下面是代码 每当对父组件中的执行时,我希望子组件接收。 有什么建议吗?

  • 问题内容: 我觉得我已经在阳光下尝试了所有东西,但是一定缺少一些非常明显的东西。在下面,我试图将一个新项目推入数组并更新状态,但是无论我做什么,状态都不会从初始数组更改。 当我console.log newListItems时,新项目就包括在内,因此到目前为止所有工作都在进行,它是不会更新的实际状态。我想念什么? addItem方法: 我也没有在控制台中收到任何错误消息。 完整代码: 问题答案:

  • 我正在将父组件的状态从父组件传递到子组件。在子组件中,我有一个不同的状态。我正在对子组件的状态执行一些操作,并且结果必须添加到父组件的状态。因此,在我的父组件中,我编写了一个回调函数,该函数将更新父组件的状态。代码为: 因此,这个函数随后作为道具传递给子组件: 然后在我的子组件中,我试图实现回调函数为: 但这并没有达到预期效果。这是正确的方法吗?有人能帮我吗? 我试图通过实现这里提供的解决方案来解

  • 我有一个数组列表 记录在子组件中,它返回给我初始数组。 从API更改数据后 如果我在函数中将该数组记录在父组件中,我将得到一个对象数组。 它正在更改 ,但子组件没有。 我该怎么办??