const [ active, setActive ] = useState(null);
{items.map((n, i) => (
<FirstWindowItems
item={n}
isActive={active === i}
onClick={() => setActive(i)}
/>
))}
function FirstWindowItems({ item, isActive, onClick }) {
return (
<div className={`window__items ${isActive ? 'active' : ''}`} onClick={onClick}>
...
.window__items.active {
здесь стили для активного элемента
}
const [users, setUsers] = useState({user:['user1', 'user2', 'user3']});
setUsers(users.user.filter((item,i) => i !== index));
const list = users.user.map(...
<Route path="/products" component={Products} />
exact
.return <h1>Product# {match.slug}</h1>;
match.params.slug
. state = {
modal: false,
}
hideModal = () => {
this.setState({ modal: false })
}
render() {
return (
...
{this.state.modal ? <Modal close={this.hideModal} /> : null}
...
);
}
return (
<div
className="modal-overlay"
onClick={e => (e.currentTarget === e.target) && props.close()}
>
<div className="modal-content">
...
</div>
</div>
);
я знаю, что правильно менять состояние предыдущего state, то есть setState( prev => !prev ), но как это прописать для моего случая, когда предыдущее состояние должно поменять на значение item.value ?
setState(() => value)
.нажимаю кнопку Д после кнопки М и в indicator сохраняется значение кнопки М
useEffect(() => console.log('indicator: ', indicator), [ indicator ]);
const Button = ({ children, className = '', ...rest }) => (
<button {...rest} className={`button ${className}`}>
{children}
</button>
);
идентичны
l
и 1
совсем не одно и то же.function App() {
const [ seconds, setSeconds ] = React.useState(60);
const [ timerActive, setTimerActive ] = React.useState(false);
React.useEffect(() => {
if (seconds > 0 && timerActive) {
setTimeout(setSeconds, 100, seconds - 1);
} else {
setTimerActive(false);
}
}, [ seconds, timerActive ]);
return (
<div>
{seconds
? <React.Fragment>
<button onClick={() => setTimerActive(!timerActive)}>
{timerActive ? 'stop' : 'start'}
</button>
<div>{seconds}</div>
</React.Fragment>
: <button onClick={() => setSeconds(60)}>ещё раз</button>
}
</div>
);
}
useEffect(() => {
axios.get('/api/products/random-lucky-box').then(r => setProduct(r.data));
}, []);
useEffect(() => {
if (product.catId) {
axios.get(`/api/categories/${product.catId}`).then(r => setCategory(r.data));
}
}, [ product ]);
const Indicator = ({ value, max = 6 }) => (
<div>
{Array.from({ length: max }, (_, i) => (
<div className={`indicator-cell ${i < value ? 'active' : ''}`}></div>
))}
</div>
);
.indicator-cell {
background: white;
}
.indicator-cell.active {
background: red;
}
<Indicator value={4} />
<Indicator value={1} />
<Indicator value={8} max={12} />
<TreePicker
locale={{
searchPlaceholder: 'hello, world!!',
}}
const [ form, setForm ] = useState({
login: '',
password: '',
});
const onChange = ({ target: t }) => setForm({ ...form, [t.name]: t.value });
<input name="login" value={form.login} onChange={onChange} />
<input name="password" value={form.password} onChange={onChange} />