this.state = {
openedServiceFormIndex: -1,
};
clickServiceCard(index) {
this.setState(
prevState => {
if (index === prevState.openedServiceFormIndex) {
return {
openedServiceFormIndex: -1,
}
} else {
return {
openedServiceFormIndex: index,
}
}
}
);
}
render() {
<div className="service-list">
{serviceCards.map((card, index) => {
return (
<React.Fragment key={"service-card" + index}>
<ServiceCard
opened={index === this.state.openedServiceCardIndex}
clickServiceCard={() => this.clickServiceCard(index)}
extraClass="service-list__card"
/>
</React.Fragment>
);
})}
</div>
}
render() {
return (
<div className={cn("service-card", { "--opened": this.props.opened})}>
<button
className="service-card__btn"
onClick={this.props.clickServiceCard}
>
Кнопка
</button>
</div>
)}
}
state = {
values: [false, false, false], // Изначально все 3 чекбокса выключены
};
onToggleCheckbox = (checked, index) => {
this.setState(({ values: prevValues }) => {
const newValues = [...prevValues]; // меняем состояние нужного чекбокса по индексу
newValues[index] = checked;
return {
value: newValues,
};
});
};
onToggleAll = checked => {
this.setState(({ values }) => ({
values: values.map(() => checked),
}));
};
<div>
{this.props.checked.map((value, index) => (
<input
type="checkbox"
checked={value}
key={index}
onChange={event => this.props.onToggle(event, index)}
/>
))}
</div>
<input type="checkbox" checked={this.props.values.every(value => value)} onChange={event => this.props.onToggleAll(event.target.checked)} />
const [data, setData] = useState(null);
useEffect(() => {
const controller = new AbortController()
fetchData(controller.signal).then(setData)
return () => controller.abort()
}, [fetchData, setData])
const data = useMemo(() => array.map(mapper).filter(predicate).reduce(reducer), [array])
const handler = useCallback(() => {
// что-то сделать
}, [])
useEffect(() => {
handler(value)
// если не использовать useCallback, эффект будет срабатывать постоянно
}, [handler, value])
Request0() {
// this.abort()
// можно делать это тут, если запрос должен быть только один, а можно в useEffect
this.abortController = new AbortController()
// fetch
finally {
this.abortController = null
}
}
abort() {
if (this.abortController) {
this.abortController.abort();
this.abortController = null
}
}
const Input = forwardRef((props, ref) => <input ref={ref} {...props} />)
const Input = ({ inputRef, ...props }) => <input ref={inputRef} {...props} />
const products = filteredProducts.filter(product => product.category === "Some, category");
const count = products.length;
return (
<div className="products-list">
<Title title="Some Title" />
<div className="products-container">
<p> {count} </p>
</div>
<div className="products-container">
{products.map(product => (
<ProductCard
key={product.id}
product = {product}
/>
))}
</div>
</div>
);