質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

React.js

Reactは、アプリケーションのインターフェースを構築するためのオープンソースJavaScriptライブラリです。

Q&A

解決済

1回答

3285閲覧

Reactで、クリックしてフォルダーの名前を変える機能を実装する

Yhaya

総合スコア439

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

React.js

Reactは、アプリケーションのインターフェースを構築するためのオープンソースJavaScriptライブラリです。

0グッド

0クリップ

投稿2019/11/30 13:43

実現したいこと

Reactで作ったWebアプリケーションで下のようにフォルダの一覧が見えているときに、「Untitled」という文字のところのダブルクリックで名前変更をしたいと思っています。具体的には、文字をダブルクリックしたときに「Untitled」の要素を<input type="txt">にして、名前を変更可能な状態に変えたいと思っています。
イメージ説明

このような機能を実装するためにはどのようなコードをかけばよいのでしょうか?

コード

フォルダーのアイコンと「Untitled」という文字を1つのPaperFolderというコンポーネントにまとめています。このコンポーネントは下のように定義しています。

javascript

1import React from 'react'; 2import List from '@material-ui/core/List'; 3import ListItem from '@material-ui/core/ListItem'; 4import ListItemText from '@material-ui/core/ListItemText'; 5import ListItemIcon from '@material-ui/core/ListItemIcon'; 6import Folder from '@material-ui/icons/Folder'; 7import Menu from '@material-ui/core/Menu'; 8import MenuItem from '@material-ui/core/MenuItem'; 9import Divider from '@material-ui/core/Divider'; 10import { withStyles } from '@material-ui/core/styles'; 11 12class PaperFolder extends React.Component { 13 constructor(props) { 14 super(props); 15 16 this.state = { 17 mouseX: null, 18 mouseY: null, 19 } 20 21 this.handleClick = this.handleClick.bind(this); 22 this.handleClose = this.handleClose.bind(this); 23 } 24 25 handleClick(event) { 26 event.preventDefault(); 27 this.setState({ 28 mouseX: event.clientX - 2, 29 mouseY: event.clientY - 4, 30 }) 31 } 32 33 handleClose() { 34 this.setState({ 35 mouseX: null, mouseY: null 36 }) 37 } 38 39 render() { 40 const { classes } = this.props; 41 return ( 42 <List className={classes.folder}> 43 <ListItem button className={classes.folder}> 44 <ListItemIcon> 45 <Folder /> 46 </ListItemIcon> 47 <div onContextMenu={this.handleClick}> 48 <ListItemText primary={this.props.name}/> 49 <Menu 50 keepMounted 51 open={this.state.mouseY !== null} 52 anchorReference="anchorPosition" 53 anchorPosition={ 54 this.state.mouseY !== null && this.state.mouseX !== null 55 ? {top: this.state.mouseY, left: this.state.mouseX}: undefined 56 } 57 > 58 <MenuItem>Rename</MenuItem> 59 <MenuItem>Delete</MenuItem> 60 <Divider /> 61 <MenuItem onClick={this.handleClose}>Close</MenuItem> 62 </Menu> 63 </div> 64 </ListItem> 65 </List> 66 ) 67 } 68} 69 70const styles = theme => ({ 71 folder: { 72 paddingBottom: 0, 73 paddingTop: 3, 74 }, 75}); 76 77 78export default withStyles(styles)(PaperFolder);

今は右クリックでコンテキストメニューを出して、その中のRenameをクリックすることで名前変更をしようと試みた後の状態になっておりますが、できれば上に書いたようにダブルクリックで変更可能な状態にしたいと思っています。

よろしくおねがいします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

状態ごとのDOMを変数に格納しておき、PropsやStateの値で表示させるDOMを分岐させることで解決できると思います。

例えば

JavaScript

1onClickButton() { 2 this.setState({ isEdit: true }); 3} 4 5render() { 6 const textElement = <input type="text" />; 7 const labelElement = ( 8 <Button 9 onClick={this.onClickButton.bind(this)} 10 /> 11 ); 12 return ( 13 <> 14 {this.state.isEdit ? textElement : labelElement} 15 </> 16 ); 17}

で、ボタンをクリックすると、ボタンがテキスト入力欄になるというコードになります。
(実際に動かしたコードではないので悪しからず・・・)

投稿2019/12/02 07:12

guissy-k

総合スコア245

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Yhaya

2019/12/02 14:52

ありがとうございます、まさに望んでいた動作です! これに関連してなのですが、テキストボックス以外の部分をクリックしたときに入力内容が確定するような振る舞いはどのように実現できるかはわかるでしょうか?
guissy-k

2019/12/03 01:16

細かい使い勝手にもよりますが、シンプルなUIとして2パターン例示させていただきます。 1)テキストボックスからカーソルが外れたタイミングで入力内容を確定したい場合は onBlur が使えます。inputタグに onBlur={処理} (ButtonのonClickと同じような感じ)を追加し、isEdit をfalseにする処理を書きます。 2)テキストボックスからカーソルが外れただけで確定するのはちょっと早すぎるかな、と思うのであれば、上記ソースで言うところのtextElementで<input>の他に新しいボタンも格納するようにし、クリック時に1)と同じく isEdit をfalseにする処理を追加します。
Yhaya

2019/12/03 07:16

丁寧なご回答ありがとうございます。解決しました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問