I am using rc-time-picker
package for my project, but I have problem with customizing the style of pop-up
of my time picker
component. Here is the screenshot of my component:
Firstly, I need to change the background-color of time item
in the time li
from light grey
(in the screenshot) to #edeffe
when time is hovered and selected . The following is my code:
import React from "react";
import TimePicker from "rc-time-picker";
import "rc-time-picker/assets/index.css";
import styled from 'styled-components';
const StyledTimePicker = styled(TimePicker)`
&.rc-time-picker-panel-select-option-selected{
background-color: #edeffe !important;
}
`;
const DeliTimePicker = ({ value, onChange, ...others }) => {
return (
<StyledTimePicker
showSecond={false}
onChange={onChange}
hideDisabledOptions
minuteStep={5}
{...others}
value={value}
use12Hours
/>
);
};
export default DeliTimePicker;
From the inspection in the browser, I find the className
of each item when selected is rc-time-picker-panel-select-option-selected
. I also have to use styled component
package for styling in my project. I can't figure out why it doesn't work via this method. The final component should look like this:
This is the codesandbox link: https://codesandbox.io/s/kk8lllwwp7?fontsize=14
Any answer would be greatly appreciated!
You need to rearrange the order in which you're stylizing your TimePicker
component. The styled-components
package generates a className
that needs to be applied to the TimePicker
. In this case, it'll be applied to both its className
and its popupClassName
Working example:
components/TimePicker/index.js
import styled from "styled-components";
import TimePicker from "./TimePicker";
const StyledTimePicker = styled(TimePicker)`
& .rc-time-picker-panel-select-option-selected {
background-color: #edeffe;
font-weight: normal;
}
& .rc-time-picker-clear,
& .rc-time-picker-clear-icon:after {
font-size: 15px;
}
& .rc-time-picker-panel-select,
& .rc-time-picker-input,
& .rc-time-picker-panel-input {
font-family: "Consolas", sans-serif;
font-size: 16px;
::-webkit-scrollbar {
width: 0;
height: 0;
}
}
`;
export default StyledTimePicker;
components/TimePicker/TimePicker.js
import React from "react";
import PropTypes from "prop-types";
import moment from "moment";
import TimePicker from "rc-time-picker";
import "rc-time-picker/assets/index.css";
const DeliTimePicker = ({ className, onChange, value, ...rest }) => (
<TimePicker
{...rest}
className={className}
popupClassName={className}
showSecond={false}
onChange={onChange}
hideDisabledOptions
minuteStep={5}
value={value}
use12Hours
/>
);
DeliTimePicker.propTypes = {
className: PropTypes.string.isRequired,
onChange: PropTypes.func.isRequired,
value: PropTypes.instanceOf(moment)
};
export default DeliTimePicker;
components/TimeSelectForm/index.js
import React, { Component } from "react";
import moment from "moment";
import TimePicker from "../TimePicker";
class TimeSelectForm extends Component {
state = {
value: moment()
};
handleChange = value => this.setState({ value });
handleSubmit = e => {
e.preventDefault();
alert(moment(this.state.value).format("hh:mm a"));
};
render = () => (
<form onSubmit={this.handleSubmit}>
<TimePicker value={this.state.value} onChange={this.handleChange} />
<br />
<button type="submit">Submit</button>
</form>
);
}
export default TimeSelectForm;