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

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

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

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

Q&A

解決済

2回答

5859閲覧

reactで別のコンポーネントからsetStateしたい

退会済みユーザー

退会済みユーザー

総合スコア0

React.js

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

0グッド

1クリップ

投稿2018/02/28 09:55

編集2018/02/28 10:24

前提・実現したいこと

今現在reactを触っているのですが、やりたいことができず困ってます。
あるコンポーネントから別のコンポーネントのstateの値を変更したいです。

該当のソースコード

boxComponent/boxComponent.jsx

react

1class boxComponent extends React.Component { 2 constructor(props) { 3 this.state = { 4 test: '' 5 } 6 } 7 render() { 8 ... 9 } 10}

formComponent/formComponent.jsx

react

1class formComponent extends React.Component { 2 render() { 3 return ( 4 <form> 5 <input type="text"></input> 6 <input type="submit" value="送信"></input> 7 </form> 8 ); 9 } 10}

やりたいこと

formComponent.jsxの送信ボタンを押したら入力内容をboxComponent.jsxのstateのtestの値を変更したいです。
できるのでしょうか?

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2018/02/28 09:59

componentAとcomponentBの関係は?親子関係なのか兄弟関係なのかとか。
退会済みユーザー

退会済みユーザー

2018/02/28 10:05 編集

別々のコンポーネントです。 説明が下手ですみません。。
退会済みユーザー

退会済みユーザー

2018/02/28 10:04

いや、どういう関係性なのかということを上で聞いていると思うのですが。
退会済みユーザー

退会済みユーザー

2018/02/28 10:11 編集

すみません。最近始めたばかりで理解が足りてません。 例えると boxComponent(親)/boxComponent.jsx(子) formComponet(親)/formComponet.jsx(子) みたいな感じなのです。
退会済みユーザー

退会済みユーザー

2018/02/28 10:11

説明付加な場合は掲載されている説明では回答するのに足りる情報がないので、とりあえず実際のコードに似せたようなコードを掲載すると回答つきやすいとおもいます
退会済みユーザー

退会済みユーザー

2018/02/28 10:13

すみません。ご指摘ありがとうございます。
karamarimo

2018/02/28 10:31

boxComponent(親)/boxComponent.jsx(子)というのは「boxComponent.jsx」というファイルにboxComponentというコンポーネントが定義されているということですか?teratailorさんが聞きたかったのはboxComponentとformComponetの関係だと思います。親子関係や兄弟関係というのが理解できないのでしょうか。
退会済みユーザー

退会済みユーザー

2018/02/28 10:38

回答しようにも回答できないですね
退会済みユーザー

退会済みユーザー

2018/02/28 10:43 編集

わかりづらくてすみません。全く別のコンポーネントです。 boxComponent/component1.jsx boxComponent/component2.jsx component1.jsxとcomponent2.jsxの関係は兄弟。 boxComponent/component.jsx(親) boxComponent/header/component.jsx(子) boxComponent/component.jsxとboxComponent/header/component.jsxは親子関係。 という認識であってますでしょうか? 今回の場合は boxComponent/boxComponent.jsx formComponent/formComponent.jsx boxComponent.jsxとformComponent.jsxは別のコンポーネント
退会済みユーザー

退会済みユーザー

2018/02/28 10:40

別なのはわかってるんです。こちらこそすみません。諦めました。
karamarimo

2018/02/28 14:25

watadon111さん もしかしてフォルダ構成のことだと誤解されていますか?そうではなく、コンポーネント間の論理的な関係のことです。あるコンポーネントAのrender関数の中でコンポーネントBが使われているときAはBの親であるということです。
退会済みユーザー

退会済みユーザー

2018/03/02 02:03 編集

karamarimoさん ご丁寧にありがとうございます! そう誤解してました。すみません。 となるとboxComponent.jsxが親、formComponent.jsxが子になります!
guest

回答2

0

ベストアンサー

親子関係でも、兄弟関係でも、ましてや姉妹でも従兄弟でも甥でも姪でも叔父でも叔母でも曾祖父母でも夜叉孫でも会ったことが一度も無い親戚の人でもない、まったくの赤の他人であるコンポーネント同士でやり取りする場合は、何らかの方法でコンポーネント自体を渡す必要があります。

ということでサンプルを作ってみました。(CodeSandbox初めて使ったけど、回答のサンプル作るにはいいですね。)
teratail 115532 への回答 - CodeSandbox

BoxComponent.js

JavaScript

1import React from "react"; 2 3export default class BoxComponent extends React.Component { 4 constructor(props) { 5 super(props); 6 this.state = { 7 test: "" 8 }; 9 } 10 11 handleSubmit = event => { 12 event.preventDefault(); 13 this.setState({ test: event.target.test.value }); 14 }; 15 16 render() { 17 return <p>{this.state.test}</p>; 18 } 19}

FormComponent.js

JavaScript

1import React from "react"; 2 3export default class formComponent extends React.Component { 4 render() { 5 return ( 6 <form onSubmit={this.props.box.handleSubmit}> 7 <input type="text" name="test" /> 8 <input type="submit" value="送信" /> 9 </form> 10 ); 11 } 12}

index.

JavaScript

1import React from "react"; 2import { render } from "react-dom"; 3import BoxComponent from "./BoxComponent"; 4import FormComponent from "./FormComponent"; 5 6const box = render(<BoxComponent />, document.getElementById("box")); 7render(<FormComponent box={box} />, document.getElementById("form"));

ReactDOM.renderは作成したコンポーネントの参照(reference)を返します。これを利用して、BoxComponentを先に作り、できあがったコンポーネントをFormComponentへprops.boxとして渡しています。こうすれば、FormComponentでもBoxComponentのメソッドが使用できるようになります。他にもトップレベルに全体を管理するObjectを作っておいて、そこにrefを入れていくという手段もあります。とにかく、トップレベルで受け渡しすればなんとかなります。

さて、この方法が良いものかという、あまりオススメしません。stateが分散し、複雑化していった場合、破綻する可能性が高いからです。Reactはstateを用いてある程度は状態管理できますが、コンポーネント毎に状態が分散されてしまうため、複雑な状態を管理するには少々無理があります。より高度になる場合は、Redux等のFluxなライブラリや他のフレームワークの採用を検証した方が良いでしょう。

ただ、一番良いのは、単に親子関係や兄弟関係にしてしまうことです。親で状態を管理すれば良いだけになりますから。

投稿2018/02/28 14:02

raccy

総合スコア21735

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

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

0

質問内容を正しく理解しているかわかりませんが、あるコンポーネントの中に別のコンポーネントが内包されていて、内包されているコンポーネント内のボタンがクリックされると、親のコンポーネントのstateが更新させるためにはどうすれば良いのかという質問であることを前提にサンプルコードを書いてみました。

Demo

イメージ説明
https://codesandbox.io/s/0530m6lrv

Sample Code

import React, { Component, Fragment } from 'react'; import { render } from 'react-dom'; const Child = (props) => { return ( <button onClick={props.onButtonClick}> Click </button> ); } class Parent extends Component { state = { isClicked: false }; handleChildButtonClick = (event) => { this.setState((prevState) => { return { isClicked: !prevState.isClicked } }); } render() { return ( <Fragment> <Child onButtonClick={this.handleChildButtonClick} /> <p> { this.state.isClicked ? 'clicked!' : 'not clicked yet...' } </p> </Fragment> ) } } render(<Parent />, document.getElementById('root'));

投稿2018/02/28 10:34

編集2018/02/28 10:35
HayatoKamono

総合スコア2415

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問