繁体   English   中英

子组件的事件处理程序设置状态不会重新呈现父组件

[英]Event-handler setting state from a child component doesn't re-render parent component

我正在尝试从子组件(TableOfContents)设置父组件(App)的State,在这种情况下是无状态功能组件,以便所有内容都可以重新呈现和更新我的表。 据我所知,事件处理程序(changeUrl)被调用并且状态被更改,但是什么都没有重新呈现,表未更新!

class App extends React.Component {
   root = 'https://fcctop100.herokuapp.com/api/fccusers/top/';
   allTime = 'alltime';
   recent = 'recent';

   constructor(props) {
      super(props);
      this.state = { data: null, 
                    url: this.root + this.allTime };
      this.changeUrl = this.changeUrl.bind(this);
   }

   componentDidMount() {
       return fetch(this.state.url)
         .then(response => response.json())
         .then(responseJson => {
            this.setState({ data: responseJson });
         });  
   }  

   changeUrl() {
      this.setState({ url: this.root + this.recent });
   }

   render() {
      return (
         <div id="container">
            <Head />
            <TableOfContents handleClick={this.changeUrl} />
            <Tables data={this.state.data}/>
         </div>
      );
   }
}

const Head = (props) => {
   return (
      <div className="head">
        freeCodeCamp Leaderboard 
      </div>
   );
}

const TableOfContents = (props) => {
   return (
      <div className="tableOfContents">
         <tr className="headers" >
            <td>#</td>
            <td id='special'>Camper Name</td>
            <td onClick={props.handleClick}  style={{cursor: 'pointer'}}>Points in last 30 days</td>
            <td>All time points</td>
         </tr>
      </div>
   );
}

const Tables = (props) => {
   if (!props.data) return <p>Loading...</p>;
   return (
      <div className="tables">
         {
            props.data.map( (d, i) => 
               <tr id={'table' + i}>
                  <td>{i + 1}</td>
                  <td><img src={d.img} /></td>
                  <td>{JSON.stringify(d.username).replace(/"/g, '')}</td>
                  <td>{JSON.stringify(d.recent)}</td>
                  <td>{JSON.stringify(d.alltime)}</td>
               </tr>)
         }
      </div>
   );
}

ReactDOM.render(
   <App />,
   document.getElementById('app')
);

如果要用新数据填充表,还可以将componentDidUpdate与componentDidMount一起使用以进行提取逻辑

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM