如何在React中的classname字段中传递带有参数的函数?

时间:2017-11-24 18:24:39

标签: reactjs function parameter-passing jsx classname

我的React项目中有以下组件。我想要做的是向<li>元素添加className属性。将其设置为等于getSortByClass()方法的返回值,并将sortByOptionValue作为参数传递。

import React from 'react';
import './SearchBar.css';

const sortByOptions = {
  'Best Match': 'best_match',
  'Highest Rated': 'rating',
  'Most Reviewed': 'review_count'
}
function getSortByClass(sortByOption){
  if (this.state.sortBy === sortByOption) {
    return 'active';
  }
  else {
    return '';
  }
}
function handleSortByChange(sortByOption){
  this.setState({
     sortBy: sortByOption
   });
}
export class SearchBar extends React.Component{
    renderSortByOptions(){
      return Object.keys(sortByOptions).map(sortByOption => {
        let sortByOptionValue = sortByOptions[sortByOption];
        return <li className={getSortByClass(sortByOptionValue)} key={sortByOptionValue}> {sortByOption} </li>;
      });
    }

    constructor(props) {
        super(props);
        this.state = {
          term: '',
          location: '',
          sortBy: 'best_match',
        };
    }
    render(){
      return (
      <div className="SearchBar">
        <div className="SearchBar-sort-options">
          <ul>
            {this.renderSortByOptions()}
          </ul>
        </div>
        <div className="SearchBar-fields">
          <input placeholder="Search Businesses" />
          <input placeholder="Where?" />
        </div>
        <div className="SearchBar-submit">
          <a>Lets Go</a>
        </div>
        </div>
      );
    }
  }

  export default SearchBar;

设置classname字段后,我收到错误:TypeError: Cannot read property 'state' of undefined

1 个答案:

答案 0 :(得分:2)

....
function getSortByClass(sortBy, sortByOption){
  if (sortBy === sortByOption) {
    return 'active';
  }
  else {
    return '';
  }
}

export class SearchBar extends React.Component{
    handleSortByChange = (sortByOption) => this.setState({ sortBy: sortByOption});

    renderSortByOptions(){
      const that = this;

      return Object.keys(sortByOptions).map(sortByOption => {
        let sortByOptionValue = sortByOptions[sortByOption];
        return <li className={getSortByClass(that.state.sortBy, sortByOptionValue)} key={sortByOptionValue}> {sortByOption} </li>;
      });
    }
    ....

将您的状态传递给getSortByClass方法,因为它无法访问this,因为它是在课外写的。同时在您的类中写handleSortByChange,因为它正在从this访问setState。

您还可以将代码美化为:

renderSortByOptions(){
          const that = this;

          return Object.keys(sortByOptions).map(sortByOption => {
            let sortByOptionValue = sortByOptions[sortByOption];
            return (
               <li className={that.state.sortBy === sortOption ? 'active' : ''} 
                   key={sortByOptionValue}
               > 
                   {sortByOption} 
               </li>
           );
        });
     }