2016-12-02 65 views
1

我正在使用FreeCodeCamp中的Sass和ReactJS處理「Camper's Leaderboard」challenge。我無法弄清楚如何在兩個元素之間切換className: enter image description here
其主要思想是:當用戶點擊標籤時,處理函數被調用,但除此之外,我想在需要時添加 - 刪除className =「noTriangle」 。這取決於父母組件中的「sortAllTime:true」狀態。 下面的代碼:在React中點擊兩個元素之間的className

"use strict"; 
 
class TableBox extends React.Component { 
 
    constructor(props) { 
 
     super(props); 
 
     this.state = { 
 
      data: [], 
 
      sortAllTime: true 
 
     }; 
 
    } 
 

 
    loadCampersFromServer(sortAllTime) { 
 
     let templateURL = 'https://fcctop100.herokuapp.com/api/fccusers/top/'; 
 
     let url = sortAllTime ? (templateURL + 'alltime') : (templateURL + 'recent'); 
 
     fetch(url) 
 
      .then(
 
       (response) => { 
 
        if (response.status !== 200) { 
 
         console.log('Looks like there was a problem. Status Code: ${response.status}'); 
 
         return; 
 
        } 
 
        response.json().then((data) => { 
 
         console.log('getting data:..'); 
 
         this.setState({data, sortAllTime}); 
 

 
        }) 
 
       } 
 
      ) 
 
      .catch(function (err) { 
 
       console.log('Fetch Error :-S', err); 
 
      }); 
 
    } 
 

 
    _handlerAll() { 
 
     if (!this.state.sortAllTime) { 
 
      this.loadCampersFromServer(true); 
 
     } 
 
    } 
 

 
    _handler30() { 
 
     if (this.state.sortAllTime) { 
 
      this.loadCampersFromServer(false); 
 
     } 
 
    } 
 

 
    componentDidMount() { 
 
     this.loadCampersFromServer(true); 
 
    } 
 

 
    render() { 
 
     return <CampersList _data={this.state.data} 
 
          _handlerAll={this._handlerAll.bind(this)} 
 
          _handler30={this._handler30.bind(this)}/>; 
 
    } 
 
} 
 

 
class CampersList extends React.Component { 
 
    constructor(props) { 
 
     super(props); 
 
    } 
 

 
    render() { 
 
     let campersNodes = this.props._data.map((element, index) => { 
 
      return (
 
       <Camper user={element} index={index}/> 
 

 
      ); 
 
     }); 
 
     return (
 
      <table> 
 
       <tr> 
 
        <th>#</th> 
 
        <th>Camper's Name</th> 
 
        <th onClick={this.props._handler30}>Points in past 30 days 
 
         <span className="noTriangle">&#9660;</span> 
 
        </th> 
 
        <th onClick={this.props._handlerAll}>All time points 
 
         <span >&#9660;</span> 
 
        </th> 
 
       </tr> 
 
       {campersNodes} 
 
      </table> 
 
     ) 
 
    } 
 
} 
 

 
class Camper extends React.Component { 
 
    constructor(props) { 
 
     super(props); 
 
    } 
 

 
    render() { 
 
     return (
 
      <tr> 
 
       <td>{this.props.index + 1}</td> 
 
       <td> 
 
        <img src={this.props.user.img} alt="logo"/> 
 
        <span>{this.props.user.username}</span> 
 
       </td> 
 
       <td>{this.props.user.recent}</td> 
 
       <td>{this.props.user.alltime}</td> 
 
      </tr> 
 
     ) 
 
    } 
 
} 
 

 
ReactDOM.render(<TableBox />, document.getElementById('root'));
div#root { 
 
    margin: 0 auto; 
 
    width: 50%; } 
 

 
img { 
 
    width: 32px; } 
 

 
span { 
 
    padding: 20px 5px; } 
 

 
table { 
 
    font-family: 'Arial'; 
 
    margin: 25px auto; 
 
    border-collapse: collapse; 
 
    border: 1px solid #eee; 
 
    border-bottom: 2px solid #ccc0b8; 
 
    box-shadow: 0px 0px 20px rgba(0, 0, 0, 0.1), 0px 10px 20px rgba(0, 0, 0, 0.05), 0px 20px 20px rgba(0, 0, 0, 0.05), 0px 30px 20px rgba(0, 0, 0, 0.05); } 
 
    table tr:hover { 
 
    background: #f4f4f4; } 
 
    table tr:hover td { 
 
     color: #555; } 
 
    table tr th, table tr td { 
 
    color: #999; 
 
    border: 1px solid #eee; 
 
    padding: 12px 35px; 
 
    border-collapse: collapse; } 
 
    table tr th { 
 
    background: #619d9f; 
 
    color: #fff; 
 
    text-transform: uppercase; 
 
    font-size: 12px; } 
 
    table tr th.last { 
 
     border-right: none; } 
 
    table tr th:nth-last-child(-n+2) { 
 
     cursor: pointer; } 
 
     table tr th:nth-last-child(-n+2):hover { 
 
     background: #427370; } 
 
    table tr th span.noTriangle { 
 
     display: none; } 
 

 
/*# sourceMappingURL=style.css.map */
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react.min.js"></script> 
 
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react-dom.min.js"></script> 
 
<div id="root"></div>

+0

我做價值定義不要深入你的代碼...但快速的anserw是...通過'sortAllTime'作爲參數,並在渲染f給定組件的聯合,如果'sortAllTime'的值爲真,則創建一個像'targetClassName'的變量並將其追加到第二個類。 – grzesiekgs

回答

1

在父組件,通過state.sortAllTimeCampersList道具, 在CampersList定義className,它是基於props.sortAllTime

class CampersList extends React.Component { 
    constructor(props) { 
     super(props); 
    } 

    render() { 
     let campersNodes = this.props._data.map((element, index) => { 
      return (
       <Camper user={element} index={index}/> 

      ); 
     }); 

     let triangleClass = this.props.sortAllTime ? '' : 'noTriangle' 
+0

你的提示是正確的,但我需要爲每個跨度創建一個變量。 http://imgur.com/a/6dRxL/。似乎只有一個變量存在更好的方式。 –

+0

那麼如果你不想聲明更多的變量,那麼你必須在你的JSX中定義條件語句塊。在我看來,它產生較少可讀代碼,並相信我 - 一個變量不會傷害你。只要保持明顯的命名。 – grzesiekgs

相關問題