ReactJS 调用父方法

IT技术 javascript reactjs
2021-04-08 00:20:50

我正在 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“世界”中是否良好?谢谢你的时间。

6个回答

为此,您将回调作为属性从父级传递给子级。

例如:

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具有valueand属性onChangeChild回报结合一个onChange处理程序,以一个标准的<input />元件,并传递值到Parent如果它定义的回调函数。

结果,ParentchangeHandler方法被调用,第一个参数是 中<input />字段的字符串值Child结果是Parent可以使用该值更新 的状态,从而导致父<span />元素在您在Child的输入字段中键入时使用新值进行更新

我不知道他们是否推荐它,但这似乎是我看到的很常见的事情。对我来说,这比将绑定放在渲染线程中更有意义,原因是.bind返回一个新函数,所以基本上每次运行渲染时都会创建一个新函数。这可能很好,但是如果您在构造函数中绑定,那么您在实例化时每个组件方法只执行一次,而不是每次渲染。这是吹毛求疵……但我猜技术上更好!
2021-05-23 00:20:50
我认为您需要先绑定父函数,然后再将其传递给子函数: <Child value={this.state.value} onChange={this.changeHandler.bind(this)} />
2021-06-03 00:20:50
@o01 不,你不知道,因为我正在使用React.createClasswhich auto 绑定所有组件方法。如果我使用的是 React es6 类,那么你需要绑定它(除非你在构造函数中自动绑定,这就是现在很多人为了解决这个问题而做的)
2021-06-14 00:20:50
@MikeDriver 我明白了。不知道这仅限于使用 ECMAScript 6 类(我就是)的情况。也不知道 React 团队建议在构造函数中自动绑定。
2021-06-19 00:20:50
@DavidLy-Gagnon 在示例中它可能未定义,因为我没有在 propType 上附加 isRequired。但是,是的,您可以这样做,也可以检查它是否已定义。
2021-06-19 00:20:50

2019 更新 React 16+ 和 ES6

发布此内容是因为React.createClassReact 版本 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 = (props) => {
  return (
    <div>
    <h1 onClick= { () =>
        props.es6Function(<SomethingThatYouWantToPassIn>)
      }
      > Something</h1>
    </div>
  )

}
export default Child;
@FerhiMalek,您只需在调用它时在子项的道具中传递父函数即可。在子组件中,您只需要指定接收道具参数
2021-06-08 00:20:50
这将是 props.es6Function 而不是 this.props.es6Function
2021-06-14 00:20:50
@SalmanShariati 如果我想从子组件调用父方法,使用功能/无状态组件而不是类,该怎么办。
2021-06-14 00:20:50

您可以使用任何父方法。为此,您应该像任何简单的值一样将这些方法从您的父母发送给您的孩子。并且您可以一次使用来自父级的多种方法。例如:

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

并像这样在 Child 中使用它(对于任何操作或任何子方法):

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} />);
    }
});
嗨,瓦伦丁·佩特科夫。欢迎!
2021-05-23 00:20:50
您应该将此回调从父级发送到子级(尝试将此回调与 绑定this
2021-05-26 00:20:50
精彩的回答。不知道您可以像这样将方法作为道具传递,我一直在使用 refs 来实现这一目标!
2021-05-27 00:20:50
我得到了孩子要调用的回调,但this.props在回调中变成了undefined.
2021-06-04 00:20:50

使用函数 || 无状态组件

父组件

 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>
         </>
        );
}
当您单击子组件中的按钮时,通过道具调用父组件功能。
2021-05-23 00:20:50
如果函数有参数怎么办?你如何将参数传递给父级?
2021-06-05 00:20:50
是的!@alex351 我们可以处理这种情况。在子组件中 --> onClick={props.handleParentFun("YoureValue")} 在父组件中 --> handleParentFun={(value)=>{ console.log(); handleChildFun(value); }}
2021-06-09 00:20:50
要为您的答案增加value,请考虑添加有关此代码功能的简短说明。
2021-06-13 00:20:50

Parent组件中的方法作为 aprop传递给您的Child组件。IE:

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