ReactJS呼び出し親メソッド


140

私はReactJSで最初の一歩を踏み出し、親子間のコミュニケーションを理解しようとしています。私はフォームを作成しているので、フィールドをスタイリングするためのコンポーネントがあります。また、フィールドとチェックを含む親コンポーネントがあります。例:

var LoginField = React.createClass({
    render: function() {
        return (
            <MyField icon="user_icon" placeholder="Nickname" />
        );
    },
    check: function () {
        console.log ("aakmslkanslkc");
    }
})

var MyField = React.createClass({
    render: function() {
...
    },
    handleChange: function(event) {
//call parent!
    }
})

それを行う方法はありますか?そして私のロジックはreactjs "world"で良いのでしょうか?御時間ありがとうございます。

回答:


154

これを行うには、コールバックをプロパティとして親から子に渡します。

例えば:

var Parent = React.createClass({

    getInitialState: function() {
        return {
            value: 'foo'
        }
    },

    changeHandler: function(value) {
        this.setState({
            value: value
        });
    },

    render: function() {
        return (
            <div>
                <Child value={this.state.value} onChange={this.changeHandler} />
                <span>{this.state.value}</span>
            </div>
        );
    }
});

var Child = React.createClass({
    propTypes: {
        value:      React.PropTypes.string,
        onChange:   React.PropTypes.func
    },
    getDefaultProps: function() {
        return {
            value: ''
        };
    },
    changeHandler: function(e) {
        if (typeof this.props.onChange === 'function') {
            this.props.onChange(e.target.value);
        }
    },
    render: function() {
        return (
            <input type="text" value={this.props.value} onChange={this.changeHandler} />
        );
    }
});

上記の例では、ParentコールChildの特性を有するvalueonChange。そのChild代わりに、onChangeハンドラーを標準<input />要素にバインドし、Parent定義されている場合はその値をコールバックに渡します。

その結果、ParentchangeHandlerメソッドが呼び出され、最初の引数はの<input />フィールドからの文字列値になりChildます。その結果、Parentの状態がその値で更新され、親の<span />要素がChildの入力フィールドに入力すると新しい値で更新されます。


15
親関数を子に渡す前にバインドする必要があると思います:<Child value={this.state.value} onChange={this.changeHandler.bind(this)} />
o01

19
@ o01いいえ、React.createClassどの自動メソッドがすべてのコンポーネントメソッドをバインドするかを使用しているので、必要ありません。私がReact es6クラスを使用している場合は、それをバインドする必要があります(コンストラクターで自動バインドしていた場合を除き、多くの人がこれを回避するために最近行っていることです)
Mike Driver

1
@MikeDriverなるほど。これがECMAScript 6クラス(私)を利用するケースに限定されていることを知りませんでした。また、Reactチームがコンストラクターで自動バインディングを推奨することも認識していませんでした。
o01

1
彼らがそれをお勧めするかどうかはわかりませんが、私が目にするのはごく一般的なことのようです。レンダースレッド内にバインドを置くよりも私には理にかなっています。理由.bindは、新しい関数を返すからです。基本的に、レンダーを実行するたびに新しい関数を作成しています。これはおそらく問題ありませんが、コンストラクターでバインドする場合は、インスタンス化時にすべてのレンダリングではなく、コンポーネントメソッドごとに1回だけ行います。それはまさにピッキングです...しかし、技術的にはより良いと思います!
マイクドライバー

1
@ DavidLy-Gagnonの例では、propTypeにisRequiredを追加していないため、未定義になる可能性があります。ただし、そうすることも、定義されているかどうかを確認することもできます。
マイクドライバー

52

任意の親メソッドを使用できます。このためには、単純な値のように、このメソッドを親から子に送信する必要があります。また、親からの多くのメソッドを一度に使用できます。例えば:

var Parent = React.createClass({
    someMethod: function(value) {
        console.log("value from child", value)
    },
    someMethod2: function(value) {
        console.log("second method used", value)
    },
    render: function() {
      return (<Child someMethod={this.someMethod} someMethod2={this.someMethod2} />);
    }
});

そして、それを次のように子に使用します(アクションまたは子メソッドに):

var Child = React.createClass({
    getInitialState: function() {
      return {
        value: 'bar'
      }
    },
    render: function() {
      return (<input type="text" value={this.state.value} onClick={this.props.someMethod} onChange={this.props.someMethod2} />);
    }
});

1
素晴らしい答え。このような小道具としてメソッドを渡すことができるとは思いませんが、私はこれを達成するために参照を使用しています!
ポールレドモンド

