/**
* todolist
*/
type TodoItem = {
id: number,
content: string,
idEditable: boolean,
onEdit: (id) => void,
onDelete: (id) => void,
}
const ListItem = ({ id, content, idEditable, onEdit, onDelete }: TodoItem) => {
const [text,setText] = useState('');
const handleChange = e => setText(e.target.value);
return (
<div>
{
idEditable ? <input type="text" value={value} onChange={handleChange}/>
: <div className="content">{content}</div>
}
<div>
<button onClick={() => edit(id)}>编辑</button>
<button onClick={() => delete (id)}>删除</button>
</div>
</div>
)
}
const TodoList = () => {
const [listData, dispatch] = useReducer((state, palyod) => {
// if else 比较多的话可以使用 switch
if (palyod.type === 'add') {
return [...state, { ...palyod, id: state.length + 1 }];
}
if (palyod.type === 'edit') {
return state.map(item => {
if (item.id === palyod.id) {
return { ...item, content: palyod.content }
}
})
}
if (palyod.type === 'delete') {
return state.filter(item => item.id !== palyod.id)
}
}, [])
const [contentVal, setContenVal] = useState<string>('')
const handleClick = () => {
dispatch({
type: 'add',
palyod: contentVal
})
}
const handleEdit = (e, id) => {
dispatch({
type: 'edit',
payload: {
id,
content: e.target.value
},
})
}
const handleDelete = (id) => {
dispatch({
type: 'delete',
id
})
}
return (
<div>
<div className="ipt">
<input type="text" value={contentVal} onChange={e => setContenVal(e.target.value)} />
<button onClick={handleClick}>确认</button>
</div>
<div className="list">
{
listData.map(list => <ListItem {...list} key={list.id} edit={handleEdit} delete={handleDelete} />)
}
</div>
</div>
)
}