客户端请求一项功能以实现仪表板切换。我正在努力:
Dashboard.js
import React, { Component } from 'react';
import { connect } from 'react-redux';
// components
import UserDashboard from '../components/dashboard/user-dashboard/UserDashboard.js';
import NewUserDashboard from '../components/new-dashboard/user-dashboard/NewUserDashboard.js';
@connect((state) => {
return {
identity: state.identity.toJS().profile
};
})
export default class Dashboard extends Component {
render() {
const msisdn = this.props.location.state ? this.props.location.state.msisdn : null;
return (
<UserDashboard msisdn={ msisdn }/>
);
}
}
Dashboard.js是仪表板控制器。我有2个仪表板:UserDashboard和NewDashboard。
假设用户正在查看另一个屏幕,并且在该屏幕中有一个按钮。如果单击该按钮,则仪表板将调用它的render方法,而是返回NewDashboard。并且NewDashboard将自动显示。这可能吗?
答案 0 :(得分:5)
无法通过编程方式调用渲染方式。
如果要调用该特定组件的渲染方法,则必须对该组件进行state update
。
说,如果要调用Dashboard
组件的渲染方法,则必须在此组件上调用setState
。您可以为此执行一些虚拟状态。
答案 1 :(得分:1)
想象一下,您有这个仪表板:
function DashBoard({index}) {
return index == 0 ? <UserDashBoard /> : <SecondDashBoard />;
}
没有路由器:
class ParentComponent extends ReactComponent {
state = {
dashboardIndex: 0
}
changeDashboard() {
this.setState({
dashBoardIndex: (state.dashboardIndex + 1) % 2
})
}
render() {
return (
<div>
<button onclick={() => this.changeDashboard()}>Change dashboard</button>
<Dashboard index={this.state.dashboardIndex} />
</div>
)
}
}
使用路由器:
<Switch>
<Route match="/component1" component={UserDashboard} />
<Route match="/component2" component={SecondDashboard} />
</Switch>
您也可以使用redux。
答案 2 :(得分:0)
可能类似于:
class NewDashboard extends React.Component {
static triggerRender() {
this.forceUpdate();
}
// or
static altTriggerRender() {
this.setState({ state: this.state });
}
render() {...}
}
尽管如此,最好通过条件渲染来显示/隐藏其他组件。
更新: 在静态方法中无法访问“ This”。忽略代码。
答案 3 :(得分:0)
您可以使用状态使用条件渲染。 您可以跟踪当前活动的选项卡,并使用该状态来呈现所需的组件。
答案 4 :(得分:0)
通常,要更改页面视图,您将使用Router。您可以配置与仪表板相对应的路由
import UserDashboard from '../components/dashboard/user-dashboard/UserDashboard.js';
import NewUserDashboard from '../components/new-dashboard/user-dashboard/NewUserDashboard.js';
@connect((state) => {
return {
identity: state.identity.toJS().profile
};
})
export default class Dashboard extends Component {
render() {
const msisdn = this.props.location.state ? this.props.location.state.msisdn : null;
return (
<BrowserRouter>
<Route path="/dashboard/user" render={(props) => <UserDashboard msisdn={ msisdn } {...props}/>} />
<Route path="/dashboard/new" render={(props) => <NewUserDashboard msisdn={ msisdn } {...props}/>} />
</BrowserRouter>
);
}
}
并单击按钮可以使用链接。
否则,您可以根据状态变化有条件地渲染组件
// components
import UserDashboard from '../components/dashboard/user-dashboard/UserDashboard.js';
import NewUserDashboard from '../components/new-dashboard/user-dashboard/NewUserDashboard.js';
@connect((state) => {
return {
identity: state.identity.toJS().profile
};
})
export default class Dashboard extends Component {
state = {
userDashboard: true
}
onToggle=(state)=> {
this.setState(prevState => ({
userDashboard: !prevState.userDashboard
}))
}
render() {
const msisdn = this.props.location.state ? this.props.location.state.msisdn : null;
return <div>{userDashboard? <UserDashboard msisdn={ msisdn }/>
: <NewUserDashboard msisdn={ msisdn }/>}
<button onClick={this.onToggle}>Toggle</button>
</div>
);
}
}