React Material-UI 表搜索

LEE*_*MIN 3 javascript reactjs

import React, { useState } from "react";\nimport { makeStyles } from "@material-ui/core/styles";\nimport Table from "@material-ui/core/Table";\nimport TableBody from "@material-ui/core/TableBody";\nimport TableCell from "@material-ui/core/TableCell";\nimport TableContainer from "@material-ui/core/TableContainer";\nimport TablePagination from "@material-ui/core/TablePagination";\nimport TableRow from "@material-ui/core/TableRow";\nimport Paper from "@material-ui/core/Paper";\nimport Checkbox from "@material-ui/core/Checkbox";\nimport FormControlLabel from "@material-ui/core/FormControlLabel";\nimport Switch from "@material-ui/core/Switch";\nimport { EnhancedTableToolbar } from "./EnhancedTableToolbars";\nimport EnhancedTableHead from "./EnhancedTableHeads";\n\nfunction descendingComparator(a, b, orderBy) {\n  if (b[orderBy] < a[orderBy]) {\n    return -1;\n  }\n  if (b[orderBy] > a[orderBy]) {\n    return 1;\n  }\n  return 0;\n}\n\nfunction getComparator(order, orderBy) {\n  return order === "desc"\n    ? (a, b) => descendingComparator(a, b, orderBy)\n    : (a, b) => -descendingComparator(a, b, orderBy);\n}\n\nfunction stableSort(array, comparator) {\n  const stabilizedThis = array.map((el, index) => [el, index]);\n  stabilizedThis.sort((a, b) => {\n    const order = comparator(a[0], b[0]);\n    if (order !== 0) return order;\n    return a[1] - b[1];\n  });\n  return stabilizedThis.map((el) => el[0]);\n}\n\nconst useStyles = makeStyles((theme) => ({\n  root: {\n    width: "100%",\n  },\n  paper: {\n    width: "100%",\n    marginBottom: theme.spacing(2),\n  },\n  table: {\n    minWidth: "200px",\n  },\n  visuallyHidden: {\n    border: 0,\n    clip: "rect(0 0 0 0)",\n    height: 1,\n    margin: -1,\n    overflow: "hidden",\n    padding: 0,\n    position: "absolute",\n    top: 20,\n    width: 1,\n  },\n}));\n\nexport default function EnhancedTable() {\n  const data = [\n    {\n      id: 1,\n      name: "Leesang",\n      age: "25",\n      Gender: "Genderder",\n    },\n    {\n      id: 2,\n      name: "chldms",\n      age: "27",\n      Gender: "Genderder",\n    },\n    {\n      id: 3,\n      name: "dlsmzl",\n      age: "11",\n      Gender: "Genderder",\n    },\n    {\n      id: 4,\n      name: "dlsmcl",\n      age: "35",\n      Gender: "Genderder",\n    },\n    {\n      id: 5,\n      name: "sdafldsm",\n      age: "25",\n      Gender: "Genderder",\n    },\n    {\n      id: 6,\n      name: "lsdmafas",\n      age: "27",\n      Gender: "Genderder",\n    },\n  ];\n  const [rows, setRows] = useState(data);\n\n  const classes = useStyles();\n  const [order, setOrder] = React.useState("asc");\n  const [orderBy, setOrderBy] = React.useState("Age");\n  const [selected, setSelected] = React.useState([]);\n  const [page, setPage] = React.useState(0);\n  const [dense, setDense] = React.useState(false);\n  const [rowsPerPage, setRowsPerPage] = React.useState(5);\n  console.log(selected);\n  const handleRequestSort = (event, property) => {\n    const isAsc = orderBy === property && order === "asc";\n    setOrder(isAsc ? "desc" : "asc");\n    setOrderBy(property);\n  };\n\n  const handleSelectAllClick = (event) => {\n    if (event.target.checked) {\n      const newSelecteds = rows.map((n) => n.id);\n      setSelected(newSelecteds);\n      return;\n    }\n    setSelected([]);\n  };\n\n  const handleClick = (event, id) => {\n    const selectedIndex = selected.indexOf(id);\n    let newSelected = [];\n\n    if (selectedIndex === -1) {\n      newSelected = newSelected.concat(selected, id);\n    } else if (selectedIndex === 0) {\n      newSelected = newSelected.concat(selected.slice(1));\n    } else if (selectedIndex === selected.length - 1) {\n      newSelected = newSelected.concat(selected.slice(0, -1));\n    } else if (selectedIndex > 0) {\n      newSelected = newSelected.concat(\n        selected.slice(0, selectedIndex),\n        selected.slice(selectedIndex + 1)\n      );\n    }\n\n    setSelected(newSelected);\n  };\n\n  const handleChangePage = (event, newPage) => {\n    setPage(newPage);\n  };\n\n  const handleChangeRowsPerPage = (event) => {\n    setRowsPerPage(parseInt(event.target.value, 10));\n    setPage(0);\n  };\n\n  const handleChangeDense = (event) => {\n    setDense(event.target.checked);\n  };\n\n  const isSelected = (name) => selected.indexOf(name) !== -1;\n\n  const emptyRows =\n    rowsPerPage - Math.min(rowsPerPage, rows.length - page * rowsPerPage);\n\n  return (\n    <div className={classes.root}>\n      <Paper className={classes.paper}>\n        <EnhancedTableToolbar\n          rows={rows}\n          setRows={setRows}\n          selected={selected}\n          numSelected={selected.length}\n        />\n        <TableContainer>\n          <Table\n            className={classes.table}\n            aria-labelledby="tableTitle"\n            size={dense ? "small" : "medium"}\n            aria-label="enhanced table"\n          >\n            <EnhancedTableHead\n              classes={classes}\n              numSelected={selected.length}\n              order={order}\n              orderBy={orderBy}\n              onSelectAllClick={handleSelectAllClick}\n              onRequestSort={handleRequestSort}\n              rowCount={rows.length}\n            />\n            <TableBody>\n              {stableSort(rows, getComparator(order, orderBy))\n                .slice(page * rowsPerPage, page * rowsPerPage + rowsPerPage)\n                .map((row, index) => {\n                  const isItemSelected = isSelected(row.id);\n                  const labelId = `enhanced-table-checkbox-${index}`;\n\n                  return (\n                    <TableRow\n                      hover\n                      onClick={(event) => handleClick(event, row.id)}\n                      role="checkbox"\n                      aria-checked={isItemSelected}\n                      tabIndex={-1}\n                      key={row.id}\n                      selected={isItemSelected}\n                    >\n                      <TableCell padding="checkbox">\n                        <Checkbox\n                          checked={isItemSelected}\n                          inputProps={{ "aria-labelledby": labelId }}\n                        />\n                      </TableCell>\n                      <TableCell\n                        component="th"\n                        id={labelId}\n                        scope="row"\n                        padding="none"\n                      >\n                        {row.name}\n                      </TableCell>\n                      <TableCell align="right">{row.age}</TableCell>\n                      <TableCell align="right">{row.Gender}</TableCell>\n                    </TableRow>\n                  );\n                })}\n              {emptyRows > 0 && (\n                <TableRow style={{ height: (dense ? 33 : 53) * emptyRows }}>\n                  <TableCell colSpan={6} />\n                </TableRow>\n              )}\n            </TableBody>\n          </Table>\n        </TableContainer>\n        <TablePagination\n          rowsPerPageOptions={[5, 10, 25]}\n          component="div"\n          count={rows.length}\n          rowsPerPage={rowsPerPage}\n          page={page}\n          onChangePage={handleChangePage}\n          onChangeRowsPerPage={handleChangeRowsPerPage}\n        />\n      </Paper>\n      <FormControlLabel\n        control={<Switch checked={dense} onChange={handleChangeDense} />}\n        label="Dense padding"\n      />\n    </div>\n  );\n}\n\n//////////////////////////////////////////////////////////////////////////////////////////////////\nimport React from "react";\nimport PropTypes from "prop-types";\nimport TableHead from "@material-ui/core/TableHead";\nimport TableSortLabel from "@material-ui/core/TableSortLabel";\nimport TableCell from "@material-ui/core/TableCell";\nimport TableRow from "@material-ui/core/TableRow";\nimport Checkbox from "@material-ui/core/Checkbox";\nconst headCells = [\n  {\n    id: "name",\n    numeric: false,\n    disablePadding: true,\n    label: "Dessert\xc2\xa0(100g serving)",\n  },\n  { id: "age", numeric: true, disablePadding: false, label: "age" },\n  { id: "Gender", numeric: true, disablePadding: false, label: "Gender" },\n];\n\nfunction EnhancedTableHead(props) {\n  const {\n    classes,\n    onSelectAllClick,\n    order,\n    orderBy,\n    numSelected,\n    rowCount,\n    onRequestSort,\n  } = props;\n  const createSortHandler = (property) => (event) => {\n    onRequestSort(event, property);\n  };\n\n  return (\n    <TableHead>\n      <TableRow>\n        <TableCell padding="checkbox">\n          <Checkbox\n            indeterminate={numSelected > 0 && numSelected < rowCount}\n            checked={rowCount > 0 && numSelected === rowCount}\n            onChange={onSelectAllClick}\n            inputProps={{ "aria-label": "select all desserts" }}\n          />\n        </TableCell>\n        {headCells.map((headCell) => (\n          <TableCell\n            key={headCell.id}\n            align={headCell.numeric ? "right" : "left"}\n            padding={headCell.disablePadding ? "none" : "default"}\n            sortDirection={orderBy === headCell.id ? order : false}\n          >\n            <TableSortLabel\n              active={orderBy === headCell.id}\n              direction={orderBy === headCell.id ? order : "asc"}\n              onClick={createSortHandler(headCell.id)}\n            >\n              {headCell.label}\n              {orderBy === headCell.id ? (\n                <span className={classes.visuallyHidden}>\n                  {order === "desc" ? "sorted descending" : "sorted ascending"}\n                </span>\n              ) : null}\n            </TableSortLabel>\n          </TableCell>\n        ))}\n      </TableRow>\n    </TableHead>\n  );\n}\n\nEnhancedTableHead.propTypes = {\n  classes: PropTypes.object.isRequired,\n  numSelected: PropTypes.number.isRequired,\n  onRequestSort: PropTypes.func.isRequired,\n  onSelectAllClick: PropTypes.func.isRequired,\n  order: PropTypes.oneOf(["asc", "desc"]).isRequired,\n  orderBy: PropTypes.string.isRequired,\n  rowCount: PropTypes.number.isRequired,\n};\nexport default EnhancedTableHead;\n\n//////////////////////////////////////////////////////////////////////////////////////////\nimport React, { useEffect, useState } from "react";\nimport PropTypes from "prop-types";\nimport clsx from "clsx";\nimport Toolbar from "@material-ui/core/Toolbar";\nimport Typography from "@material-ui/core/Typography";\nimport IconButton from "@material-ui/core/IconButton";\nimport Tooltip from "@material-ui/core/Tooltip";\nimport DeleteIcon from "@material-ui/icons/Delete";\nimport FilterListIcon from "@material-ui/icons/FilterList";\nimport { lighten, makeStyles } from "@material-ui/core";\nimport { makeStyles as inputMakeStyled } from "@material-ui/core/styles";\nimport TextField from "@material-ui/core/TextField";\nconst useToolbarStyles = makeStyles((theme) => ({\n  root: {\n    paddingLeft: theme.spacing(2),\n    paddingRight: theme.spacing(1),\n  },\n  highlight:\n    theme.palette.type === "light"\n      ? {\n          color: theme.palette.secondary.main,\n          backgroundColor: lighten(theme.palette.secondary.light, 0.85),\n        }\n      : {\n          color: theme.palette.text.primary,\n          backgroundColor: theme.palette.secondary.dark,\n        },\n  title: {\n    flex: "1 1 100%",\n  },\n}));\nconst useStyles = inputMakeStyled((theme) => ({\n  root: {\n    "& > *": {\n      margin: theme.spacing(1),\n      width: "25ch",\n    },\n  },\n}));\nexport const EnhancedTableToolbar = (props) => {\n  const classes = useToolbarStyles();\n  const inputClasses = useStyles();\n  const { numSelected, selected, setRows, rows } = props;\n  const [selecNum, setSelecNum] = useState(numSelected);\n  useEffect(() => {\n    setSelecNum(numSelected);\n  }, [numSelected]);\n  const onRemove = () => {\n    const reMoveRow = rows.filter((row) => !selected.includes(row.id));\n\n    setRows(reMoveRow);\n    setSelecNum(0);\n  };\n  return (\n    <Toolbar\n      className={clsx(classes.root, {\n        [classes.highlight]: selecNum > 0,\n      })}\n    >\n      {selecNum > 0 ? (\n        <Typography\n          className={classes.title}\n          color="inherit"\n          variant="subtitle1"\n          component="div"\n        >\n          {selecNum} selected\n        </Typography>\n      ) : (\n        <Typography\n          className={classes.title}\n          variant="h6"\n          id="tableTitle"\n          component="div"\n        >\n          Nutrition\n        </Typography>\n      )}\n      <form className={inputClasses.root} noValidate autoComplete="off">\n        <TextField id="outlined-basic" label="Search" variant="outlined" />\n      </form>\n      {selecNum > 0 ? (\n        <Tooltip title="Delete">\n          <IconButton onClick={onRemove} aria-label="delete">\n            <DeleteIcon />\n          </IconButton>\n        </Tooltip>\n      ) : (\n        <Tooltip title="Filter list">\n          <IconButton aria-label="filter list">\n            <FilterListIcon />\n          </IconButton>\n        </Tooltip>\n      )}\n    </Toolbar>\n  );\n};\n\nEnhancedTableToolbar.propTypes = {\n  numSelected: PropTypes.number.isRequired,\n};\n
Run Code Online (Sandbox Code Playgroud)\n

...................................................... ...................................................... ...................................................... ...................................................... ..

\n

上面的代码分为三个部分。

\n

我想使用material-ui表实现表搜索功能。如何实现在表中搜索数据的功能?Material-ui中有没有带搜索功能的API?我找不到它。我需要你的帮助。

\n

...................................................... ...................................................... ...................................................... ...................................................... ..

\n

Shi*_*tta 6

如果您可以使用另一个包作为material-ui表,请看一下:material-ui-datatables