从模式对话框更改数据后刷新React Component

时间:2018-09-27 19:05:02

标签: javascript reactjs react-router react-props react-state-management

我正在构建一个小型Web应用程序来学习React,现在遇到了一个问题。我的任务是单击特定的城市名称,然后转到将显示该城市名称的另一个组件。

在第二个组件上,我有一个模式对话框,可以在其中更改城市名称。在执行此操作时,我的组件仍显示旧城市名称,而不是我从模式对话框中选择的新城市名称。当我手动刷新页面时,它会显示该新名称。我对这些事情反应并感到困惑,这是我的新手。如何呈现更新的城市名称?

第二表组件:(我要在其中显示城市名称的地方)

class SecondTable extends Component {


state = {
    data: [(visible: false), (city: null)]
  };

   componentDidMount() {
    console.log(this.props);
    let id = this.props.match.params.city_id;
     axios
      .get("http://100.124.69.3:8080/api/v1/cities/" + id)
      .then(res => {
        this.setState({ city: res.data.name });
        console.log(res);
      });
    console.log(this.state.city);
  }

  render() {
    return <div className="align1">{this.state.city}</div>;
  }
}

“模态组件”对话框,从中选择新城市:

class FacilityModal extends Component {


state = {
    cities:[],
  }

  componentDidMount()
  {
    console.log(this.props.visa)
    await axios.get('http://100.124.68.1:8080/api/v1/cities' ).then(res => {
      this.setState({cities:res.data})

    });

  }



render() {
       let posts = (
         <div >All Facilities (NCAL)
               <div className = 'Modal'>
                   {this.state.cities.map(city =>
                       {
                         return <Link to = {'/'+city.id} key = {city.id} onClick = {this.props.onCancel}> {city.name} </Link>
                       })}
               </div>
               </div>

          );

    return (

      <div>
        <Modal
          title="Change Facility"
          visible={this.props.visible}
           onCancel={this.props.onCancel}
          footer={null}
        >
        <div>{posts}</div>
        </Modal>
      </div>
    );
  }

初始城市列表的“我的家庭”组件:

class Home extends Component{


 state = {
    cities:[],
    name:''
  }

   componentDidMount()
  {

     axios.get('http://100.124.68.1:8080/api/v1/cities').then(res => {
      this.setState({cities:res.data})

    });

  }

  render(){
    let postList = this.state.cities.map(city =>
    {
      return (

          <div key = {city.id}>
          <p>
        <Link to = {'/'+city.id}>{city.name}</Link></p>
        </div>
      )
    })
    return(


        <div className = 'align'>All Facilities (NCAL)
<div class="hr-sect">OR</div>
   <div className = 'Modal1'>
            {postList}
        </div>
      </div>


    )
  }

组件的路由:

render() {
return (


<div >
      <BrowserRouter>
        <div className="App">
          <Header />
            <Switch>
                <Route exact path='/' component={Home} />
                <Route path='/users' component={TableData} />
                <Route path='/:city_id' component={SecondTable} />
            </Switch>
        </div>
  </BrowserRouter>

1 个答案:

答案 0 :(得分:0)

您正在独立管理每个组件中的状态。这个问题的简单答案是,您需要更新两个组件都可以从中渲染的状态。从使用状态管理框架(例如redux或mobx)到使用纯粹的反应状态并重新组织组件树,您可以通过多种方式完成此操作。在没有看到您显示的两个组件的父组件的情况下,很难确切地说出应该如何做。其要点是:将一个功能作为道具传递给您的模态组件,当选择城市时将触发该组件。该功能应更新“所选城市”的状态。然后,您将把“选定的城市”作为道具传递给SecondTable组件。更新状态时,将触发重新渲染,这又会将新的“选定城市”状态作为props传递给SecondTable组件,并且还将使用更新后的值重新渲染。

React团队的这篇博客文章是有关如何解决React问题的出色介绍。我不能推荐它。 https://reactjs.org/docs/thinking-in-react.html