如何从另一个组件调用React的render方法()?

时间:2018-07-03 05:09:49

标签: javascript reactjs react-redux

客户端请求一项功能以实现仪表板切换。我正在努力:

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将自动显示。这可能吗?

5 个答案:

答案 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() {...}
}

Force React Component 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>
    );
  }
}