React-virtualized MultiGrid row - hover css

Можно ли использовать CSS для изменения цвета фона строки при наведении курсора в компоненте MultiGrid? Как я вижу, на уровне строки нет div. Все клетки находятся на одном уровне. Для компонента Table есть свойство rowClassName, но не для MultiGrid.

Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Навигация по приложениям React: Исчерпывающее руководство по React Router
Навигация по приложениям React: Исчерпывающее руководство по React Router
React Router стала незаменимой библиотекой для создания одностраничных приложений с навигацией в React. В этой статье блога мы подробно рассмотрим...
Массив зависимостей в React
Массив зависимостей в React
Все о массиве Dependency и его связи с useEffect.
0
0
2 589
3

Ответы 3

Взгляните на https://github.com/techniq/mui-виртуализированная-таблица/

Он использует MultiGrid внутри.

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

Вы можете добавить имя класса в ячейки, а затем использовать чистый css. Например:

<MultiGrid  
     {...this.state}
     ref = {this.grid}
     cellRenderer = {_cellRenderer}
     columnWidth = {_getColumnWidth}
     columnCount = {rows[0].length}
     height = {1024}
     rowHeight = {_getColumnHeight}
     rowCount = {rows.length}
     width = {width}
     styleTopRightGrid = {STYLE_TOP_RIGHT_GRID}/>

Как вы можете видеть, MultiGrid использует _cellRenderer, который:

const _cellRenderer = ({columnIndex, key, rowIndex, style}) => {
    return(
             <div className = "cell">
                 {row[rowIndex][columnIndex]}
             </div>
    );
})

В вашем css вы можете просто добавить:

.cell:hover {
    background-color: yellow;
 }

таким образом изменит свой цвет только ячейка, а не строка

Anton 06.04.2019 14:38

Решил это, получив следующих и предыдущих братьев и сестер элементов и добавив имя класса "row-hover".

const CLASSNAME = 'row-hover';

const hoverLeftSide = (e, shouldHover) => {
    const prevEl = e.previousElementSibling;
    const prevInSameRow = prevEl && e.style.top === prevEl.style.top;

    if (prevInSameRow) {
        if (shouldHover) {
            prevEl.classList.add(CLASSNAME);
        } else {
            prevEl.classList.remove(CLASSNAME);
        }
    
        hoverLeftSide(prevEl, shouldHover);
    }

}

const hoverRightSide = (e, shouldHover) => {
    const nextEl = e.nextElementSibling;
    const nextInSameRow = nextEl && e.style.top === nextEl.style.top;

    if (nextInSameRow) {
        if (shouldHover) {
            nextEl.classList.add(CLASSNAME);
        } else {
            nextEl.classList.remove(CLASSNAME);
        }
    
        hoverRightSide(nextEl, shouldHover);
    }
}

const hoverRow = (e, shouldHover) => {
    if (shouldHover) {
        e.currentTarget.classList.add(CLASSNAME);
    } else {
        e.currentTarget.classList.remove(CLASSNAME);
    }

    hoverLeftSide(e.currentTarget, shouldHover);
    hoverRightSide(e.currentTarget, shouldHover);
}

export default hoverRow;

// import hoverRow from './hoverRow';
//
// return (
//     <div
//         onMouseOver = {(e) => hoverRow(e, true)}
//         onMouseOut = {(e) => hoverRow(e, false)}
//     >
//         {children}
//     </div>
// )

Другие вопросы по теме