如何在 React Native 中从 child 组件回调到 parent 组件
How to get callback from child component to parent component in React Native
我一直在努力 react-native 以获取从 child 到 parent 的回调。下面是我的实现代码片段:
MainView.js
import React, { Component } from 'react';
import {
StyleSheet,
View,
Text,
Image,
TouchableHighlight,
FlatList,
Dimensions,
} from 'react-native';
import ListCell from './ListCell';
import {displayAlert} from './CustomAlert';
type Props = {
};
let winSize = Dimensions.get('window');
export default class MainView extends Component<Props> {
_keyExtractor = (item, index) => { return(index.toString());};
_renderItem = ({item, index}) => {
return (<ListCell
item={item}
index={index}
onPressItem={this._onPressItem}
/>);
};
_onPressItem = (item,index) => {
console.log("Pressed row : "+index);
displayAlert();
// this.props.navigation.navigate('Detail',{item: item});
};
render() {
return(
<FlatList
style={styles.flatListStyle}
data={this.props.listing}
keyExtractor={this._keyExtractor}
renderItem={this._renderItem}
/>
);
}
}
FlatList 的列表单元格组件是:
ListCell.js
import React, {PureComponent} from 'react';
import {
StyleSheet,
TouchableHighlight,
View,
Image,
Text,
} from 'react-native'
export default class ListCell extends PureComponent {
_onPress() {
this.props._onPressItem(this.props.item,this.props.index);
}
render() {
const item = this.props.item;
const price = item.price_formatted.split(' ')[0];
return (
<TouchableHighlight
style={styles.listCellContainer}
onPress={this._onPress}
underlayColor='#dddddd'>
<View >
<View style={styles.rowContainer}>
<Image style={styles.thumb} source={{uri:item.img_url}}/>
<View style={styles.textContainer}>
<Text style={styles.price}>{price}</Text>
<Text style={styles.title}>{item.title}</Text>
</View>
</View>
</View>
</TouchableHighlight>
);
}
}
此代码在单个文件中声明时可以正常工作,但在两个不同的文件中分开时,它会给出一个错误,指出点击单元格时 this.props._onPressItem
未定义。
我遵循了以下 https://medium.com/@ruthmpardee/passing-data-between-react-components-103ad82ebd17 方法,但也没有成功
任何建议都会有所帮助。
快速查看了您的代码。这是我发现的。
export default class ListCell extends PureComponent {
_onPress() {
this.props.onPressItem(this.props.item,this.props.index); //Change: passing prop onPressItem and calling _onPressItem
}
render() {
const item = this.props.item;
const price = item.price_formatted.split(' ')[0];
return (
<TouchableHighlight
style={styles.listCellContainer}
onPress={this._onPress} //Try: Also bind the event () => this._onPress()
underlayColor='#dddddd'>
<View >
<View style={styles.rowContainer}>
<Image style={styles.thumb} source={{uri:item.img_url}}/>
<View style={styles.textContainer}>
<Text style={styles.price}>{price}</Text>
<Text style={styles.title}>{item.title}</Text>
</View>
</View>
</View>
</TouchableHighlight>
);
}
}
您的道具名为 onPressItem,没有下划线。
this.props.onPressItem(this.props.item, this.props.index);
...您应该将函数本身传递给您的组件 onPress 方法,而不是 return 值。也是...
onPress={() => this._onPress}
...而不是...
onPress={this._onPress}
你可以这样使用
此代码适用于您的父组件
class ParentComponent extends Component {
onPressButtonChildren(data){
console.log(data)
//press button chilldre
}
render(){
return(
<ListChildren data={this.props.data} fnPressButton={this.onPressButtonChildren.bind(this)}/>
)
}
}
export default ParentComponent
这是您的子组件和手柄按钮的代码
const ListChildren = (props) => {
const {price, title, image} = props.item
const onPress = () => props.fnPressButton(props.item)
return (
<TouchableHighlight
style={styles.listCellContainer}
onPress={onPress} //Try: Also bind the event () => this._onPress()
underlayColor="#dddddd"
>
<View>
<View style={styles.rowContainer}>
<Image style={styles.thumb} source={{ uri: img_url }} />
<View style={styles.textContainer}>
<Text style={styles.price}>{price}</Text>
<Text style={styles.title}>{title}</Text>
</View>
</View>
</View>
</TouchableHighlight>
);
};
export default ListChildren
我一直在努力 react-native 以获取从 child 到 parent 的回调。下面是我的实现代码片段:
MainView.js
import React, { Component } from 'react';
import {
StyleSheet,
View,
Text,
Image,
TouchableHighlight,
FlatList,
Dimensions,
} from 'react-native';
import ListCell from './ListCell';
import {displayAlert} from './CustomAlert';
type Props = {
};
let winSize = Dimensions.get('window');
export default class MainView extends Component<Props> {
_keyExtractor = (item, index) => { return(index.toString());};
_renderItem = ({item, index}) => {
return (<ListCell
item={item}
index={index}
onPressItem={this._onPressItem}
/>);
};
_onPressItem = (item,index) => {
console.log("Pressed row : "+index);
displayAlert();
// this.props.navigation.navigate('Detail',{item: item});
};
render() {
return(
<FlatList
style={styles.flatListStyle}
data={this.props.listing}
keyExtractor={this._keyExtractor}
renderItem={this._renderItem}
/>
);
}
}
FlatList 的列表单元格组件是:
ListCell.js
import React, {PureComponent} from 'react';
import {
StyleSheet,
TouchableHighlight,
View,
Image,
Text,
} from 'react-native'
export default class ListCell extends PureComponent {
_onPress() {
this.props._onPressItem(this.props.item,this.props.index);
}
render() {
const item = this.props.item;
const price = item.price_formatted.split(' ')[0];
return (
<TouchableHighlight
style={styles.listCellContainer}
onPress={this._onPress}
underlayColor='#dddddd'>
<View >
<View style={styles.rowContainer}>
<Image style={styles.thumb} source={{uri:item.img_url}}/>
<View style={styles.textContainer}>
<Text style={styles.price}>{price}</Text>
<Text style={styles.title}>{item.title}</Text>
</View>
</View>
</View>
</TouchableHighlight>
);
}
}
此代码在单个文件中声明时可以正常工作,但在两个不同的文件中分开时,它会给出一个错误,指出点击单元格时 this.props._onPressItem
未定义。
我遵循了以下 https://medium.com/@ruthmpardee/passing-data-between-react-components-103ad82ebd17 方法,但也没有成功 任何建议都会有所帮助。
快速查看了您的代码。这是我发现的。
export default class ListCell extends PureComponent {
_onPress() {
this.props.onPressItem(this.props.item,this.props.index); //Change: passing prop onPressItem and calling _onPressItem
}
render() {
const item = this.props.item;
const price = item.price_formatted.split(' ')[0];
return (
<TouchableHighlight
style={styles.listCellContainer}
onPress={this._onPress} //Try: Also bind the event () => this._onPress()
underlayColor='#dddddd'>
<View >
<View style={styles.rowContainer}>
<Image style={styles.thumb} source={{uri:item.img_url}}/>
<View style={styles.textContainer}>
<Text style={styles.price}>{price}</Text>
<Text style={styles.title}>{item.title}</Text>
</View>
</View>
</View>
</TouchableHighlight>
);
}
}
您的道具名为 onPressItem,没有下划线。
this.props.onPressItem(this.props.item, this.props.index);
...您应该将函数本身传递给您的组件 onPress 方法,而不是 return 值。也是...
onPress={() => this._onPress}
...而不是...
onPress={this._onPress}
你可以这样使用 此代码适用于您的父组件
class ParentComponent extends Component {
onPressButtonChildren(data){
console.log(data)
//press button chilldre
}
render(){
return(
<ListChildren data={this.props.data} fnPressButton={this.onPressButtonChildren.bind(this)}/>
)
}
}
export default ParentComponent
这是您的子组件和手柄按钮的代码
const ListChildren = (props) => {
const {price, title, image} = props.item
const onPress = () => props.fnPressButton(props.item)
return (
<TouchableHighlight
style={styles.listCellContainer}
onPress={onPress} //Try: Also bind the event () => this._onPress()
underlayColor="#dddddd"
>
<View>
<View style={styles.rowContainer}>
<Image style={styles.thumb} source={{ uri: img_url }} />
<View style={styles.textContainer}>
<Text style={styles.price}>{price}</Text>
<Text style={styles.title}>{title}</Text>
</View>
</View>
</View>
</TouchableHighlight>
);
};
export default ListChildren