【问题标题】:How do I create an onHover action in material-table?如何在材料表中创建 onHover 动作?
【发布时间】:2020-07-16 15:40:29
【问题描述】:

我正在使用material-table 并尝试对我当前悬停的行实现高亮显示。

documentation 仅在第三个示例中为 onRowClick 操作提供颜色变化:

function SelectedRowStyling() {
  const { useState } = React;
  const [selectedRow, setSelectedRow] = useState(null);
  
  return (
    <MaterialTable
      title="Selected Row Styling Preview"
      columns={[
        { title: 'Name', field: 'name' },
        { title: 'Surname', field: 'surname' },
        { title: 'Birth Year', field: 'birthYear', type: 'numeric' },
        {
          title: 'Birth Place',
          field: 'birthCity',
          lookup: { 34: 'İstanbul', 63: 'Şanlıurfa' },
        },
      ]}
      data={[
        { name: 'Mehmet', surname: 'Baran', birthYear: 1987, birthCity: 63 },
        { name: 'Zerya Betül', surname: 'Baran', birthYear: 2017, birthCity: 34 },
      ]}
      onRowClick={((evt, selectedRow) => setSelectedRow(selectedRow.tableData.id))}
      options={{
        rowStyle: rowData => ({
          backgroundColor: (selectedRow === rowData.tableData.id) ? '#EEE' : '#FFF'
        })
      }}
    />
  )
}

我在源代码中阅读了可用的props,并没有找到像onRowHover 这样的东西。尝试了一些ThemeProvider 解决方案,但没有成功,我如何通过悬停动作实现颜色变化?

【问题讨论】:

  • 如果您提供 onRowClick,悬停动作也可以直接使用。
  • @Domino987 我虽然打算这样做,但提供 onRowClick 操作会导致鼠标指针变成“点击手”,而 onRowClick 没有附加任何实际操作,从而导致不良的 UI/UX 行为,用户会认为通过单击该行会发生某些事情,而实际上不会发生。

标签: reactjs material-ui material-table


【解决方案1】:

我使用此处提供的方法enter link description hereenter link description here 做了以下示例

我认为关键是重写 Row 组件以访问 onMouseEnter 和 onMouseLeave 事件:

components={{
      Row: props => {
        return (
          <MTableBodyRow
            {...props}
            onMouseEnter={e => handleRowHover(e, props)}
            onMouseLeave={e => handleRowHoverLeave(e, props)}
          />
        );
      }
    }}

还可以像这样设置 rowStyle 选项:

rowStyle: rowData => ({
        backgroundColor:
          rowData.tableData.id === hoveringOver ? "#0471ff" : ""
      })

这是完整的示例代码:

    import React, { Fragment, useState } from "react";
import MaterialTable, { MTableBodyRow } from "material-table";

export default function CustomEditComponent(props) {
const [hoveringOver, setHoveringOver] = useState("");

const tableColumns = [
    { title: "Client", field: "client", width: "40%" },
    { title: "Name", field: "name", width: "40%" },
    { title: "Year", field: "year", width: "20%" }
];

const tableData = [
    {
    client: "client1",
    name: "Mary",
    year: "2019"
    },
    {
    client: "client2",
    name: "Joe",
    year: "2018"
    },
    {
    client: "client3",
    name: "Kal",
    year: "2019"
    },
    {
    client: "client4",
    name: "Dal",
    year: "2012"
    }
];

const handleRowHover = (event, propsData) => setHoveringOver(propsData.index);

const handleRowHoverLeave = (event, propsData) => setHoveringOver("");

return (
    <Fragment>
    <MaterialTable
        columns={tableColumns}
        data={tableData}
        title="Material Table sample"
        options={{
        tableLayout: "fixed",
        search: false,
        rowStyle: rowData => ({
            backgroundColor:
            rowData.tableData.id === hoveringOver ? "#0471ff" : ""
        })
        }}
        components={{
        Row: props => {
            return (
            <MTableBodyRow
                {...props}
                onMouseEnter={e => handleRowHover(e, props)}
                onMouseLeave={e => handleRowHoverLeave(e, props)}
            />
            );
        }
        }}
    />
    </Fragment>
);
}

这里是sandbox。我希望这对你有用!

【讨论】:

  • 嗨尼科!感谢你的回答!我使用这种方法遇到的问题是,每次我进入或离开一行时它都会改变状态,再次渲染每个表格元素,当处理大量数据时,它变得非常滞后并且性​​能不佳
  • 我明白了,如果我找到替代方案,我会更新。也许与裁判一起工作,我不太确定。
  • 我也有同样的问题。它可以工作,但不幸的是它无法使用 100 多行
猜你喜欢
  • 2018-12-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-12-09
  • 2016-01-10
  • 2018-10-24
  • 2017-12-07
相关资源
最近更新 更多