前提・実現したいこと
Reactを利用し、編集ボタンを押すと<p>タグを<input>に変更し、Blurで非同期通信にてタイトルを変更できるアプリを作成しております。
親要素にOnClickイベントを付与しているのですが、<input>に置き換わっている際には親要素のClickイベントは削除したいと考えております。
jQueryだと $(要素).off() にて対応可能かと思いますが、Reactではどのように実装すればいいのでしょうか?
該当のソースコード
React.js
1...省略 2export const ProjectContent = (props) => { 3 4 const history = useHistory(); 5 6 const [isEditTitle, setIsEditTitle] = useState(false); 7 const [title, setTitle] = useState(props.title) 8 9 // Click時にページ遷移 10 const handleClick = (id) => { 11 history.push("/hogehoge/" + id) 12 } 13 14 const handleDelete = (id, e) => { 15 e.stopPropagation(); 16 alert("削除してよろしいですか?") 17 deleteProject(id) 18 .then(p => { 19 props.setProject(p); 20 }) 21 .catch(e => { 22 throw new Error(e); 23 }); 24 } 25 26 const handleChangeTitle = (e) => { 27 e.stopPropagation(); 28 setIsEditTitle(true); 29 } 30 31 const handleChange = (e) => { 32 e.stopPropagation(); 33 setTitle(e.target.value); 34 } 35 36 const handleBlur = (id, e) => { 37 e.stopPropagation(); 38 if(e.target.name == "title") 39 { 40 const data = { "title": title }; 41 updateTitle(id, data) 42 .then(p => { 43 props.setProject(p); 44 setIsEditTitle(false); 45 }) 46 .catch(e => { 47 throw new Error(e); 48 }); 49 } 50 } 51 52 const renderTitle = () => { 53 return (isEditTitle) 54 ? <input type="text" name="title" value={ title } autoFocus={true} onChange={ (e) => handleChange(e) } onBlur={ (e) => handleBlur(props.id, e) } /> 55 : <p className="title">{ title }</p>; 56 } 57 58 return( 59 <div className="project" onClick={ () => handleClick(props.id) } > 60 <h2>{props.id}</h2> 61 <div className="title-wrap"> 62 <div className="caption"> 63 <p>タイトル</p> 64 <img src={ EditIcon } alt="編集アイコン" onClick={ (e) => handleChangeTitle(e) } /> 65 </div> 66 { renderTitle() } 67 </div> 68 <div className="desc-wrap"> 69 <div className="caption"> 70 <p>詳細</p> 71 <img src={ EditIcon } alt="編集アイコン" /> 72 </div> 73 <p className="description">{ props.description }</p> 74 </div> 75 <img src={ DeleteIcon } alt="削除アイコン" className="delete-icon" onClick={ (e) => handleDelete(props.id, e) } /> 76 </div> 77 ) 78}
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/03/25 06:16
2021/03/25 06:20
2021/03/25 06:26
2021/03/25 06:36 編集
2021/03/25 06:36
2021/03/25 06:39
2021/03/25 07:16 編集
2021/03/25 07:13
2021/03/25 07:23