Меню выбора таблицы Marerial подключено к каждой строке?

#reactjs #material-ui #render #target #material-table

Вопрос:

В моей таблице материалов в качестве одного из столбцов есть меню выбора, однако, когда я выбираю один из параметров, он изменяет его для всех строк. Как я могу сделать строку изменения конкретной, чтобы они не были связаны друг с другом? Я понимаю, что подход event.target.value применяется ко всем отображенным меню выбора, я не могу понять, как сделать его специфичным для одного.

Рассматриваемая строка является столбцом объекта

 const selectData = ["One", "Two", "Three"];
function Table() {
  const columns = [
    {
      title: "Avatar",
      render: (rowData) => (
        <Avatar
          maxInitials={1}
          size={40}
          round={true}
          name={rowData === undefined ? " " : rowData.first_name}
        />
      ),
    },
    { title: "ID", field: "_id", hidden: true },
    { title: "Name", field: "name" },
    { title: "Email", field: "email" },
    { title: "Company", field: "companyID" },
    { title: "Role", field: "role" },
    {
      title: "Facility",
      render: (rowData) => (
        <FormControl>
          <InputLabel id="demo-mutiple-checkbox-label">Tags</InputLabel>
          <Select
            labelId="demo-mutiple-checkbox-label"
            id="demo-mutiple-checkbox"
            multiple
            value={items}
            onChange={handleChange}
            input={<Input />}
            renderValue={(selected) => selected.join(", ")}
            MenuProps={MenuProps}
          >
            {selectData.map((item) => (
              <MenuItem key={item} value={item}>
                <Checkbox checked={items.indexOf(item) > -1} />
                <ListItemText primary={item} />
              </MenuItem>
            ))}
          </Select>
        </FormControl>
      ),
    },
    { title: "Password", field: "password" },
  ];
  const [data, setData] = useState([]);

  const [items, setItems] = useState([]); //table data

  const handleChange = (event) => {
    setItems(event.target.value);
  };




return (
    <div>
      <MaterialTable
        title="Users"
        columns={columns}
        data={data}
        icons={tableIcons}
        editable={{
          onRowUpdate: (newData, oldData) =>
            new Promise((resolve) => {
              handleRowUpdate(newData, oldData, resolve);
            }),
          onRowAdd: (newData) =>
            new Promise((resolve) => {
              handleRowAdd(newData, resolve);
            }),
          onRowDelete: (oldData) =>
            new Promise((resolve) => {
              handleRowDelete(oldData, resolve);
            }),
        }}
      />
    </div>
  );
}
 

Изображение таблицы

Ответ №1:

Я думаю, что вы должны определить столбец editComponent в объекте, сделав это, вы сможете изменить значение текущей rowData , а не только items переменной, которая устанавливается как value в select компоненте и, следовательно, отображается в каждой строке.

Вот пример:

  const tableColumns = [
    { title: "Client", field: "id" },
    { title: "Name", field: "name" },

    {
      title: "Choose a Fruit",
      field: "fruit",
      editComponent: ({ value, onChange }) => (
        <select onChange={(e) => onChange(e.target.value)}>
          <option selected value={value}>
            {value}
          </option>
          {fruitsList.map(
            (item) =>
              item !== value amp;amp; (
                <option key={item} value={item}>
                  {item}
                </option>
              )
          )}
        </select>
      )
    }
  ];
 

Надеюсь, это сработает для вас! Полный код и песочница здесь.

Комментарии:

1. Спасибо! это работает для одного ввода, есть ли способ включить множественный выбор с помощью этого метода?

2. Есть возможность разрешить массовое издание , возможно, это может вам помочь, я еще не пробовал.