我试图使用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,所以如果我需要不同的方法,我会很感激阅读一些建议。
再见,我会像这样重写你的代码:
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组件也会渲染到路由。 问题:为什么我不能在交换机内部的同一路径上渲染多个组件?