1
子供からコールバックが呼び出されるようにしましたがthis.props、コールバックはになりundefinedます。
khateeb 2018

このコールバックは親から子に送信する必要があります(このコールバックをにバインドしてみてくださいthis
Vitaliy Andrusishyn

こんにちは、バレンティン・ペトコフ。ようこそ!
Vitaliy Andrusishyn

39

反応16+およびES6を使用した2019アップデート

これを投稿することReact.createClassはreactバージョン16から非推奨になり、新しいJavascript ES6はより多くの利点を提供します。

import React, {Component} from 'react';
import Child from './Child';
  
export default class Parent extends Component {

  es6Function = (value) => {
    console.log(value)
  }

  simplifiedFunction (value) {
    console.log(value)
  }

  render () {
  return (
    <div>
    <Child
          es6Function = {this.es6Function}
          simplifiedFunction = {this.simplifiedFunction} 
        />
    </div>
    )
  }

}

import React, {Component} from 'react';

export default class Child extends Component {

  render () {
  return (
    <div>
    <h1 onClick= { () =>
            this.props.simplifiedFunction(<SomethingThatYouWantToPassIn>)
          }
        > Something</h1>
    </div>
    )
  }
}

ES6定数として簡略化されたステートレスの子

import React from 'react';

const Child = () => {
  return (
    <div>
    <h1 onClick= { () =>
        this.props.es6Function(<SomethingThatYouWantToPassIn>)
      }
      > Something</h1>
    </div>
  )

}
export default Child;

ES6 JSで2つではなく4つのスペースが表示されると、悲しくなります: '(
Bataleon

3

Parentコンポーネントからメソッドをコンポーネントに渡しpropますChild。つまり:

export default class Parent extends Component {
  state = {
    word: ''
  }

  handleCall = () => {
    this.setState({ word: 'bar' })
  }

  render() {
    const { word } = this.state
    return <Child handler={this.handleCall} word={word} />
  }
}

const Child = ({ handler, word }) => (
<span onClick={handler}>Foo{word}</span>
)

2

関数の使用|| ステートレスコンポーネント

親コンポーネント

 import React from "react";
 import ChildComponent from "./childComponent";

 export default function Parent(){

 const handleParentFun = (value) =>{
   console.log("Call to Parent Component!",value);
 }
 return (<>
           This is Parent Component
           <ChildComponent 
             handleParentFun={(value)=>{
               console.log("your value -->",value);
               handleParentFun(value);
             }}
           />
        </>);
}

子コンポーネント

import React from "react";


export default function ChildComponent(props){
  return(
         <> This is Child Component 
          <button onClick={props.handleParentFun("YoureValue")}>
            Call to Parent Component Function
          </button>
         </>
        );
}

1
回答に価値を追加するには、このコードの機能に関する簡単な説明を追加することを検討してください。
クレイ

子コンポーネントのボタンをクリックすると、小道具を介して親コンポーネントへの呼び出し機能。
Omkesh Sajjanwar

1
関数にパラメータがある場合はどうなりますか?どのようにパラメーターを親に渡しますか?
alex351

はい!@ alex351はそのシナリオを処理できます。子コンポーネント内-> onClick = {props.handleParentFun( "YoureValue")}親コンポーネント内-> handleParentFun = {(value)=> {console.log(); handleChildFun(値); }}
Omkesh Sajjanwar

0

React 16+

子コンポーネント

import React from 'react'

class ChildComponent extends React.Component
{
    constructor(props){
        super(props);       
    }

    render()
    {
        return <div>
            <button onClick={()=>this.props.greetChild('child')}>Call parent Component</button>
        </div>
    }
}

export default ChildComponent;

親コンポーネント

import React from "react";
import ChildComponent from "./childComponent";

class MasterComponent extends React.Component
{
    constructor(props)
    {
        super(props);
        this.state={
            master:'master',
            message:''
        }
        this.greetHandler=this.greetHandler.bind(this);
    }

    greetHandler(childName){
        if(typeof(childName)=='object')
        {
            this.setState({            
                message:`this is ${this.state.master}`
            });
        }
        else
        {
            this.setState({            
                message:`this is ${childName}`
            });
        }

    }

    render()
    {
        return <div>
           <p> {this.state.message}</p>
            <button onClick={this.greetHandler}>Click Me</button>
            <ChildComponent greetChild={this.greetHandler}></ChildComponent>
        </div>
    }
}
export default  MasterComponent;
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.