reactjs 更改React表中的列宽

bfrts1fy  于 2023-01-25  发布在  React
关注(0)|答案(4)|浏览(364)

我有一个react-table,我试图改变列的大小。我试过编辑列中的“width”值,编辑scss样式表中的值,并添加内联样式,但没有任何效果。我在哪里对这个react-table进行css更改?任何帮助都将是感激的。我看到的任何例子都在我尝试过的列区域中更改了它。

import React, {useState, Fragment} from "react";
import {useTable, useFilters, useGlobalFilter, useRowSelect} from "react-table";
import dataSet from "../data";
import {IndeterminateCheckbox} from './TableCheckbox';

function DeployTable() {

    function DefaultColumnFilter({
                                     column: { filterValue, preFilteredRows, setFilter },
                                 }) {
        const count = preFilteredRows.length

        return (
            <input
                value={filterValue || ''}
                onChange={e => {
                    setFilter(e.target.value || undefined) // Set undefined to remove the filter entirely
                }}
                placeholder={`Search ${count} records...`}
            />
        )
    }

    const [data] = useState(dataSet);

    const [columns] = useState([

        {
            width:'20',
            Header: "Deploy Id",
            accessor: "deploy_id"
        },
        {

            Header: "Requestor",
            accessor: "requestor",
            filter: "fuzzyText"
        },
        {
            Header: "Market",
            accessor: "market"
        },
        {
            Header: "Email",
            minWidth: 50,
            maxWidth: 50,
            accessor: "email"
        },
        {
            Header: "Environment",
            accessor: "environment"
        },
        {
            Header: "Completed Date",
            accessor: "completed_date"
        },
        {
            Header: "Deploy Group",
            accessor: "deploy_group"
        },
        {
            Header: "Job Status",
            accessor: "job_status"
        },
        {
            Header: "CRQ",
            accessor: "crq"
        }

    ]);
    const defaultColumn = React.useMemo(
        () => ({
            // Let's set up our default Filter UI
            Filter: DefaultColumnFilter,
        }),
        []
    )
    const filterTypes = React.useMemo(
        () => ({
            text: (rows, id, filterValue) => {
                return rows.filter(row => {
                    const rowValue = row.values[id];
                    return rowValue !== undefined
                        ? String(rowValue)
                            .toLowerCase()
                            .startsWith(String(filterValue).toLowerCase())
                        : true;
                });
            }
        }),
        []
    );
    const {
        getTableProps,
        getTableBodyProps,
        headerGroups,
        rows,
        prepareRow
    } = useTable({
            columns,
            data,
            defaultColumn,
            filterTypes
        },
        useFilters,
        useGlobalFilter,
        useRowSelect,
        // Here we will use a plugin to add our selection column
        hooks => {
            hooks.visibleColumns.push(columns => {
                return [
                    {
                        id: 'selection',
                        // Make this column a groupByBoundary. This ensures that groupBy columns
                        // are placed after it
                        groupByBoundary: true,
                        // The header can use the table's getToggleAllRowsSelectedProps method
                        // to render a checkbox
                        Header: ({ getToggleAllRowsSelectedProps }) => (
                            <div>
                                <IndeterminateCheckbox {...getToggleAllRowsSelectedProps()} />
                            </div>
                        ),
                        // The cell can use the individual row's getToggleRowSelectedProps method
                        // to the render a checkbox
                        Cell: ({ row }) => (
                            <div>
                                <IndeterminateCheckbox {...row.getToggleRowSelectedProps()} />
                            </div>
                        ),
                    },
                    ...columns,
                ]
            })
        });

    return (
        <Fragment>
            <table {...getTableProps()}  >
                <thead>
                {headerGroups.map(headerGroup => (
                    <tr {...headerGroup.getHeaderGroupProps()}>
                        {headerGroup.headers.map(column => (
                            <th {...column.getHeaderProps()}>{column.render("Header")}
                                <div>{column.canFilter ? column.render('Filter') : null}</div></th>
                        ))}
                    </tr>
                ))}
                </thead>
                <tbody {...getTableBodyProps()}>
                {rows.map((row, i) => {
                    prepareRow(row);
                    return (
                        <tr {...row.getRowProps()}>
                            {row.cells.map(cell => {
                                return <td {...cell.getCellProps()}>{cell.render("Cell")}</td>;
                            })}
                        </tr>
                    );
                })}
                </tbody>
            </table>
        </Fragment>
    );
}

export default DeployTable;

在样式表中。

.Button {
  position: -webkit-sticky;
  position: sticky;
  top: 0;
  padding: 10px;
  font-size: 14px;
}
body {
  background-color: #d1e5f0;
  font: 14px sans-serif;
}

#container {
  width: 100%;
  height: 100%;
  position: relative;
}

#title {
  font: 26px sans-serif;
  position: absolute;
  top: -40px;
  left: 450px;
}

#FilterableTable {
  width: 90%;
  height: 90%;
  position: absolute;
  top: 40px;
  left: 20px;
}

.SearchBar {
  display: inline;
  position: relative;
  left: 1%;
}

.SearchBar input {
  position: relative;
  left: 2%;
}

.Button {
  display: inline;
  position: relative;
  left: 1%;
}

table {
  empty-cells: show;
  position: initial;
  top: 40px;
  left: 20px;
  border-collapse: collapse;
  margin-bottom: 20px;
  margin-top: 20px;
}

table a:link, a:visited { text-decoration: none; }

table a:hover, a:active { text-decoration: underline; }

table, th, td { border: 1px solid black; }
table, th, tr { border: 1px solid black; }

td, th {
  padding: 5px;
  text-align: center;
  height: 20px;
}

