Phương thức gọi ReactJS


139

Tôi đang thực hiện bước đầu tiên trong ReactJS và cố gắng hiểu giao tiếp giữa cha mẹ và con cái. Tôi đang tạo mẫu, vì vậy tôi có thành phần cho các trường kiểu dáng. Và tôi cũng có thành phần cha mẹ bao gồm trường và kiểm tra nó. Thí dụ:

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!
    }
})

Có cách nào để làm điều đó. Và logic của tôi có tốt trong "thế giới" không? Cảm ơn vì đã dành thời gian cho tôi.

Câu trả lời:


153

Để làm điều này, bạn chuyển một cuộc gọi lại như một tài sản cho đứa trẻ từ cha mẹ.

Ví dụ:

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} />
        );
    }
});

Trong ví dụ trên, Parentcác cuộc gọi Childvới một thuộc tính của valueonChange. Các Childđổi lại liên kết với một onChangexử lý để một tiêu chuẩn <input />phần tử và vượt qua giá trị lên đến Parent's gọi lại nếu nó được xác định.

Kết quả ParentchangeHandlerphương thức của được gọi với đối số đầu tiên là giá trị chuỗi từ <input />trường trong Child. Kết quả là Parenttrạng thái của có thể được cập nhật với giá trị đó, khiến <span />phần tử của cha mẹ cập nhật với giá trị mới khi bạn nhập nó Childvào trường nhập của.


15
Tôi nghĩ rằng bạn cần phải ràng buộc chức năng cha mẹ trước khi truyền nó cho trẻ:<Child value={this.state.value} onChange={this.changeHandler.bind(this)} />
o01

19
@ o01 không, bạn không sử dụng vì tôi đang sử dụng tính React.createClassnăng tự động liên kết tất cả các phương thức thành phần. Nếu tôi đang sử dụng các lớp React es6 thì bạn cần phải liên kết nó (trừ khi bạn tự động ràng buộc trong hàm tạo, đó là điều mà nhiều người đang làm trong những ngày này để giải quyết vấn đề này)
Mike Driver

1
@MikeDriver Tôi thấy. Không biết điều này bị giới hạn trong các trường hợp sử dụng các lớp ECMAScript 6 (mà tôi là). Cũng không biết nhóm React khuyến nghị tự động ràng buộc trong hàm tạo.
o01

1
Tôi không biết nếu họ giới thiệu nó, nhưng nó dường như là một điều khá phổ biến tôi thấy. Nó có ý nghĩa với tôi hơn là đặt liên kết bên trong luồng kết xuất, lý do là .bindtrả về một hàm mới, vì vậy về cơ bản bạn đang tạo một hàm mới mỗi khi bạn chạy kết xuất. Điều này có thể tốt, nhưng nếu bạn liên kết trong hàm tạo thì bạn chỉ thực hiện điều này một lần cho mỗi phương thức thành phần tại thời điểm khởi tạo chứ không phải mỗi kết xuất. Đó là cách chọn nit ... nhưng tôi đoán là đẹp hơn về mặt kỹ thuật!
Mike Driver

1
@ DavidLy-Gagnon trong ví dụ này có thể không được xác định vì tôi chưa thêm isRequired trên propType. Nhưng vâng, bạn có thể làm điều đó hoặc chỉ kiểm tra xem nó đã được xác định hay chưa.
Mike Driver

51

Bạn có thể sử dụng bất kỳ phương thức cha mẹ. Đối với điều này, bạn nên gửi phương thức này từ cha mẹ của bạn cho con bạn như bất kỳ giá trị đơn giản. Và bạn có thể sử dụng nhiều phương pháp từ cha mẹ cùng một lúc. Ví dụ:

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} />);
    }
});

Và sử dụng nó cho Trẻ em như thế này (cho bất kỳ hành động hoặc vào bất kỳ phương thức con nào):

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
Rực rỡ trả lời. Không có ý tưởng nào bạn có thể chuyển các phương thức xuống như các đạo cụ như thế này, tôi đã sử dụng các ref để đạt được điều này!
Paul Redmond

1
Tôi nhận được cuộc gọi lại để được gọi bởi đứa trẻ nhưng ở đó this.propstrong cuộc gọi lại trở thành undefined.
khateeb

Bạn nên gửi cuộc gọi lại này từ cha mẹ đến con cái (cố gắng liên kết cuộc gọi lại này với this)
Vitaliy Andrusishyn

Xin chào Valentin Petkov. Chào mừng bạn
Vitaliy Andrusishyn

39

Cập nhật 2019 với phản ứng 16+ và ES6

Đăng bài này vì React.createClasskhông được phản hồi từ phiên bản 16 phản ứng và Javascript ES6 mới sẽ mang lại cho bạn nhiều lợi ích hơn.

Cha mẹ

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>
    )
  }

}

Đứa trẻ

import React, {Component} from 'react';

export default class Child extends Component {

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

Trẻ không quốc tịch được đơn giản hóa như hằng số ES6

import React from 'react';

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

}
export default Child;

Nhìn thấy 4 khoảng trắng thay vì 2 trong ES6 JS làm tôi buồn: '(
Bataleon

3

Truyền phương thức từ Parentthành phần xuống dưới dạng thành phần propcủa bạn Child. I E:

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

Sử dụng chức năng | | thành phần không quốc tịch

Thành phần phụ huynh

 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);
             }}
           />
        </>);
}

Thành phần con

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
Để thêm giá trị cho câu trả lời của bạn, hãy xem xét thêm một lời giải thích ngắn về những gì mã này làm.
Cray

Khi bạn nhấp vào nút trong thành phần con, sau đó gọi chức năng Thành phần cha mẹ thông qua các đạo cụ.
Omkesh Sajjanwar

1
Nếu hàm có tham số thì sao? Làm thế nào để bạn truyền các tham số cho cha mẹ?
alex351

Đúng! @ alex351 chúng ta có thể xử lý tình huống đó. Trong Thành phần con -> onClick = {props.handleParentFun ("YoureValue")} Trong Thành phần cha mẹ -> handleParentFun = {(value) => {console.log (); xử lýChildFun (giá trị); }}
Omkesh Sajjanwar

0

Phản ứng 16+

Thành phần con

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;

Thành phần phụ huynh

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;
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.