javascript - 基于 URL 的 React 组件状态
问题描述
我有一个大型网站,在主要网站下有许多子网站。我有一个SubNav
显示我们当前访问的公司页面的名称。当用户在页面之间导航时,它应该SubNav
使用名称更新 。
这是我尝试过但无济于事的方法。
主要父根组件。
class AppRouter extends React.Component {
state = { companySelected: "Main Company" };
// this should update the company and name the SubNav bar
updateSelectedCompany = companySelected => {
console.log("updated selected", companySelected);
this.setState({ companySelected: companySelected });
};
render() {
return (
<Router history={history}>
<div>
<NavBar />
<SubNav companySelected={this.state.companySelected} />
<Switch>
<Route path="/" component={LandingPage} exact={true} />
<Route
path="/company/1"
component={SubCompany1}
exact={true}
updateSelectedCompny={this.companySelected}
/>
<Route
path="/company/2"
component={SubCompany2}
exact={true}
/>
</Switch>
<Footer />
</div>
</Router>
);
}
}
SubCompany1 页面如下所示:
class SubCompany1 extends React.Component {
componentDidMount() {
this.setState({ companySelected: "Sub Company 1" });
console.log("Did Mount Sub Company1");
}
render() {
return (
<div>
<h1>Sub Company 1</h1>
</div>
);
}
}
每次访问页面时都可以通过吗?我对反应很陌生,并不完全确定在组件之间传递状态的最佳方式。
解决方案
你需要componentDidMount()
并且shouldComponentUpdate()
应用路由器
class AppRouter extends React.Component {
state = { companySelected: "Main Company" };
updateSelectedCompany = companySelected => {
this.setState({ companySelected: companySelected });
};
//if condition evaluates to true, component will update and re-render. if false, no re-render.
shouldComponentUpdate(nextProps, nextState){
return this.state.companySelected !== nextState.companySelected
}
render() {
return (
<Router history={history}>
<div>
<NavBar />
<SubNav companySelected={this.state.companySelected} />
<Switch>
<Route path="/" component={LandingPage} exact={true} />
<Route
path="/company/1"
component={() => <SubCompany1 updateSelectedCompany={this.updateSelectedCompany} />}
</Switch>
<Footer />
</div>
</Router>
);
}
}
子页面
class SubCompany1 extends React.Component {
componentDidMount() {
this.props.updateSelectedCompany("Sub Company 1");
}
render() {
return (
<div>
<h1>Sub Company 1</h1>
</div>
);
}
}
推荐阅读
- python - 轴旋转问题
- javascript - 带有下拉菜单的角度过滤
- sql-server - 如何编写此 MSSQL 数据库查询?
- ruby-on-rails - 使用belongs_to关系的rails内部连接
- python - python中的类型转换(StringVar到String)
- angular - 在角度组件之间共享数据
- c# - 打印文档通过状态打印进入打印假脱机,但它不使用 rawprint nuget 包 C# 打印文档
- android - AndroidX BottomAppBar 导航图标颜色
- javascript - JS - 从嵌套在应该可点击的项目内的元素解除绑定点击动作
- c++ - C ++“错误:'class std::result_of < ... >中没有名为'type'的类型”