Как установить индивидуальный стиль для antd Select? - PullRequest
4 голосов
/ 21 октября 2019

Я хочу настроить antd Select. Когда пользователь нажимает Select, antd Option должен отображаться поверх antd Select вместо отображения под Select

antd Select: https://ant.design/components/select/

Ожидаемое поведение: I want this 1

Фактическое поведение: I don't want this 2

JSX

import { FaPlane, FaWater } from "react-icons/fa";

//outside of class
const shipmentType = {
  sea: [
    { name: "FCL", desc: "FULL CONTAINER LOAD" },
    { name: "LCL", desc: "LESS CONTAINER LOAD" }
  ],
  air: [{ name: "AIR", desc: "AIR DELIVERY" }]
};


//inside of class

render(){
       return(
              <Select
              className="container-dropdown"
              onChange={this.onSelectChange}
              defaultValue={
                  <DisplayContainer data={shipmentType.sea[0]} />
              }
              key={ shipmentType.sea[0]}
            >
              <Option value={shipmentType.sea[0].name}>
                <DisplayContainer data={shipmentType.sea[0]} />
              </Option>
              <Option value={shipmentType.sea[1].name}>
                <DisplayContainer data={shipmentType.sea[1]} />
              </Option>
            </Select>
          );
}

Компонент DisplayContainer.js

const DisplayContainer = ({ data }) => {
  return (
    <div
      style={{
        width: "120px",
        height: "45px",
        display: "flex",
        flexFlow: "column",
        justifyContent: "center",
        alignItems: "center"
      }}
    >
      <span
        style={{
          display: "block",
          fontSize: "8px",
          padding: "5px 0px 0px 10px"
        }}
      >
        {data.desc}
      </span>

      <span style={{ padding: "2px 0px 0px 14px" }}>
        {data.name === "AIR" ? <FaPlane /> : <FaWater />}
        <span
          style={{ display: "inline", marginLeft: "14px", fontSize: "16px" }}
        >
          {data.name}
        </span>
      </span>
    </div>
  );
};

App.css

.container-dropdown {
    height: 53px;
    width: 140px;
    border: 0px solid white;
    border-radius: 0px;
    cursor: pointer;
    font-size: 18px;
    margin: 0px;
    padding: 0px;
}

custom-antd.css

.ant-select-selection.ant-select-selection--single {
    border-radius: 0px 8px 8px 0px;
    height: 53px;
}

.ant-select-selection-selected-value {
    height: 53px;
    padding: 0px;
    margin: 0px;
}

.ant-select-selection__rendered {
    padding: 0px;
    margin: 0px;
}

.ant-select-dropdown-menu.ant-select-dropdown-menu-root.ant-select-dropdown-menu-vertical {
    padding: 0px;
    margin: 0px;
}

.ant-select-dropdown-menu-item {
    padding: 0px;
    margin: 0px;
}

Как мне этого добиться? Я уже провел часы времени. но я не смог добиться успеха. Я буду признателен вам. спасибо

Редактировать 01:

Когда пользователь нажимает на поле Select

Я хочу верх Option (то есть FCL) поднимается и закрывает поле Select следующим образом:

I want this

Я не хочу, чтобы оба Options (то есть FCL иLCL) будет отображаться в поле Select:

I don't want this

1 Ответ

2 голосов
/ 21 октября 2019

Мне кажется, я смог довольно близко приблизиться к тому, чего вы хотите достичь. Ниже приведен обновленный файл custom-antd.css .

.ant-select-selection-selected-value {
  border-radius: 0px 8px 8px 0px;
  height: 53px;
}

.ant-select-selection.ant-select-selection--single {
  height: 53px;
}

.ant-select-selection.ant-select-selection--single
  > div
  > div
  > div
  > div
  + div {
  margin-top: -5px;
  padding: 4px 5px 5px 14px !important;
}

.ant-select-selection.ant-select-selection--single > div > div > div > div {
  margin-top: -20px;
}

.ant-select-selection.ant-select-selection--single[aria-expanded="true"]
  > div
  > div
  > div
  > div {
    margin-top: -10px;
}

 /*style for when the menu is expanded: show shipment description above icon and name*/ 
.ant-select-selection.ant-select-selection--single[aria-expanded="true"]
    > div
    > div
    > div
    > div
    + div {
       margin-top: -15px;
}

Полный код изолированной программной среды можно найти здесь .

По сути то, что вывы хотите использовать комбинаторы для выбора конкретных div для имени, описания и т. д., которые муравьиные дизайны вкладывают довольно глубоко в свою структуру.

РЕДАКТИРОВАТЬ

Чтобы в раскрывающемся меню отображались различные данные в зависимости от того, что выбрано в настоящее время (показывать LCL только при выборе FCL, и наоборот), вы можете использовать функцию handleChange, которая фильтрует исходные данные отгрузки, чтобы она возвращала все, чтов настоящее время не выбран (т.е. показывает LCL без FCL, когда выбран FCL). Сохраняя исходные данные отгрузки в состоянии вместе со вторым массивом (отфильтрованные данные меню), вы можете использовать / обновить второй массив для ваших вариантов выбора.

Вот ваше состояние.

  this.state = {
     shipmentArr: [],
     shipmentType: {
        sea: [
          { name: "FCL", desc: "FULL CONTAINER LOAD" },
          { name: "LCL", desc: "LESS CONTAINER LOAD" }
        ],
        air: [{ name: "AIR", desc: "AIR DELIVERY" }]
     }
  };

Вот новое handleChange.

handleChange = value => {
   var newShipmentType = this.state.shipmentType.sea.filter(x => {
     return x.name !== value;
   });
   this.setState({
     shipmentArr: newShipmentType
   });
};

Вот componentDidMount (используется handleChange).

componentDidMount = () => {
    this.handleChange(this.state.shipmentType.sea[0].name);
};

Ниже приведен обновленный компонент Select.

<Select
    className="container-dropdown"
    onChange={this.handleChange}
    open={true} // USE THIS FOR DEBUGGING.
    defaultValue={
      <DisplayContainer data={this.state.shipmentType.sea[0]} />
    }
    key={this.state.shipmentArr[0]}
  >
    {this.state.shipmentArr.map(x => {
      return (
        <Option value={x.name}>
          <DisplayContainer data={x} />
        </Option>
      );
    })}
  </Select>

См. Полный обновленный код ручки .

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