const [ selected, setSelected ] = useState({});
const onChange = ({ target: { value, dataset: { id } } }) => {
setSelected({ ...selected, [id]: value });
};
return (
<div>
{data.map(({ id, name, variants }) => (
<div>
<div>{name}</div>
<select
value={selected[id]}
data-id={id}
onChange={onChange}
>
<option>ну давай, выбери что-нибудь</option>
{variants.map(n => <option value={n.price}>{n.data.period}</option>)}
</select>
<div>{selected[id] || 'НИЧЕГО НЕ ВЫБРАНО'}</div>
</div>
))}
</div>
);
{ имя валюты, относительная стоимость }
.The useRef() Hook isn’t just for DOM refs. The “ref” object is a generic container whose current property is mutable and can hold any value, similar to an instance property on a class.
this.setState(({ items }) => ({
items: items.map((n, i) => ({ ...n, id: i })),
}));
state = {
items: this.props.items.map((n, i) => ({ ...n, id: i })),
}
export default ({ filter, checked, onChange, children }) => (
<div>
<label>
<input
type="checkbox"
name={filter}
onChange={() => onChange(filter)}
checked={checked}
/>
{children}
</label>
</div>
);
return { ...user, isFollowed: !this.isFollowed };
const chunks = (arr, chunkSize) => Array.from(
{ length: Math.ceil(items.length / chunkSize) },
(n, i) => items.slice(i * chunkSize, (i + 1) * chunkSize)
);
const Card = props => (
<div className="style-review__slide-row">
<a className="style-card style-review__style-card" href="#">
<div className="style-card__overlay">
<div className="style-card__title">{props.title}</div>
<div className="style-card__category">
{props.category}
</div>
</div>
</a>
</div>
);
const chunkedItems = chunks(items, 3);
<Swiper>
{chunkedItems.map(cardItems => (
<SwiperSlide className="swiper-slide style-review__slide">
{cardItems.map(n => <Card {...n} />)}
</SwiperSlide>
))}
</Swiper>
state = {
markers: [],
maxMarkersNum: 666,
}
onClick = ({ latlng }) => {
this.setState(({ markers, maxMarkersNum }) => ({
markers: markers.length >= maxMarkersNum
? []
: [ ...markers, latlng ],
}));
}
<Map onClick={this.onClick}>
{this.state.markers.map(n => <Marker position={n} />)}
</Map>
setValue(value === e.target.value);
value ===
.setValue(Math.min(max, Math.max(min, e.target.value)));
Хотел реализовать тоже самое с двойным range слайдером и оказалось несколько сложнее.
{cats.map((cat, index) => (
<li key={cat.description} className="catsItem">
<img src={catsImg[index]} alt=""/>
...
() =>
перед openLightboxOnSlide(key)
(кстати, а какого хрена переменная, содержащая индекс, названа key?).null
, или -1
) - это будет означать, что показывать ничего не надо:const [ lightIndex, setLightIndex ] = useState(null);
<img onClick={() => setLightIndex(key)} />
<ReactBnbGallery
photos={photos}
show={lightIndex !== null}
activePhotoIndex={lightIndex}
onClose={() => setLightIndex(null)}
/>
ref={ref}
элементу, который собираетесь скрывать.<div className="mainWindow">
{this.props.children}
</div>
function Modal(props) {
const root = useRef();
useEffect(() => {
const onClick = e => root.current.contains(e.target) || закрытьОкно();
document.addEventListener('click', onClick);
return () => document.removeEventListener('click', onClick);
}, []);
return (
<div ref={root}>
...
</div>
);
}
function Modal(props) {
return (
<div
className="modal-overlay"
onClick={e => (e.currentTarget === e.target) && закрытьОкно()}
>
...
</div>
);
}
.modal-overlay {
position: absolute;
left: 0;
top: 0;
width: 100vw;
height: 100vh;
background: rgba(0, 0, 0, 0.5);
}