样式 react-select with aphrodite
Style react-select with aphrodite
我正在尝试使用 aphrodite 中内置的一些现有样式来设置第 3 方组件 react-select 的样式。该组件上有一些道具,允许您传递一个 className 定义 class 以用于组件的主容器。然后它有一个 classNamePrefix 道具,用于为组件中的子项添加前缀。该文档详细说明了 classNamePrefix + 名称的组合,以在您的样式 sheet 中使用每个项目的样式。
https://react-select.com/styles#using-classnames
我正在寻找一个示例,说明我如何使用阿佛洛狄忒来执行此操作。我遇到的问题是当我调用 css() 时,我得到一个随机的 class 名称。我想不出指定 classNamePrefix.
的方法
我最终使用了 React Select Component API 这是我如何使用 Aphrodite 将自定义样式注入 React 的各个部分的示例 Select 组件。
// Node Modules
import { css } from 'aphrodite';
import PropTypes from 'prop-types';
import React, { Fragment } from 'react';
import ReactSelect, { components } from 'react-select';
// Styles
import styles from './SelectStyles';
import { fontStyles } from 'styles';
// Assets
import caretImg from 'images/downCaret.svg';
class Select extends React.Component {
render() {
const { noOptionsMessage, onChange, options, value } = this.props;
const Control = props => (
<components.Control {...props} className={css(styles.selectControl)} />
);
const DropdownIndicator = props => {
return (
components.DropdownIndicator && (
<components.DropdownIndicator {...props}>
<img src={caretImg} height="6px" alt="▼" className={css(styles.caret)} />
</components.DropdownIndicator>
)
);
};
const IndicatorSeparator = ({ innerProps }) => {
return <span className={css(styles.indicatorSeparator)} {...innerProps} />;
};
const Menu = props => {
return (
<Fragment>
<components.Menu {...props} className={css(styles.menu)}>
{props.children}
</components.Menu>
</Fragment>
);
};
const Option = props => (
<components.Option
{...props}
className={css(
fontStyles.regular,
props.isSelected ? styles.menuOptionSelected : styles.menuOption,
)}
/>
);
const ValueContainer = ({ children, ...props }) => (
<components.ValueContainer {...props}>{children}</components.ValueContainer>
);
return (
<ReactSelect
className={css(fontStyles.semibold, styles.selectContainer)}
components={{
Control,
DropdownIndicator,
IndicatorSeparator,
Menu,
Option,
ValueContainer,
}}
isSearchable={true}
noOptionsMessage={() => noOptionsMessage}
onChange={onChange}
options={options}
value={value}
/>
);
}
}
Select.propTypes = {
noOptionsMessage: PropTypes.string,
onChange: PropTypes.func.isRequired,
options: PropTypes.arrayOf(PropTypes.object),
value: PropTypes.object,
};
export default Select;
我正在尝试使用 aphrodite 中内置的一些现有样式来设置第 3 方组件 react-select 的样式。该组件上有一些道具,允许您传递一个 className 定义 class 以用于组件的主容器。然后它有一个 classNamePrefix 道具,用于为组件中的子项添加前缀。该文档详细说明了 classNamePrefix + 名称的组合,以在您的样式 sheet 中使用每个项目的样式。
https://react-select.com/styles#using-classnames
我正在寻找一个示例,说明我如何使用阿佛洛狄忒来执行此操作。我遇到的问题是当我调用 css() 时,我得到一个随机的 class 名称。我想不出指定 classNamePrefix.
的方法我最终使用了 React Select Component API 这是我如何使用 Aphrodite 将自定义样式注入 React 的各个部分的示例 Select 组件。
// Node Modules
import { css } from 'aphrodite';
import PropTypes from 'prop-types';
import React, { Fragment } from 'react';
import ReactSelect, { components } from 'react-select';
// Styles
import styles from './SelectStyles';
import { fontStyles } from 'styles';
// Assets
import caretImg from 'images/downCaret.svg';
class Select extends React.Component {
render() {
const { noOptionsMessage, onChange, options, value } = this.props;
const Control = props => (
<components.Control {...props} className={css(styles.selectControl)} />
);
const DropdownIndicator = props => {
return (
components.DropdownIndicator && (
<components.DropdownIndicator {...props}>
<img src={caretImg} height="6px" alt="▼" className={css(styles.caret)} />
</components.DropdownIndicator>
)
);
};
const IndicatorSeparator = ({ innerProps }) => {
return <span className={css(styles.indicatorSeparator)} {...innerProps} />;
};
const Menu = props => {
return (
<Fragment>
<components.Menu {...props} className={css(styles.menu)}>
{props.children}
</components.Menu>
</Fragment>
);
};
const Option = props => (
<components.Option
{...props}
className={css(
fontStyles.regular,
props.isSelected ? styles.menuOptionSelected : styles.menuOption,
)}
/>
);
const ValueContainer = ({ children, ...props }) => (
<components.ValueContainer {...props}>{children}</components.ValueContainer>
);
return (
<ReactSelect
className={css(fontStyles.semibold, styles.selectContainer)}
components={{
Control,
DropdownIndicator,
IndicatorSeparator,
Menu,
Option,
ValueContainer,
}}
isSearchable={true}
noOptionsMessage={() => noOptionsMessage}
onChange={onChange}
options={options}
value={value}
/>
);
}
}
Select.propTypes = {
noOptionsMessage: PropTypes.string,
onChange: PropTypes.func.isRequired,
options: PropTypes.arrayOf(PropTypes.object),
value: PropTypes.object,
};
export default Select;