Как сделать таблицу дизайна Ant адаптивной

#css #reactjs #antd

#css #reactjs #antd

Вопрос:

Я хочу создать таблицу, похожую на таблицу входящих сообщений gmail, в которой столбцы таблицы отображаются в виде строк на маленьких экранах. Я использую компонент таблицы Ant Design, но не могу найти, как сделать его адаптивным в документации.

Чего я хочу на больших экранах:

От Для
aaa@example.com zzz.zzz@example.com
ccc@example.com yyy.yyy@example.com

Что я хочу на маленьких экранах:

От до
aaa@example.com
zzz.zzz@example.com
ccc@example.com
yyy.yyy@example.com

Это мой код react, в котором я создал таблицу с использованием Ant Design:

 import "./App.css";
import { Table } from "antd";

function App() {
  const columns = [
    {
      title: "From",
      dataIndex: "from",
      sorter: (a, b) => a.from.length - b.from.length,
      sortDirections: ["descend", "ascend"],
    },
    {
      title: "To",
      dataIndex: "to",
      sorter: (a, b) => a.to - b.to,
      sortDirections: ["descend", "ascend"],
    },
    {
      title: "Subject",
      dataIndex: "subject",
      sorter: (a, b) => a.subject.length - b.subject.length,
      sortDirections: ["descend", "ascend"],
    },
    {
      title: "Date",
      dataIndex: "date",
      sorter: (a, b) => a.date.length - b.date.length,
      sortDirections: ["descend", "ascend"],
    },
  ];

  const data = [
    {
      key: "1",
      from: "aaa@example.com",
      to: "zzz.zzz@example.com",
      subject: "[ HR-888 ] Notice of official announcement",
      date: "0:20",
    },
    {
      key: "2",
      from: "bbb.bbbb@example.com",
      to: "yyy.yyy@example.com",
      subject: `[web:333] "Web Contact"`,
      date: "0:20",
    }
  ];
  return (
    <div className="App">
      <Table columns={columns} dataSource={data} pagination={false} />
    </div>
  );
}

export default App;
 

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

1. Вы взглянули на это ?

2. Да, но этот пример скроет столбец

3. Пожалуйста, посмотрите мою демонстрацию

4. Да, это правильный ответ, пожалуйста, укажите его в ответе, чтобы я мог его принять.

Ответ №1:

Вы можете использовать responsive свойство столбца, которым вы хотите управлять для размеров экрана. Просто добавьте From To столбец с пользовательской функцией рендеринга и установите responsive свойство для этого столбца, чтобы оно отображалось только на xs экранах. From To Для столбцов and будет установлено свойство responsive для отображения на md и выше.

В этом подходе есть предостережение. Это работает, если вы хотите From To показывать на xs экранах, но если вы хотите From To показывать на sm экранах или меньших размеров, установка свойства responsive на ["sm"] будет нарушена. Это связано с тем, как AntDesign реализовал свои определения точек останова. Обратите внимание, что их xs определение (max-width: 575px) . Это единственная точка останова со max-width свойством. Другие точки останова используют min-width свойства. Поэтому установка адаптивного свойства на ["sm"] означает, что столбец будет отображаться на sm экранах большего размера.

ДЕМОНСТРАЦИЯ

 const columns = [
  {
    title: "From To",
    render: (record) => (
      <React.Fragment>
        {record.from}
        <br />
        {record.to}
      </React.Fragment>
    ),
    responsive: ["xs"]
  },
  {
    title: "From",
    dataIndex: "from",
    sorter: (a, b) => a.from.length - b.from.length,
    sortDirections: ["descend", "ascend"],
    responsive: ["sm"]
  },
  {
    title: "To",
    dataIndex: "to",
    sorter: (a, b) => a.to - b.to,
    sortDirections: ["descend", "ascend"],
    responsive: ["sm"]
  },
  {
    title: "Subject",
    dataIndex: "subject",
    sorter: (a, b) => a.subject.length - b.subject.length,
    sortDirections: ["descend", "ascend"]
  },
  {
    title: "Date",
    dataIndex: "date",
    sorter: (a, b) => a.date.length - b.date.length,
    sortDirections: ["descend", "ascend"]
  }
];
 

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

1. вопрос только в том, почему этого нет в официальной документации)

2. У меня такая же проблема с ant design vue в отношении адаптивной таблицы, она должна быть такой же, но это не сработало codesandbox.io/s /…

3. @Fahmi Я не эксперт по Vue, но, основываясь на документах 3.0 API, это должно сработать. Вы можете сообщить об этом как об ошибке разработчикам и попросить их взглянуть на нее.

4. @Scratch-N’Purr Я уже открываю обсуждения по репозиторию github.com/vueComponent/ant-design-vue/discussions/5122 но ответа пока не было. Возможно, я открою проблему, но пока не получил ответа от автора.

Ответ №2:

Другой подход не очень хорош, но, тем не менее, вы можете отобразить стопку или карточку, содержащую ваши столбцы данных.

 const isWebDevice = useMediaQuery('(min-width:700px)');
const deviceColumns = [
    {
      title: "Student Data",
      render: (record, key, index) => {
         const from = record.from;
         const to = record.to;
         const subject = record.subject;
         const date = record.date;
         return (
             <div>
                  <span>
                        <h4>From</h4>
                        <h4>{from}</h4>
                  </span>
                  <span>
                        <h4>To</h4>
                        <h4>{to}</h4>
                  </span>
                  <span>
                        <h4>Subject</h4>
                        <h4>{subject}</h4>
                  </span>
                  <span>
                        <h4>Date</h4>
                        <h4>{date}</h4>
                  </span>
             </div>
         )
      }
  ];

<Table 
    columns={isWebDevice ? columns : deviceColumns}
    dataSource={data} 
    pagination={false} 
/>
 

как и выше, вы можете применять классы <span> и отображать их соответствующим образом, используя CSS в соответствии с устройствами.