Вы уверены, что все делаете правильно?Здесь работает:
const sku = {
colors: [
{ id: 1, name: "Black" },
{ id: 2, name: "Red" },
{ id: 3, name: "White" },
],
};
class App extends React.Component {
state = {
selectedColor: "Red"
};
onColorChange ( currentColor ) {
this.setState( { selectedColor: currentColor } );
}
render() {
return (
<div>
{sku.colors && (
<div className="swatches" styleName="swatches">
<span className="color" styleName="color" data-name="color">
{sku.colors.map((option, index) => (
<span
className={
this.state.selectedColor === option.name ? "active" : ""
}
styleName="swatch"
onClick={this.onColorChange.bind(this, option.name)}
key={index}
>
{option.name}
</span>
))}
</span>
</div>
)}
</div>
);
}
}
ReactDOM.render(<App />, document.getElementById("root"));
.active {
font-size: 20px;
font-weight: bold;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react-dom.min.js"></script>
<div id="root"></div>
Кроме того, если вы извлекаете каждый option
в его компонент, вам не нужно напрямую связывать свою функцию в JXS.Таким образом, он не будет создан в каждом рендере.Если вы используете его как это или с функцией стрелки, он будет создан при каждом рендере.Кроме того, если вы посмотрите на консоль, React предупредит вас об использовании атрибута styleName
как stylename
.
const sku = {
colors: [
{ id: 1, name: "Black" },
{ id: 2, name: "Red" },
{ id: 3, name: "White" },
],
};
class App extends React.Component {
state = {
selectedColor: "Red",
};
onColorChange = currentColor =>
this.setState( { selectedColor: currentColor } );
render() {
return (
<div>
{sku.colors && (
<div className="swatches" styleName="swatches">
<span className="color" styleName="color" data-name="color">
{sku.colors.map( option => (
<Option
key={option.id}
option={option}
selectedColor={this.state.selectedColor}
onColorChange={this.onColorChange}
/>
) )}
</span>
</div>
)}
</div>
);
}
}
const Option = ( props ) => {
const { option, selectedColor, onColorChange } = props;
const handleChange = () => onColorChange( option.name );
return (
<span
className={
selectedColor === option.name ? "active" : ""
}
styleName="swatch"
onClick={handleChange}
>
{option.name}
</span>
);
};
ReactDOM.render(<App />, document.getElementById("root"));
.active {
font-size: 20px;
font-weight: bold;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react-dom.min.js"></script>
<div id="root"></div>