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

每当我在子组件之间切换时,父组件的React路由器道具都会刷新

锺超英
2023-03-14

我试图使用React创建简单的社交媒体软件,用户可以发布一些内容,其他人可以在提要上看到帖子。我有一个Home组件,我通过使用useHistory.push方法的登录组件向其传递道具。在Home组件中,我希望NavBar是持久的,并使用NavBar链接切换内容。每当我使用路由和链接更改子组件时,主组件重新加载并丢失道具,导致“无法读取未定义的属性用户名”错误。在道具中,我只保留登录人的用户名。

应用组件(默认)

function App() {
  console.log('app loaded')
  return (
    <BrowserRouter>
        <Route path="/" exact component={Login} />
        <Route path="/app" component={Home} />
        <Route path="/register" exact component={Register} />
    </BrowserRouter>
  );
}

export default App;

主分量

const Home = (props) => {
    console.log('loaded home')
    const username = props.location.state.username

    return (
        <div>
            <NavBar user={username} />
            <Switch>
                <Route path="/app/feed" component={Feed} />
            </Switch>
        </div>
    )
}

export default Home;

导航栏组件

const NavBar = (props) => {
    return (
            <nav className="navbar navbar-expand-md navbar-light fixed-top">
                <h2>Welcome, {props.user}</h2>
                <ul className="navbar-nav">
                    <li className="nav-item">
                        <Link to="/app/feed" className="nav-link">Feed</Link>
                    </li>
                    <li className="nav-item">
                        <Link to="/app" className="nav-link">User Page</Link>
                    </li>
                    <li className="nav-item">
                        <Link to="/" className="nav-link" id="log-out-link">Log out</Link>
                    </li>
                </ul>

            </nav>
    )
}
export default NavBar;

我刚刚开始使用React,所以如果我需要不同的方法,我会很感激阅读一些建议。

共有1个答案

季阳朔
2023-03-14

再见,我会像这样重写你的代码:

App.js

function App() {
  console.log('app loaded')
  return (
    <BrowserRouter>
      <Route path="/" exact component={Login} />
      <Route path="/app" component={Home}>
        <Route path="/app/feed" component={Feed} />
      </Route>
      <Route path="/register" exact component={Register} />
    </BrowserRouter>
  );
}

export default App;

Home.js

const Home = (props) => {
console.log('loaded home')
const username = props.location.state.username

return (
    <div>
        <NavBar user={username} />
    </div>
)
}

export default Home;

NavBar.js

const NavBar = (props) => {
return (
        <nav className="navbar navbar-expand-md navbar-light fixed-top">
            <h2>Welcome, {props.user}</h2>
            <ul className="navbar-nav">
                <li className="nav-item" onClick={() => history.push('/app/feed') }>
                </li>
                <li className="nav-item" onClick={() => history.push('/app') }>
                </li>
                <li className="nav-item" onClick={() => history.push('/')>
                </li>
            </ul>

        </nav>
)
}
export default NavBar;

这个实现应该可以解决您的问题。

 类似资料:
  • 我是个新手,所以不要用任何非技术性的词语。我有一个父组件,它在单击按钮时有一个按钮元素,调用一个函数来创建一个新对象。我想要的是,当用户单击这个按钮时,子组件应该呈现在父按钮元素下面,每次单击按钮时,新对象应该作为道具传递给子组件,以便它可以在屏幕上显示它,但以前调用的子组件应该保留在屏幕上。 从React导入; 类父母组件扩展反应。PureComponent{ }

  • 我正在使用react路由器dom v5。反应v16中的2.0。13.1项目中,我使用静态路由将道具从父组件传递到子组件,父组件从其父组件(即祖父)接收道具。从应用程序。js-

  • 我在React路由器2.2.1中使用React 15.0.1。我将应用程序用作父组件,它呈现从路由器处理程序传递的子组件。 这是我的导航栏组件。 这些是我的路线处理程序。当用户在路由上着陆时,将对其进行身份验证检查。如果身份验证失败,它们将被重定向到登录路径。 当应用程序组件第一次挂载导航栏和子组件时,它会检查身份验证并相应地添加到导航栏的链接。成功登录后,当用户从登录路由重定向到索引路由时,子组

  • 我对反应和试图理解如何传递道具很陌生。 首先,我设置了一个Navlink组件,该组件包含子类别属性: ,,都是从json文件中获取的,所以这部分是可以的。 每条路线的定义如下: 所以它呈现一个名为

  • 我很难理解这两者之间的区别: 这是: 使用React路由器时,在

  • 我最近在我的路由中实现了反应路由器开关组件,以便呈现一个NoMatch组件(这只是一个404错误组件)。然而,在我的路由中实现这一点后,我注意到在我的主页上只有一个组件会呈现,标题组件。 标题和搜索栏都应该呈现到相同的路径。 我的代码如下: 我注意到如果我删除了Switch组件,那么一切都会渲染得很好,但是NoMatch组件也会渲染到路由。 问题:为什么我不能在交换机内部的同一路径上渲染多个组件?