当前位置: 首页 > 知识库问答 >
问题:

带有复选框的过滤器表,带有反应和材料界面

江华容
2023-03-14

我正在使用React&Material-UI为一个项目中的数据表构建一个带有复选框的筛选选项。我不确定哪种方法是实现这一点的最佳方法。

>

  • 是否有使用Material-UI的自定义解决方案?

    如果不是,有什么方法来实现这一点?我是一个新手,所以我很难把所有的碎片放在一起。

    这是我得到的东西:

    复选框组件:

    import "./FilterCheckboxes.css";
    
    import Checkbox from "@material-ui/core/Checkbox";
    import FormControlLabel from "@material-ui/core/FormControlLabel";
    import FormGroup from "@material-ui/core/FormGroup";
    import { createMuiTheme, MuiThemeProvider } from "@material-ui/core/styles";
    
    import React from "react";
    
    import { rows } from "../../store.js";
    
    // Theme Palette Colors
    const theme = createMuiTheme({
      palette: {
        primary: { main: "rgb(38, 118, 198)" }
      },
      typography: { useNextVariants: true }
    });
    
    class FilterCheckboxes extends React.Component {
      state = {
        checkedA: true,
        checkedB: true,
        checkedC: false,
        checkedD: false,
        checkedE: false,
        checkedF: false
      };
    
      // function to set checkboxes to checked/unchecked
      handleChange = name => event => {
        this.setState({ [name]: event.target.checked });
      };
    
      render() {
        return (
          <MuiThemeProvider theme={theme}>
            <FormGroup>
              <div className="filter__checkboxes">
                <div className="filter__checkboxes-column">
                  <div className="checkboxes">
                    <FormControlLabel
                      control={
                        <Checkbox
                          checked={this.state.checkedA}
                          color="primary"
                          onChange={this.handleChange("checkedA")}
                          value="checkedA"
                        />
                      }
                      label="Submitted"
                    />
                  </div>
                  <div className="checkboxes">
                    <FormControlLabel
                      control={
                        <Checkbox
                          checked={this.state.checkedB}
                          color="primary"
                          onChange={this.handleChange("checkedB")}
                          value="checkedB"
                        />
                      }
                      label="Invited"
                    />
                  </div>
                </div>
                <div className="filter__checkboxes-column">
                  <div className="checkboxes">
                    <FormControlLabel
                      control={
                        <Checkbox
                          checked={this.state.checkedC}
                          color="primary"
                          onChange={this.handleChange("checkedC")}
                          value="checkedC"
                        />
                      }
                      label="Not Submitted"
                    />
                  </div>
                  <div className="checkboxes">
                    <FormControlLabel
                      control={
                        <Checkbox
                          checked={this.state.checkedD}
                          color="primary"
                          onChange={this.handleChange("checkedD")}
                          value="checkedD"
                        />
                      }
                      label="Draft"
                    />
                  </div>
                </div>
                <div className="filter__checkboxes-column">
                  <div className="checkboxes">
                    <FormControlLabel
                      control={
                        <Checkbox
                          checked={this.state.checkedE}
                          color="primary"
                          onChange={this.handleChange("checkedE")}
                          value="checkedE"
                        />
                      }
                      label="Information Request"
                    />
                  </div>
                  <div className="checkboxes">
                    <FormControlLabel
                      control={
                        <Checkbox
                          color="primary"
                          checked={this.state.checkedF}
                          onChange={this.handleChange("checkedF")}
                          value="checkedF"
                        />
                      }
                      label="Loan Application"
                    />
                  </div>
                </div>
              </div>
            </FormGroup>
          </MuiThemeProvider>
        );
      }
    }
    
    export default FilterCheckboxes;
    

    表组件:

    import React from "react";
    import { makeStyles } from "@material-ui/core/styles";
    import Table from "@material-ui/core/Table";
    import TableBody from "@material-ui/core/TableBody";
    import TableCell from "@material-ui/core/TableCell";
    import TableHead from "@material-ui/core/TableHead";
    import TableRow from "@material-ui/core/TableRow";
    import Paper from "@material-ui/core/Paper";
    
    import { rows } from "../../store.js";
    
    const useStyles = makeStyles(theme => ({
      root: {
        width: "100%",
        marginTop: theme.spacing(3),
        overflowX: "auto"
      },
      table: {
        minWidth: 650
      }
    }));
    
    export default function SimpleTable() {
      const classes = useStyles();
    
      return (
        <Paper className={classes.root}>
          <Table className={classes.table}>
            <TableHead>
              <TableRow>
                <TableCell>Name</TableCell>
                <TableCell align="left">Status</TableCell>
                <TableCell align="left">First Submitted</TableCell>
                <TableCell align="left">Last Activity</TableCell>
                <TableCell align="left">Score</TableCell>
                <TableCell align="left">Actions</TableCell>
              </TableRow>
            </TableHead>
            <TableBody>
              {rows.map(row => (
                <TableRow key={row.name}>
                  <TableCell align="left">{row.name}</TableCell>
                  <TableCell align="left">{row.status}</TableCell>
                  <TableCell align="left">{row.firstSubmitted}</TableCell>
                  <TableCell align="left">{row.lastActivity}</TableCell>
                  <TableCell align="left">{row.score}</TableCell>
                  <TableCell align="left">{row.actions}</TableCell>
                </TableRow>
              ))}
            </TableBody>
          </Table>
        </Paper>
      );
    }
    

    您可以在这里找到一个代码示例。

    任何帮助在哪种方式构建这个功能将是真正的感激!

  • 共有1个答案

    王凯旋
    2023-03-14

    一个解决方案可以是将筛选器状态向上移动。这意味着您将filtercheckboxs::onchange替换为适当的onfilterchange。我将filtercheckboxs实现为一个功能组件,因为它没有很多功能。

    import React, {Component} from 'react';
    
    const FilterCheckboxes = ({onFilterChanged, checkedA, checkedB, /* ... and so forth or as separate object */}) => {
     return (
          <MuiThemeProvider theme={theme}>
            <FormGroup>
              <div className="filter__checkboxes">
                <div className="filter__checkboxes-column">
                  <div className="checkboxes">
                    <FormControlLabel
                      control={
                        <Checkbox
                          checked={checkedA}
                          color="primary"
                          onChange={onFilterChanged("checkedA")}
                          value="checkedA"
                        />
                      }
                      label="Submitted"
                    />
                  </div>
    
                {/* your other checkboxes */}
                </div>
              </div>
            </FormGroup>
          </MuiThemeProvider>
        );
    }
    
    

    您的simpletable几乎保持不变。唯一的变化是它得到了行作为道具:

    
    export default function SimpleTable({rows}) {
        // your code stays the same except the import of 'store.js'
    }
    

    现在是包装它的组件。它具有filters状态和您的行数据。合并这两个以筛选表:

    
    
    const FilterTable = () => {
        const [filters, setFilters] = React.useState({});
    
        const filteredRows = rows.filter((row) => {
            const filterArray = Object.keys(filters);
    
            return filterArray.every((filterKey) => {
                return row[filterKey] == filters[filterKey];
            });
        });
    
        return <SimpleTable rows={filteredRows} />
    }
    
    
    
    
    
    
     类似资料:
    • 我一直在研究这个问题,但我找不到一个带有复选框的get drawable的解决方案。我试图做的是,当你点击这个特定的复选框时,它会过滤相应颜色的复选框。顺便说一下,这是一个片段。所以,我有可以是红色、黄色或绿色的复选框。如果用户点击它们,它会改变颜色。例如,我有一个黄色的复选框,它是chkProgress,当它被单击时,我想找到所有黄色的复选框,并筛选黄色的复选框。所以,我有可绘制的ID,我需要得

    • 问题内容: 我需要将复选框添加到JTree。自定义TreeCellRenderer / TreeCellEditor似乎是正确的方法。到目前为止,我在此网页中使用了CheckBoxNodeRenderer方法。除了两件事,它可以正常工作: 复选框上方+下方有额外的空格;我想使其与常规JTree相同。 我想区分单击复选框本身(应尝试切换复选框)和单击与复选框相关联的文本(应允许事件侦听器将此解释为单

    • 问题内容: 是否可以将复选框代替“链接名称”? 如果是这样怎么办? 谢谢, 问题答案: 是的,当然有可能。您可以使用标准复选框: 然后在单独的javascript文件中使用jQuery订阅此复选框的change事件,并毫不客气地对其进行AJAXify:

    • 问题内容: 我有两行复选框。当用户单击任何单个复选框(在特定行中)时,我想在PHP的总和中添加一个数字。如果他取消选择单个复选框,那么我想实时地从总数中减去而不刷新页面。 我的问题是我的AJAX调用的数据字段中有什么内容? 这是正确的方法吗? HTML JQUERY PHP 问题答案: 尝试:

    • 问题内容: 我正在尝试建立一个查询,该查询将找到所有用户文档(docType =用户),然后根据许多过滤器对其进行过滤。例如位置,性别,年龄等。过滤器是根据我正在构建的搜索功能上的用户输入来添加/删除的。 以下没有结果: 以下返回结果: 后者虽然返回结果,但从长远来看是行不通的,因为我可能想为年龄,性别等添加一个额外的过滤器,而且我似乎无法添加多个字段。如果我删除位置过滤器,则第一个查询有效。 问