Реагировать — установить стрелку направления для заголовков таблиц

#reactjs #lodash #jsx #css-tables

#reactjs #Lodash #jsx #css-таблицы

Вопрос:

Я столкнулся с небольшой проблемой при настройке стрелок направления при нажатии на заголовки таблиц для выполнения сортировки каждого столбца. Таблица создается динамически, как вы можете видеть в приведенном ниже коде.

Чего я хотел бы добиться, так это того, чтобы стрелка появлялась только при нажатии на каждый столбец и исчезала при переключении столбца. Что мне удалось сделать, так это переключить стрелки, но они появляются во всех столбцах даже при загрузке страницы, чего я не хочу.

У вас есть какие-либо предложения, чтобы сделать это? У меня нет идей…

Вот фрагмент класса:

 import { connect } from 'react-redux';
import { orderBy } from "lodash";

class Test extends React.Component {

    constructor(props) {
        super(props);

        this.state = {
            currentlyDisplayed: this.props.games,
            sortParams: {
                direction: undefined   
            }
        };

        this.handleColumnHeaderClick = this.handleColumnHeaderClick.bind(this);
    }

    handleColumnHeaderClick(sortKey, e) {
        const {
            currentlyDisplayed,
            sortParams: { direction }
        } = this.state;


        // Check, what direction now should be
        const sortDirection = direction === "desc" ? "asc" : "desc";

        // performing the column switch and class toggle
        this.setState(prevState => ({ editingContactId: prevState.editingContactId === sortKey? null:sortKey})) 
        

        // Sort collection
        const sortedCollection = orderBy(currentlyDisplayed, [sortKey], [sortDirection]);

        //Update component state with new data
        this.setState({
          currentlyDisplayed: sortedCollection,
          sortParams: {
            direction: sortDirection
          }
        });
    }

      
    printObj(type='body', obj) {
        const content = [];

        for(const [key, value] of Object.entries(obj)) {
            content.push(this.buildCell(type, key, value));
        }

        return content;
    }

 
    buildCell(type='body', key, value) {
        return (
            <>       
                { type==='header' ? <th className={key === this.state.editingContactId ? 'sort-desc' : 'sort-asc'}  onClick={(e) => this.handleColumnHeaderClick(key, e)} key={key}>{key}</th> : <td key={key}>{value}</td> }
            </>
        );

    }

    render() {

        return (
            <>
              <table>
                    <thead>
                        <tr>
                            {this.state.currentlyDisplayed.length !== 0 amp;amp; 
                                this.printObj('header', this.props.games[0])
                            }
                        </tr>
                    </thead>
                    <tbody>
                        {this.state.currentlyDisplayed.length !== 0 amp;amp; 
                            this.state.currentlyDisplayed.map((obj, key) => {
                                return (
                                    <tr key={key}>
                                        { this.printObj('body', obj) }
                                    </tr>
                                );
                            })
                        }
                    </tbody>
                </table>
            </>
        );
    }
}

export default connect(
    mapStateToProps
)(Test);
  

Ответ №1:

Попробуйте что-то подобное, используя направление сортировки.

  <th className={key === this.state.editingContactId
  ? this.sortParams.direction === "asc"
    ? "sort-asc"
    : "sort-desc"
  : ""}
  

Комментарии:

1. спасибо за ваш ответ. Я получаю ту же проблему, что и раньше. Значение «this.state.editingContactId» равно НУЛЮ, когда я нажимаю во второй раз на тот же столбец или другой. Следовательно, второй раз класс не присваивается. Это работает только при первом щелчке по столбцу. Я не понимаю, почему… есть идеи?