前提・実現したいこと
Next.jsでTodoアプリを作成しており、只今Todoリストの編集機能を作成中です。
そのTodoリストの仕様として、Todoのテキストは__<input value={item.text} />__ のような形で出力され、いつでも編集できるというようにしたいです。
しかし、出力された部分をクリックしても編集できるようになりません。これを編集できるようにするにはどのようにすればよいのかわからないので、力を貸していただきたいです。
該当のソースコード
React
1 2import React, { useState } from 'react' 3import { FormLabel, Input ,GridItem, Checkbox, Button } from '@chakra-ui/react' 4import { v4 as uuidv4 } from 'uuid'; 5 6interface Item { 7 id: number; 8 key: number; 9 text: string; 10 checked: boolean; 11} 12 13const InputForm: React.FC = ({ 14 15}) =>{ 16 let keynumber = Number(uuidv4()) 17 const [text, setText] = useState(''); 18 const [items, setItems] = useState<Item[]>([]); 19 20 21 const handleChange = (e: React.ChangeEvent<HTMLInputElement>) => setText(e.target.value) 22 const handleSubmit = (e: React.ChangeEvent<HTMLFormElement>) => { 23 e.preventDefault() 24 if(text === '')return; 25 setItems(items => [ ...items,{id: items.length+1,key: keynumber, text, checked: false }]) 26 setText('') 27 } 28 const handleDeleteItem = (index:number) => { 29 const newItems = [...items] 30 newItems.splice(index,1) 31 setItems(newItems) 32 } 33 34 35 const handleOnEdit = (key: number, text: string) => { 36 37 const newItems = items.map((item) => { 38 if (item.key === key) { 39 item.text = text; 40 } 41 return item; 42 }); 43 44 setItems(newItems); 45 }; 46 47 const handleOnCheck = (key: number, checked: boolean) => { 48 49 const newItems = items.map((item) => { 50 if (item.key === key) { 51 item.checked = !checked; 52 } 53 return item; 54 }); 55 56 setItems(newItems); 57 }; 58 59 60 return ( 61 <> 62 <GridItem colSpan={2}> 63 <form onSubmit={ handleSubmit }> 64 <FormLabel>press Enter</FormLabel> 65 <Input placeholder="Enter" value={text} onChange={(e) => handleChange(e)} /> 66 </form> 67 </GridItem> 68 {items.map((item, index) => { 69 return( 70 <GridItem colSpan={2} > 71 <Checkbox key={item.key} checked={item.checked} 72 onChange={() => handleOnCheck(item.id, item.checked)}> 73 <Input value={item.text} 74 onChange={(e) => handleOnEdit(item.id, e.target.value)} 75 /> 76 <Button colorScheme='pink' size="xs" onClick={() => handleDeleteItem(index)}> 77 delete 78 </Button> 79 </Checkbox> 80 </GridItem> 81 ); 82 })} 83 </> 84 ) 85} 86 87export default InputForm 88
試したこと
chakra-uiを使用していたので、Inputタグをinputに変えてみる
補足情報(FW/ツールのバージョンなど)
@chakra-ui/react 1.6.9
@types/react 17.0.29