Вы можете сделать это, установив стиль (CSS) для вашего элемента динамически на основе пропущенных реквизитов. Вам просто нужно сопоставить тип Pokemon с цветом, а затем просто проверить, существует ли только один тип или два, и использовать его для установки background-color
или background-image
(с использованием линейного градиента).
Например:
const POKEMON_TYPES = {
FIRE: "Fire",
WATER: "Water",
GRASS: "Grass",
}
const POKEMON_TYPE_COLORS = {
[POKEMON_TYPES.FIRE]: "#ff0000",
[POKEMON_TYPES.WATER]: "#0000ff",
[POKEMON_TYPES.GRASS]: "#00ff00",
}
const App = () => {
return (
<div>
<PokemonCard name="Fire Only" types={ [POKEMON_TYPES.FIRE] }/>
<PokemonCard name="Fire And Water" types={ [POKEMON_TYPES.FIRE, POKEMON_TYPES.WATER] }/>
<PokemonCard name="Water And Grass" types={ [POKEMON_TYPES.WATER, POKEMON_TYPES.GRASS] }/>
</div>
)
}
const PokemonCard = props => {
const { name, types } = props;
let style;
if (types.length === 2) {
const typeColor1 = POKEMON_TYPE_COLORS[types[0]];
const typeColor2 = POKEMON_TYPE_COLORS[types[1]];
style = {"backgroundImage": `linear-gradient(45deg, ${typeColor1}, ${typeColor2})`};
} else {
const typeColor = POKEMON_TYPE_COLORS[types[0]];
style = {"backgroundColor": typeColor};
}
return (
<div className="pokemon-card" style={ style }>
{ name }
</div>
)
}
ReactDOM.render(<App/>, document.querySelector("#root"));
.pokemon-card {
color: #fff;
width: 10rem;
height: 5rem;
padding: .75rem 1rem;
margin-bottom: 1rem;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/16.6.3/umd/react.production.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/16.6.3/umd/react-dom.production.min.js"></script>
<div id="root"/>
Вы можете добавить обработку для сортировки типов, чтобы каждая комбинация всегда отображалась одинаково (без переворотов). Также вы можете рассмотреть возможность использования type
и types
в качестве отдельного реквизита (не уверен, как вы его настроили в настоящее время), но должно быть ясно, как сделать это изменение.
Вы также можете установить цвет текста по-разному в зависимости от цвета фона, этот пост может быть полезен для вас: { ссылка }.