th {
  background-color: #4393c3;
  color: #d9f0a3;
}

td { background-color: #92c5de; }

tr { background-color: #92c5de; }

tr:hover td { background-color: #edf8b1; }
tr:hover tr { background-color: #edf8b1; }

/*
This query will take effect for any screen smaller than 480px.
    */
@media only screen and (max-device-width: 480px) {


  /* Force table to not be like tables anymore */
  table, thead, tbody, th, td, tr {
    display: block;
  }
  table{
    border: none;
    width: 100%;
    left: 0px;
    padding-right: 40px;
    height: 400px;
    overflow-y: scroll;
  }
  tbody{
    border: none;
    width: 100%;
    left: 0px;

  }
  /* Hide table headers (but not display: none;, for accessibility) */
  thead tr {
    position: absolute;
    top: -9999px;
    left: -9999px;
  }

  tr {
    margin: 0 0 1rem 0;
  }
  .ReactTable .rt-thead {
    overflow-y: scroll;
  }

  td {
    /* Behave  like a "row" */
    border: none;
    border-bottom: 1px solid #eee;
    position: relative;
    padding-left: 50%;
  }

  td:before {
    /* Now like a table header */
    position: absolute;
    /* Top/left values mimic padding */
    top: 0;
    left: 6px;
    width: 45%;
    padding-right: 10px;
    white-space: nowrap;
  }
  td:nth-of-type(1):before { content: "Select"; }
  td:nth-of-type(2):before { content: "Deploy ID"; }
  td:nth-of-type(3):before { content: "Requestor"; }
  td:nth-of-type(4):before { content: "Market"; }
  td:nth-of-type(5):before { content: "Env"; }
  td:nth-of-type(6):before { content: "Group"; }
  td:nth-of-type(7):before { content: "Deploy Date"; }
  td:nth-of-type(8):before { content: "Approver"; }
  td:nth-of-type(9):before { content: "Completed Date"; }
  td:nth-of-type(10):before { content: "CRQ"; }
  td:nth-of-type(11):before { content: "Job Status"; }
}
68bkxrlz

68bkxrlz1#

您需要使用布局挂钩(useBlockLayout、useAbsoluteLayout或useFlexLayout)才能应用指定的宽度。所有这些钩子都将默认列宽设置为150 px。
您可以在React Example: Column Sizing中看到react-table v8的示例,在全宽可调整大小的表中看到v7的示例。
如果不想使用布局钩子,可以根据需要使用getHeaderPropsgetCellProps,取minWidthwidth的值:

function Table({ data }) {
  const columns = useMemo(
    () => [
      {
        Header: 'Name',
        accessor: 'name',
        maxWidth: 400,
        minWidth: 140,
        width: 200,
      },
      {
        Header: 'Qty',
        accessor: 'quantity',
        maxWidth: 70,
        minWidth: 50,
        width: 60,
      },
    ],
    [],
  );

  const {
    getTableBodyProps,
    getTableProps,
    headerGroups,
    rows,
    prepareRow,
  } = useTable({ columns, data, getRowId });

  return (
    <table {...getTableProps()}>
      <thead>
        {headerGroups.map(headerGroup => (
          <tr {...headerGroup.getHeaderGroupProps()}>
            {headerGroup.headers.map(column => (
              <th
                {...column.getHeaderProps({
                  style: { minWidth: column.minWidth, width: column.width },
                })}
              >
                <span>{column.render('Header')}</span>
              </th>
            ))}
          </tr>
        ))}
      </thead>
      <tbody {...getTableBodyProps()}>
        {rows.map(row => {
          prepareRow(row);
          return (
            <tr {...row.getRowProps()}>
              {row.cells.map(cell => {
                return (
                  <td {...cell.getCellProps({
                      style: {
                        minWidth: cell.column.minWidth,
                        width: cell.column.width,
                      },
                    })>
                    {cell.render('Cell')}
                  </td>
                );
              })}
            </tr>
          );
        })}
      </tbody>
    </table>
  );
}
zbsbpyhn

zbsbpyhn2#

试试这个:你可以用同样的方式设计行、单元格、列的样式(这被称为prop getter模式)
在您的代码中:搜索...列。getHeaderProps()
将带有style的对象传递给column. getHeaderProps()&如果需要,您还可以添加更多的 prop 和样式:

...column.getHeaderProps({
                          style: {width: '200px'}
                         })

<th {...column.getHeaderProps()}
style= {{ ...column.getHeaderProps.style, ...getColumnStyle(column) }} >

在上面的代码中,**getColumnStyle(column)**是我的自定义函数,我在其中返回特定列的样式。
说明:这是一个无头UI库。意思是,它只提供逻辑和没有UI(建立自己的UI),我们可以样式表,我们想要的,这是所谓的 prop getter模式。你可以在这里阅读更多:https://kentcdodds.com/blog/how-to-give-rendering-control-to-users-with-prop-getters

qzwqbdag

qzwqbdag3#

默认宽度为150,在文档中给出。因为宽度是int属性,所以不要使用单引号。

columns: [
          {
            Header: "First Name",
            accessor: "firstName",
            width: 90
          },
          {
            Header: "Last Name",
            accessor: "lastName"
          }
        ]
brqmpdu1

brqmpdu14#

TanStack Table v8(此React Table v7的后续版本)中,要设置width,您可以在列定义中设置size,例如:

columnHelper.accessor('myCol', {
  size: 70,
  cell: (info) => info.getValue(),
  footer: (info) => info.column.id,
})

参考:www.example.comhttps://tanstack.com/table/v8/docs/api/features/column-sizing#size

相关问题