ReactNativeサブコントロールと親コントロールの間のメソッド呼び出し
4726 ワード
ReactNativeサブコントロールと親コントロールの間のメソッド呼び出し
親コントロールがMainであると仮定します。js、サブコントロールはJLTabBar.js
親コントロールのメソッドbtnClick
、 btn2Click
サブコントロールのメソッドbuttonClick
親コントロールがサブコントロールを呼び出す方法
親コントロールでサブコントロールにref="ref1"
を設定し、buttonクリックイベントを設定します.buttonクリックイベントでthis.refs.ref1.buttonClick()
を介してサブコントロールのメソッドを呼び出す
サブコントロール親コントロールを呼び出す方法
親コントロールにサブコントロールを埋め込むときに、サブコントロールにイベント属性を追加します.eg:
親コントロールにonPress={()=>this.btnClick()}
およびonClick={()=>this.btn2Click()}
イベントが追加されましたthis.btnClick()} onClick={()=>this.btn2Click()}/>
次いで、親コントロールのthis.props.onPress();
メソッドは、サブコントロールにおいて()=>this.btnClick()
によって呼び出される.親コントロールをthis.props.onClick();
で呼び出す()=>this.btn2Click()
メソッド
サンプルコード
親コントロールimport React , {Component} from 'React';
import {TabBar, Icon, Button, Text} from 'antd-mobile';
import {
Image,
View,
StyleSheet,
Dimensions,
} from 'react-native';
// TabBar
import JLTabBar from '../Widgets/JLTabBar'
//
const screenWidth = Dimensions.get('window').width;
const screenHeight = Dimensions.get('window').height;
export default class Main extends Component{
constructor(props) {
super(props);
this.state = {
selectedTab: 'redTab',
hidden: false,
users:[],
total_count:0
};
this.tabBarItemClick = this.tabBarItemClick.bind(this);
}
// TabBarItem
tabBarItemClick(){
let request_url = "http://localhost:4010";
fetch(request_url, {
method: 'POST',
headers: {
'Accept': 'application/json',
'Content-Type': 'application/json',
},
body: JSON.stringify({
user_id: '5d038ad0-8166-11e7-af91-0ba3d316ba53',
api_name: 'user.search_users',
})
}).then((response)=>response.json())
.then((responseJson)=>{
console.log({
responseJson
})
this.setState({
users:responseJson.response.datas,
total_count:responseJson.response.total_count
})
}).catch((error)=>{
console.error(error)
})
}
btnClick(){
console.log("btnClick ")
}
btn2Click(){
console.log("btn2Click ")
}
render(){
return(
{/* */}
{/* , onPress onClick */}
this.btnClick()} onClick={()=>this.btn2Click()}/>
)
}
}
const styles = StyleSheet.create({
container:{
height:Config.screenWidth,
width:Config.screenHeight
},
tabbarStyle:{
width:Config.screenHeight,
height:50,
marginBottom:0
}
})
サブコントロール/**
* Created by yuanjunliang on 2017/8/19.
*/
import React, {Component} from 'React';
import {
View,
StyleSheet
} from 'react-native';
import {TabBar, Icon} from 'antd-mobile';
export default class JLTabBar extends Component {
constructor(props) {
super(props);
this.state = {}
}
//
buttonClick() {
console.log("click ")
}
render() {
return (
{/* btnClick */}
{
this.props.onPress();
}}>
{/* btn2Click */}
{
this.props.onClick();
}}>
)
}
}
const styles = StyleSheet.create({
tabbarStyle:{
backgroundColor:"blue",
height:50,
width:300
}
})
this.btnClick()} onClick={()=>this.btn2Click()}/>
import React , {Component} from 'React';
import {TabBar, Icon, Button, Text} from 'antd-mobile';
import {
Image,
View,
StyleSheet,
Dimensions,
} from 'react-native';
// TabBar
import JLTabBar from '../Widgets/JLTabBar'
//
const screenWidth = Dimensions.get('window').width;
const screenHeight = Dimensions.get('window').height;
export default class Main extends Component{
constructor(props) {
super(props);
this.state = {
selectedTab: 'redTab',
hidden: false,
users:[],
total_count:0
};
this.tabBarItemClick = this.tabBarItemClick.bind(this);
}
// TabBarItem
tabBarItemClick(){
let request_url = "http://localhost:4010";
fetch(request_url, {
method: 'POST',
headers: {
'Accept': 'application/json',
'Content-Type': 'application/json',
},
body: JSON.stringify({
user_id: '5d038ad0-8166-11e7-af91-0ba3d316ba53',
api_name: 'user.search_users',
})
}).then((response)=>response.json())
.then((responseJson)=>{
console.log({
responseJson
})
this.setState({
users:responseJson.response.datas,
total_count:responseJson.response.total_count
})
}).catch((error)=>{
console.error(error)
})
}
btnClick(){
console.log("btnClick ")
}
btn2Click(){
console.log("btn2Click ")
}
render(){
return(
{/* */}
{/* , onPress onClick */}
this.btnClick()} onClick={()=>this.btn2Click()}/>
)
}
}
const styles = StyleSheet.create({
container:{
height:Config.screenWidth,
width:Config.screenHeight
},
tabbarStyle:{
width:Config.screenHeight,
height:50,
marginBottom:0
}
})
/**
* Created by yuanjunliang on 2017/8/19.
*/
import React, {Component} from 'React';
import {
View,
StyleSheet
} from 'react-native';
import {TabBar, Icon} from 'antd-mobile';
export default class JLTabBar extends Component {
constructor(props) {
super(props);
this.state = {}
}
//
buttonClick() {
console.log("click ")
}
render() {
return (
{/* btnClick */}
{
this.props.onPress();
}}>
{/* btn2Click */}
{
this.props.onClick();
}}>
)
}
}
const styles = StyleSheet.create({
tabbarStyle:{
backgroundColor:"blue",
height:50,
width:300
}
})