Что я делаю не так
как решить проблему?
{ LikeIcon }
---> <LikeIcon />
. const [ todos, setTodos ] = useState(() => {
let todos = null;
try {
todos = JSON.parse(localStorage.getItem('todos'));
} catch (e) {};
return Array.isArray(todos) ? todos : [];
});
setTodos([ ...todos, { id: Date.now(), complete: false, title: value, }, ]); localStorage.setItem("todos", JSON.stringify(todos));
useEffect(() => {
localStorage.setItem('todos', JSON.stringify(todos));
}, [ todos ]);
сделал две функции, которые поочерёдно возвращают компонент согласно индексу
желаемого эффекта не получил
в консоль выводиться...
const Component1 = () => <h1>hello, world!!</h1>;
const Component2 = () => <h1>fuck the world</h1>;
const Component3 = () => <h1>fuck everything</h1>;
const components = [ Component1, Component2, Component3 ];
function App() {
const [ index, setIndex ] = useState(0);
const min = 0;
const max = components.length - 1;
const Component = components[index];
const onClick = ({ target: { dataset: { step } } }) =>
setIndex(Math.max(min, Math.min(max, index + +step)));
return (
<div>
<button onClick={onClick} data-step="-1" disabled={index <= min}>prev</button>
<button onClick={onClick} data-step="+1" disabled={index >= max}>next</button>
{Component && <Component />}
</div>
);
}
const [ buttonText, setButtonText ] = useState('hello, world!!');
const [ clicked, setClicked ] = useState(false);
function onClick() {
setClicked(true);
setTimeout(() => {
setButtonText('fuck the world');
setClicked(false);
}, 1000);
}
<button onClick={onClick} disabled={clicked}>{buttonText}</button>
{clicked ? <img src="..." /> : null}
useCapture
A boolean value indicating whether events of this type will be dispatched to the registered listener before being dispatched to any EventTarget beneath it in the DOM tree.
element.addEventListener(event, handler, true)
. React.useCallback((key, val) => {
setData(data => ({
...data,
[key]: val(data[key]),
}));
}, [])
onChange('list', list => list.map((n, i) => i === index
? { ...n, [prop]: value }
: n
))
onChange('description', () => e.target.value)
Вначале удаляем элемент из массива, затем выбираем новый. Но получается так, что, иногда, выбор случайного элемента массива, происходит до удаления элемента из массива и он выбирает только что удаленный элемент.
Как правильно реализовать такую логику?
useEffect(() => {
dispatch({
type: SET_RND_NUM,
payload: state.arr[Math.random() * state.arr.length | 0],
});
}, [ state.arr ]);
const [ checked, setChecked ] = React.useState(false);
<input
type="checkbox"
checked={checked}
onChange={e => setChecked(e.target.checked)}
...
<button
disabled={!checked}
...
const Todos = ({ todos, TodoItem }) => (
<div className="todos">
{todos.map(n => (
<div className="todo-item" key={n.id}>
<TodoItem todo={n} />
</div>
))}
</div>
);
const HeaderTodoItem = ({ todo }) => (
<h3>{todo.title}</h3>
);
const AppTodoItem = ({ todo }) => (
<>
<img src={todo.img} alt={todo.title} />
<div>
<h3>{todo.title}</h3>
<p>{todo.text}</p>
</div>
</>
);
<Todos todos={todos} TodoItem={HeaderTodoItem} />
<Todos todos={todos} TodoItem={AppTodoItem} />
const SORT = [
[ 'без сортировки' ],
[ 'цена, по возрастанию', (a, b) => a.price - b.price ],
[ 'цена, по убыванию', (a, b) => b.price - a.price ],
[ 'год создания, по возрастанию', (a, b) => a.formed_in - b.formed_in ],
[ 'год создания, по убыванию', (a, b) => b.formed_in - a.formed_in ],
];
const [ sortType, setSortType ] = useState(0);
const data = useMemo(() => {
const sortFunc = SORT[sortType][1];
return sortFunc ? [...bands].sort(sortFunc) : bands;
}, [ bands, sortType ]);
<select value={sortType} onChange={e => setSortType(e.target.value)}>
{SORT.map((n, i) => <option value={i}>{n[0]}</option>)}
</select>
const [ author, setAuthor ] = useState(null);
const [ dateMin, setDateMin ] = useState(null);
const [ dateMax, setDateMax ] = useState(null);
const authors = useMemo(
() => [...new Set(articles.map(n => n.author))],
[ articles ]
);
const filteredArticles = useMemo(
() => [
[ author, n => n.author === author ],
[ dateMin, n => n.publishedAt >= dateMin ],
[ dateMax, n => n.publishedAt <= dateMax ],
].reduce((acc, n) => n[0] ? acc.filter(n[1]) : acc, articles),
[ articles, author, dateMin, dateMax ]
);
<select value={author} onChange={e => setAuthor(e.target.value)}>
<option></option>
{authors.map(n => <option>{n}</option>)}
</select>
от <input type="date" value={dateMin} onChange={e => setDateMin(e.target.value)} />
до <input type="date" value={dateMax} onChange={e => setDateMax(e.target.value)} />
{filteredArticles.map(n => <Card {...n} />)}
const [ autoplay, setAutoplay ] = useState(false);
const swiper = useRef();
useEffect(() => {
swiper.current.autoplay[autoplay ? 'start' : 'stop']();
}, [ autoplay ]);
<input
type="checkbox"
checked={autoplay}
onChange={e => setAutoplay(e.target.checked)}
/>
<Swiper
onSwiper={instance => swiper.current = instance}
...
>
const data = Object.entries(сюда кидаете свои данные);
const years = Array
.from(new Set(data.flatMap(n => Object.keys(n[1].G))))
.sort((a, b) => a - b);
const columns = Array
.from(new Set(data.flatMap(n => Object.values(n[1].G).flatMap(Object.keys))))
.sort();
<TableHead>
<TableRow>
<TableCell rowSpan={2}>regions</TableCell>
{years.map(n => <TableCell colSpan={columns.length}>{n}</TableCell>)}
</TableRow>
<TableRow>
{years.flatMap(n => columns.map(m => <TableCell>{m}</TableCell>))}
</TableRow>
</TableHead>
<TableBody>
{data.map(([ region, { G } ]) => (
<TableRow>
<TableCell>{region}</TableCell>
{years.flatMap(n => columns.map(m => <TableCell>{G[n]?.[m]?.value ?? 0}</TableCell>))}
</TableRow>
))}
</TableBody>
const questions = [
{
text: 'Выберите верное утверждение',
answers: [
'СССР распался в 1997 году',
'Солнце вращается вокруг Земли',
'шестью восемь - двадцать три',
],
correctAnswer: 1,
},
{
text: '...',
answers: [ '...', '...', ... ],
correctAnswer: ...,
},
...
];
function Question(props) {
const onChange = e => props.onAnswerChange(+e.target.value);
return (
<div>
<h3>{props.question.text}</h3>
<ol>
{props.question.answers.map((n, i) => (
<li>
<label>
<input
type="radio"
value={i}
checked={props.answer === i}
onChange={onChange}
/>
{n}
</label>
</li>
))}
</ol>
</div>
);
}
function App(props) {
const [ answers, setAnswers ] = useState(Array(props.questions.length).fill(null));
const updateAnswer = (questionIndex, answer) =>
setAnswers(answers.map((n, i) => i === questionIndex ? answer : n));
return (
<div>
{props.questions.map((n, i) => (
<Question
question={n}
answer={answers[i]}
onAnswerChange={answer => updateAnswer(i, answer)}
/>
))}
</div>
);
}
не получается сделать грамотную проверку правильного ответа...
const correctAnswersCount = answers.reduce((acc, n, i) => {
return acc + (n === questions[i].correctAnswer);
}, 0);
...и одновременно вывести верные ответы
const correctAnswers = questions.map(n => n.answers[n.correctAnswer]);
activeType
указывайте не 0
, а нулевой элемент из types
:React.useState(0);
---> React.useState(types[0]);
const getData = type => fetch(`https://jsonplaceholder.typicode.com/${type}`).then(r => r.json());
const [ data, setData ] = useState([]);
useEffect(() => {
Promise
.all([ 'posts', 'users' ].map(getData))
.then(([ posts, users ]) => {
const usersObj = Object.fromEntries(users.map(n => [ n.id, n ]));
setData(posts.map(n => ({
post: n,
user: usersObj[n.userId],
})));
});
}, []);
return (
<div>
{data.map(({ post, user }) => (
<div>
<h2>{post.title}</h2>
<h3>{user.name}</h3>
<p>{post.body}</p>
</div>
))}
</div>
);