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

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

新規登録して質問してみよう
ただいま回答率
85.47%
React.js

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

Q&A

解決済

1回答

4450閲覧

reactでhover or clickしたときhtmlを作成,削除したい

dossy

総合スコア109

React.js

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

2グッド

1クリップ

投稿2019/11/24 09:47

編集2019/11/24 10:01

イメージ説明
twitterのこんな感じのものをreactで作りたいと思っています。

やりたい条件:

clickすると、htmlが作成。作られたhtmlも押すことができる。別のところを押すと、htmlを消すことができる。
これのhover versionも作成してみたい。mouseoverとmouseleave。

現状:
イメージ説明
現状はこんな感じです。今は、mouseoverで作成している。

解決したいこと:

htmlを作成はできたのですが、mouseleaveしたときor再度clickしたときにhtmlを無くしたい(削除したい)のですが、やり方がわかりません。
何か、解決策をご教授願いたいです!!
reactに関しては超初学者です。m(._.)m

<!-- index.html --> <!DOCTYPE html> <html> <head> <meta charset="UTF-8" /> <title>React Tutorial</title> <script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react.js"></script> <script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react-dom.js"></script> <script src="https://cdnjs.cloudflare.com/ajax/libs/babel-core/5.8.34/browser.min.js"></script> <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/2.2.0/jquery.min.js"></script> </head> <body> <div id="root"></div> <div id="content"></div> <script type="text/babel"> //ここにコードが入ります class Hov extends React.Component { constructor(props) { super(props); this.state = { //define state value: null, }; } createhtml() { //function return ( <div class="down"> <div>aaa</div> <div>bbb</div> <a href="#">333</a> </div > ) } render() { var html = this.createhtml() return ( <div class="contents"> <div class="up"> <button onMouseOver={() => this.setState({ value: html })}>押して </button> </div> {this.state.value} </div > ) } } ReactDOM.render( < Hov />, document.getElementById('action') ) // ここにコードが入ります</script> <div id="action" style="height:80px;width:50px"></div> </body> </html>
dameo, kaiyu_fish👍を押しています

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

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

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

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

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

guest

回答1

0

ベストアンサー

こんにちは

このような場合、よくやる手としては、<div class="down">・・・</div>の部分を子コンポーネントとして切り出して、それを render する対象に含めるか否かというフラグを親コンポーネントの this.stateに持たせ、このフラグをthis.setState(・・・) でトグルするという方法です。

以下、サンプルコードです。以下では、子コンポーネントを DownPart という(関数型の)コンポーネントとし、表示・非表示のフラグを this.state.displayingDown としています。

jsx

1const DownPart = () => ( 2 <div class="down"> 3 <div>aaa</div> 4 <div>bbb</div> 5 <a href="#">333</a> 6 </div > 7) 8 9 10class Hov extends React.Component { 11 constructor(props) { 12 super(props) 13 this.state = { displayingDown: false } 14 } 15 16 displayDownPart = () => { 17 this.setState({ displayingDown: true }) 18 } 19 20 undisplayDownPart = () => { 21 this.setState({ displayingDown: false }) 22 } 23 24 toggleDownPart = () => { 25 const { displayingDown } = this.state 26 this.setState({ displayingDown: !displayingDown }) 27 } 28 29 render() { 30 const { displayingDown } = this.state 31 return ( 32 <div class="contents"> 33 <div class="up"> 34 <button 35 type="button" 36 onMouseOver={this.displayDownPart} 37 onMouseOut={this.undisplayDownPart} 38 onClick={this.toggleDownPart} 39 > 40 押して 41 </button> 42 </div> 43 {displayingDown && <DownPart />} 44 </div> 45 ) 46 } 47} 48 49ReactDOM.render( 50 <Hov />, 51 document.getElementById('action') 52)

以上、参考になれば幸いです。

追記

別の方法を挙げます。

<div class="down">・・・</div> の表示、非表示を切り替えられるようにすることが目的であるとすると、この部分のDOMは常に展開されているようにして、この divの CSS style displayblock またはnone に切り替えるという方法も考えられます。

以下はそのサンプルです。

投稿2019/11/24 10:56

編集2019/11/24 21:04
jun68ykt

総合スコア9058

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

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

dossy

2019/11/30 03:57

ありがとうございます。 どうもhoverで作られたhtmlを選択できなかったので、jqueryでやることにしました。 また、reactはやはり基礎がわかっていなかったので勉強します。
jun68ykt

2019/11/30 07:41

どういたしまして。 > また、reactはやはり基礎がわかっていなかったので勉強します。 そうですね。それが良いかもしれません。 jQuery慣れしているところからReact使いになるには、ひとつ飛び越えなければならない、考え方のハードルみたいなものがあるように思われます。健闘をお祈り申し上げます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問