reactjs - 将 Material-ui 下拉列表绑定(bind)到表格

标签 reactjs material-ui

如何将 React Material-ui 下拉列表绑定(bind)到表格?我有一个包含国家/地区的下拉菜单,以及一个包含国家/地区和首都的表格。根据所选国家/地区,表格应仅显示该国家/地区和首都。 下面是我的代码。 第一个问题是,下拉列表值未正确更新。第二个问题是,当下拉列表值更改时,表格不会更新。

import React from "react";
import logo from "./logo.svg";
import "./App.css";

import { makeStyles } from "@material-ui/core/styles";
import Button from "@material-ui/core/Button";

import MenuItem from "@material-ui/core/MenuItem";
import Select from "@material-ui/core/Select";

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";

const useStyles = makeStyles(theme => ({
  button: {
    margin: theme.spacing(1)
  },
  input: {
    display: "none"
  }
}));

function App() {
  const classes = useStyles();
  const [values, setValues] = React.useState({
    country: "",
    rows: [
      createData("US", "DC"),
      createData("UK", "London"),
      createData("Aus", "Canberra")
    ]
  });

  function handleChange(event) {
    setValues(oldValues => ({
      ...oldValues,
      [event.target.name]: event.target.value
    }));
  }

  function createData(country, capital) {
    return { country, capital };
  }
  var rows = [
    createData("US", "DC"),
    createData("UK", "London"),
    createData("Aus", "Canberra")
  ];

  return (
    <div className="App">
      <label value="Select Country: ">Select Country: </label>
      <Select
        style={{ width: "10%" }}
        value={values.country}
        onChange={handleChange}
        name="country"
        displayEmpty
        className={classes.selectEmpty}>
        <MenuItem value="">Country</MenuItem>
        <MenuItem>US</MenuItem>
        <MenuItem>UK</MenuItem>
        <MenuItem>Aus</MenuItem>
      </Select>

      <Table className={classes.table}>
        <TableHead>
          <TableRow>
            <TableCell align="center">Country</TableCell>
            <TableCell align="center">Capital city</TableCell>
          </TableRow>
        </TableHead>
        <TableBody>
          {values.rows.map(row => (
            <TableRow key={row.name}>
              <TableCell align="center">{row.country}</TableCell>
              <TableCell align="center">{row.capital}</TableCell>
            </TableRow>
          ))}
        </TableBody>
      </Table>
    </div>
  );
}

export default App;

最佳答案

您需要进行一些小的更改...

  • MenuItem 添加 value 属性
  • 添加使用所选 MenuItem 值进行过滤的功能
  • (这是个人偏好)但我发现将状态分离到自己的对象中更容易 - 我相信 React 也可能推荐这,但必须查看文档...

现场演示:
Edit https://stackoverflow.com/questions/57938654/binding-material-ui-dropdown-to-table

代码:

let API_DATA = [
  { country: "US", capital: "DC" },
  { country: "UK", capital: "London" },
  { country: "Aus", capital: "Canberra" }
];

function App() {
  const classes = useStyles();
  const [tableData, setTableData] = React.useState(API_DATA);
  const [selected, setSelected] = React.useState("");

  function handleChange(event) {
    setSelected(event.target.value);
    let _vals = event.target.value
      ? API_DATA.filter(r => r.country === event.target.value)
      : API_DATA;
    setTableData(_vals);
  }

  return (
    <div className="App">
      <label value="Select Country: ">Select Country: </label>
      <Select
        style={{ width: "30%" }}
        value={selected}
        onChange={handleChange}
        name="country"
        displayEmpty
        className={classes.selectEmpty}
      >
        <MenuItem value="">All Countries</MenuItem>
        <MenuItem value="US">US</MenuItem>
        <MenuItem value="UK">UK</MenuItem>
        <MenuItem value="Aus">Aus</MenuItem>
      </Select>

      <Table className={classes.table}>
        <TableHead>
          <TableRow>
            <TableCell align="center">Country</TableCell>
            <TableCell align="center">Capital city</TableCell>
          </TableRow>
        </TableHead>
        <TableBody>
          {tableData.map(row => (
            <TableRow key={row.name}>
              <TableCell align="center">{row.country}</TableCell>
              <TableCell align="center">{row.capital}</TableCell>
            </TableRow>
          ))}
        </TableBody>
      </Table>
    </div>
  );
}

关于reactjs - 将 Material-ui 下拉列表绑定(bind)到表格,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57938654/

相关文章:

javascript - 如何在将按钮(Material UI)动态设置为禁用后更改其颜色?

javascript - 将选项作为对象数组进行多项选择

javascript - 如何使用 enzyme 区分这两种元素?

javascript - 根据用户交互或按钮单击将子 react 组件替换为另一个组件

javascript - ES6 数组映射不返回任何内容 : ReactJS

javascript - 为什么我使用 jest-dom 时会报错 "TypeError: expect(...).not.toBeVisible is not a function"

javascript - 更新到 Chrome v65 并开始收到此错误 : Expected onClick listener to be a function, 而不是收到类型字符串

javascript - 如何使用文本字段名称和值访问动态数组中的正确对象?

typescript - MUI v5 类型在 WebStorm 中没有代码完成建议

performance - React - 解构时的 defaultProps 与 ES6 默认参数(性能问题)