/
githubmr
/
facebook-react
Обзор
Документация
Войти
/
githubmr
/
facebook-react
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
Аналитика
main
packages/react-devtools-shell/src/app/ToDoList/List.js
119 строк
3 KB
Jan Kassens
[flow] enable LTI inference mode (#26104)
10 фев 2023, 01:07
Не верифицирован
10 фев 2023, 01:07
6ddcbd4
Код
Авторство
О чём код?
/** * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. * * @flow */ import * as React from 'react'; import {Fragment, useCallback, useState} from 'react'; import ListItem from './ListItem'; import styles from './List.css'; export type Item = { id: number, isComplete: boolean, text: string, }; type Props = {}; export default function List(props: Props): React.Node { const [newItemText, setNewItemText] = useState<string>(''); const [items, setItems] = useState<Array<Item>>([ {id: 1, isComplete: true, text: 'First'}, {id: 2, isComplete: true, text: 'Second'}, {id: 3, isComplete: false, text: 'Third'}, ]); const [uid, setUID] = useState<number>(4); const handleClick = useCallback(() => { if (newItemText !== '') { setItems([ ...items, { id: uid, isComplete: false, text: newItemText, }, ]); setUID(uid + 1); setNewItemText(''); } }, [newItemText, items, uid]); const handleKeyPress = useCallback( (event: $FlowFixMe) => { if (event.key === 'Enter') { handleClick(); } }, [handleClick], ); const handleChange = useCallback( (event: $FlowFixMe) => { setNewItemText(event.currentTarget.value); }, [setNewItemText], ); const removeItem = useCallback( (itemToRemove: $FlowFixMe) => setItems(items.filter(item => item !== itemToRemove)), [items], ); const toggleItem = useCallback( (itemToToggle: $FlowFixMe) => { // Dont use indexOf() // because editing props in DevTools creates a new Object. const index = items.findIndex(item => item.id === itemToToggle.id); setItems( items .slice(0, index) .concat({ ...itemToToggle, isComplete: !itemToToggle.isComplete, }) .concat(items.slice(index + 1)), ); }, [items], ); return ( <Fragment> <h1>List</h1> <input type="text" placeholder="New list item..." className={styles.Input} value={newItemText} onChange={handleChange} onKeyPress={handleKeyPress} /> <button className={styles.IconButton} disabled={newItemText === ''} onClick={handleClick}> <span role="img" aria-label="Add item"> ➕ </span> </button> <ul className={styles.List}> {items.map(item => ( <ListItem key={item.id} item={item} removeItem={removeItem} toggleItem={toggleItem} /> ))} </ul> </Fragment> ); }