interface IFormData {
firstName: string;
lastName: string;
}
const [ formData, setFormData ] = React.useState<IFormData>({
firstName: '',
lastName: '',
});
const onChange = (e: React.ChangeEvent<HTMLInputElement>) => setFormData({
...formData,
[e.target.name]: e.target.value,
});
<CustomTextField name="firstName" value={formData.firstName} onChange={onChange} />
<CustomTextField name="lastName" value={formData.lastName} onChange={onChange} />
<!-- или -->
{Object.entries(formData).map(([ k, v ]) => (
<CustomTextField key={k} name={k} value={v} onChange={onChange} />
))}
async function fetchRepos(username) {
let result = [];
try {
result = (await axios.get(`https://api.github.com/users/${username}/repos`)).data;
} catch(e) {
console.error(e);
}
setRepos(result);
}
<Search onSearch={fetchRepos} />
function Search({ onSearch }) {
const [ searchValue, setSearchValue ] = useState('');
function onSubmit(e) {
e.preventDefault();
onSearch(searchValue);
}
return (
<form onSubmit={onSubmit}>
<input
type="text"
value={searchValue}
onChange={e => setSearchValue(e.target.value)}
/>
<button>Найти</button>
</form>
)
}
class App extends React.Component {
state = {
colors: [ 'раз цвет', 'два цвет', 'три цвет', 'ещё какой-то цвет', 'и ещё' ],
selectedColor: '',
}
onChange = e => {
this.setState({
selectedColor: e.target.value,
});
}
render() {
const { colors, selectedColor } = this.state;
return (
<div>
<select value={selectedColor} onChange={this.onChange}>
<option disabled hidden value="">SELECT COLOR</option>
{colors.map(n => <option>{n}</option>)}
</select>
{selectedColor &&
<p style={{ color: selectedColor }}>
{selectedColor} color selected
</p>
}
</div>
);
}
}
onChange={(event) => { return test(event, id); }}
id
? Откуда он берётся? Уж точно не из input'a - этот будет event.target.id
.onChange={() => { return handlerOnChange; }}
handlerOnChange
? И зачем постоянно делаете return
, что и кому пытаетесь вернуть?id
достаёте из target
, и не надо никаких дополнительных обёрток над обработчиками событий при их назначении экземплярам TextField
:const onChange = e => {
const { id } = e.target;
...
<TextField
onChange={onChange}
...
class App extends React.Component {
state = {
links: [],
newLink: {
href: '',
text: '',
},
}
onChange = ({ target: { name, value } }) => {
this.setState(({ newLink }) => ({
newLink: {
...newLink,
[name]: value,
},
}));
}
addLink = e => {
e.preventDefault();
this.setState(({ links, newLink }) => ({
links: [ ...links, newLink ],
newLink: Object.fromEntries(Object.keys(newLink).map(n => [ n, '' ])),
}));
}
render() {
return (
<div>
<ul>
{this.state.links.map(n => (
<li>
<a href={n.href}>{n.text}</a>
</li>
))}
</ul>
<form onSubmit={this.addLink}>
{Object.entries(this.state.newLink).map(([ name, value ]) => (
<div>
{name}:
<input name={name} value={value} onChange={this.onChange} />
</div>
))}
<input type="submit" value="Добавить" />
</form>
</div>
);
}
}
карточка и модалка, это как один компонент
вдруг у меня будет таких карточек не 6 а 106
function Portfolio() {
const [ modalData, setModalData ] = useState(null);
const onClick = (e) => setModalData(cardsData[e.target.dataset.index]);
const onClose = () => setModalData(null);
return (
<div>
{cardsData.map((n, i) => (
<button data-index={i} onClick={onClick}>
open modal #{i + 1}
</button>
))}
<Modal isOpen={!!modalData} onRequestClose={onClose}>
{modalData && (
<>
<h2>{modalData.title}</h2>
<button onClick={onClose}>close</button>
<div>{modalData.things}</div>
</>
)}
</Modal>
</div>
);
}
class DB {
info = null;
...
const Episodes = observer(() => {
useEffect(() => {
...
}, [ DB.info ]);
...
return <Episodes />;
на return DB.info && <Episodes />;
. const grouped = props.mainPage.room.reduce((acc, n) => (
(acc[n.storey] ??= []).push(n),
acc
), {});
{Object.entries(grouped).map(([ groupName, group ]) => (
<div className="group" key={groupName}>
<h3>{groupName}</h3>
{group.map(n => <NumberRoom key={n.id} {...n} />)}
</div>
))}
setData(result);
setData({ ...result });
. Визуал jsx элемента, как и вопросы форматирования времени и даты не так важны, как важно просто разобраться с возможной последовательностью действий, как все это описать.
arr.map(n => {
const start = форматированное значение n.start_at;
const end = форматированное значение n.end_at;
return <span>{start} - {end}</span>;
})
import { Lazy } from 'swiper';
. Этого вы не сделали.SwiperCore.use([ Lazy ]);
. Этого вы не сделали.<Swiper lazy={true}>
. Этого вы не сделали.swiper-lazy
, атрибут src
заменить на data-src
. Ну, хоть это у вас есть. 1 + количество_строк - количество_элементов_в_данных_текущего_столбца
чем это может быть вызвано?
useEffect(() => setIsLoadError(false), [ src ]);
<Image key={card ? card.link : 'hello, world!!'}
const [ showImage, setShowImage ] = useState(true);
<button onClick={() => setShowImage(!showImage)}>click me</button>
{showImage ? <img src="..." /> : null}
function Counter({ val, time }) {
const [ currVal, setCurrVal ] = useState(0);
useEffect(() => {
currVal !== val && setTimeout(setCurrVal, time, currVal + 1);
}, [ currVal ]);
return <div>{currVal}</div>;
}
const event = await ticketFactoryContract.methods.eventsList(i).call();
setEvents(events => [ ...events, event ]);
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>
);