blu*_*eal 5 javascript css reactjs antd
我要自定义antd Select。当用户单击Selectantd时,Option应显示在antd上方,Select而不是显示在Select
antd Select:https://ant.design/components/select/
预期的行为:1个
实际行为: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>
);
}
Run Code Online (Sandbox Code Playgroud)
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>
);
};
Run Code Online (Sandbox Code Playgroud)
App.css
.container-dropdown {
height: 53px;
width: 140px;
border: 0px solid white;
border-radius: 0px;
cursor: pointer;
font-size: 18px;
margin: 0px;
padding: 0px;
}
Run Code Online (Sandbox Code Playgroud)
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;
}
Run Code Online (Sandbox Code Playgroud)
我该如何实现?我已经花了几个小时的时间。但我无法成功。我会感激你的 谢谢
编辑01:
用户单击Select框时
我希望顶部Option(即FCL)升起并盖上这样的Select盒子:
我不希望Options(即FCL和LCL)都显示在下面的Select框中:
我相信我已经能够非常接近您想要实现的目标。下面是更新的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;
}
Run Code Online (Sandbox Code Playgroud)
可以在此处找到完整的代码沙箱。
本质上,您想要做的是使用组合子div为名称、描述等选择特定的 ,蚂蚁设计在其结构中嵌套得很深。
编辑
为了让下拉菜单根据当前选择的内容显示不同的数据(仅在选择 FCL 时显示 LCL,反之亦然),您可以使用 handleChange 函数来过滤原始货件数据,以便返回当前未显示的所有内容选择(即选择FCL时,选择没有FCL的LCL)。通过将原始装运数据与第二个数组(过滤后的菜单数据)一起存储在 state 中,您可以使用/更新第二个数组作为您的选择选项。
这是你的状态。
this.state = {
shipmentArr: [],
shipmentType: {
sea: [
{ name: "FCL", desc: "FULL CONTAINER LOAD" },
{ name: "LCL", desc: "LESS CONTAINER LOAD" }
],
air: [{ name: "AIR", desc: "AIR DELIVERY" }]
}
};
Run Code Online (Sandbox Code Playgroud)
这是新的handleChange.
handleChange = value => {
var newShipmentType = this.state.shipmentType.sea.filter(x => {
return x.name !== value;
});
this.setState({
shipmentArr: newShipmentType
});
};
Run Code Online (Sandbox Code Playgroud)
这是componentDidMount(使用handleChange)。
componentDidMount = () => {
this.handleChange(this.state.shipmentType.sea[0].name);
};
Run Code Online (Sandbox Code Playgroud)
下面是更新的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>
Run Code Online (Sandbox Code Playgroud)
查看完整更新的 codepen。