如何从子组件调用父组件中的方法?
How to call methods in Parent component from Child component?
我有一个元素,一个名为 <NormalTextField/>
的子组件,但是如何从其父组件 <Home/>
调用方法 -- _handleFirstName
和 _handleLastName
?我试图让用户输入一个文本,它会被发送出去在 Reducer 中创建一个对象 user
,其中包含 firstName
和 lastName
.
在 <Home/>
我有以下内容:
_handleFirstName(event){
this.props.actions.updateFirstName(event.target.value)
}
_handleLastName(event){
this.props.actions.updateLastName(event.target.value)
}
render(){
return(
<NormalTextField
hint='Enter First Name'
onChange={this._handleFirstName.bind(this)}
value={this.props.user.firstName}
/>
<NormalTextField
hint='Enter Last Name'
onChange={this._handleLastName.bind(this)}
value={this.props.user.lastName}
/>
然后在我的元素中<NormalTextField/>
,
import React, { Component } from 'react'
import { TextField } from 'material-ui'
import { orange900 } from 'material-ui/styles/colors'
class TextFieldLabel extends Component {
static propTypes = {
hint: React.PropTypes.string,
onChange: React.PropTypes.func
}
_handle(event){
this.props.onChange(event.target.value)
}
render() {
var pr = this.props
var hint = pr.hint
var value = pr.value
return (
<TextField
hintText={hint}
onChange={this._handle.bind(this)}
value={value}
/>
)
}
}
export default NormalTextField
但是一旦用户输入文本,我就会收到以下错误:Uncaught: TypeError: Cannot read property 'value' of undefined
for _handleFirstName(event)
。我究竟做错了什么?这是正确的方法吗?子组件是否可以调用父组件的方法?
您遇到的问题是当 event.target.value
接受 event
时,您将 event.target.value
传递给 _handleFirstName
。您可以将 _handle 更改为:
_handle(event) {
this.props.onChange(event)
}
或者,理想情况下,您可以删除 NormalTextField
中的事件处理程序,直接使用 onChange 属性。
首先将绑定调用移至构造函数:
constructor() {
super();
this._handleFirstName = this._handleFirstName.bind(this);
this._handleLastName= this._handleLastName.bind(this);
}
_handleFirstName(event){
this.props.actions.updateFirstName(event.target.value)
}
_handleLastName(event){
this.props.actions.updateLastName(event.target.value)
}
// remove .bind(this) from your onChange
render(){
return(
<NormalTextField
hint='Enter First Name'
onChange={this._handleFirstName}
value={this.props.user.firstName}
/>
<NormalTextField
hint='Enter Last Name'
onChange={this._handleLastName}
value={this.props.user.lastName}
/>
将您的 NormalTextField 更改为:
class TextFieldLabel extends Component {
static propTypes = {
hint: React.PropTypes.string,
onChange: React.PropTypes.func
}
// _handle removed
render() {
var pr = this.props
var hint = pr.hint
var value = pr.value
return (
<TextField
hintText={hint}
onChange={this.props.onChange} // use prop directly
value={value}
/>
)
}
}
我有一个元素,一个名为 <NormalTextField/>
的子组件,但是如何从其父组件 <Home/>
调用方法 -- _handleFirstName
和 _handleLastName
?我试图让用户输入一个文本,它会被发送出去在 Reducer 中创建一个对象 user
,其中包含 firstName
和 lastName
.
在 <Home/>
我有以下内容:
_handleFirstName(event){
this.props.actions.updateFirstName(event.target.value)
}
_handleLastName(event){
this.props.actions.updateLastName(event.target.value)
}
render(){
return(
<NormalTextField
hint='Enter First Name'
onChange={this._handleFirstName.bind(this)}
value={this.props.user.firstName}
/>
<NormalTextField
hint='Enter Last Name'
onChange={this._handleLastName.bind(this)}
value={this.props.user.lastName}
/>
然后在我的元素中<NormalTextField/>
,
import React, { Component } from 'react'
import { TextField } from 'material-ui'
import { orange900 } from 'material-ui/styles/colors'
class TextFieldLabel extends Component {
static propTypes = {
hint: React.PropTypes.string,
onChange: React.PropTypes.func
}
_handle(event){
this.props.onChange(event.target.value)
}
render() {
var pr = this.props
var hint = pr.hint
var value = pr.value
return (
<TextField
hintText={hint}
onChange={this._handle.bind(this)}
value={value}
/>
)
}
}
export default NormalTextField
但是一旦用户输入文本,我就会收到以下错误:Uncaught: TypeError: Cannot read property 'value' of undefined
for _handleFirstName(event)
。我究竟做错了什么?这是正确的方法吗?子组件是否可以调用父组件的方法?
您遇到的问题是当 event.target.value
接受 event
时,您将 event.target.value
传递给 _handleFirstName
。您可以将 _handle 更改为:
_handle(event) {
this.props.onChange(event)
}
或者,理想情况下,您可以删除 NormalTextField
中的事件处理程序,直接使用 onChange 属性。
首先将绑定调用移至构造函数:
constructor() {
super();
this._handleFirstName = this._handleFirstName.bind(this);
this._handleLastName= this._handleLastName.bind(this);
}
_handleFirstName(event){
this.props.actions.updateFirstName(event.target.value)
}
_handleLastName(event){
this.props.actions.updateLastName(event.target.value)
}
// remove .bind(this) from your onChange
render(){
return(
<NormalTextField
hint='Enter First Name'
onChange={this._handleFirstName}
value={this.props.user.firstName}
/>
<NormalTextField
hint='Enter Last Name'
onChange={this._handleLastName}
value={this.props.user.lastName}
/>
将您的 NormalTextField 更改为:
class TextFieldLabel extends Component {
static propTypes = {
hint: React.PropTypes.string,
onChange: React.PropTypes.func
}
// _handle removed
render() {
var pr = this.props
var hint = pr.hint
var value = pr.value
return (
<TextField
hintText={hint}
onChange={this.props.onChange} // use prop directly
value={value}
/>
)
}
}