gpt4 book ai didi

javascript - React Native如何将 this.setState 更改传递给父级

转载 作者:行者123 更新时间:2023-12-03 03:04:58 25 4
gpt4 key购买 nike

我是 React Native 的新手,我正在制作一个示例应用程序,用户可以在其中登录并注册新帐户。

我有两个 React 类,

一个是主类index.ios.js,另一个类称为register.js。在索引类中,我说如果变量寄存器为 true,则渲染寄存器屏幕。

在 register.js 类中,我尝试使用 this.setState({register:false}) 将变量 register 设置为 false,但它不会导致父级 (index.ios.js) 的重新渲染。是 super (状态)方法还是我缺少的类似方法?我相信父状态没有获取更新的寄存器变量的值。

这是我的类(class):

在index.ios.js内渲染:

render: function() {
if(this.state.register) {
return this.renderRegisterScreen();
}
else if (this.state.loggedIn) {
return this.userLoggedIn();
}
else {
return this.renderLoginScreen();
}
}

注册.js:

var React = require('react-native');
var {
AppRegistry,
StyleSheet,
Text,
View,
Image,
TouchableHighlight,
TextInput,
} = React;

var Register = React.createClass({
render: function() {
return (
<View style={styles.container}>
<View style={styles.rafitoImage}>
<Image source={require('./logo.png')}></Image>
<Text style={styles.slogan}>Eliminate the need to wait!</Text>
</View>
<View style={styles.bottomSection}>
<View style={styles.username}>
<View style={styles.inputBorder}>
<TextInput placeholder="Username..." style={styles.usernameInput} onChangeText={(text) => this.setState({username: text})}/>
</View>
<View style={styles.inputBorder}>
<TextInput password={true} placeholder="Password..." style={styles.usernameInput} onChangeText={(text) => this.setState({password: text})}/>
</View>
<View style={styles.inputBorder}>
<TextInput password={true} placeholder="Verify Password..." style={styles.usernameInput} onChangeText={(text) => this.setState({verifyPassword: text})}/>
</View>
<View style={styles.inputBorder}>
<TextInput placeholder="Phone.." style={styles.usernameInput} onChangeText={(text) => this.setState({phone: text})}/>
</View>
<View style={styles.inputBorder}>
<TextInput placeholder="Email.." style={styles.usernameInput} onChangeText={(text) => this.setState({email: text})}/>
</View>
<TouchableHighlight style={styles.button}
underlayColor='#f1c40f' onPress={this.register}>
<Text style={styles.buttonText}>Register</Text>
</TouchableHighlight>
<TouchableHighlight style={styles.signUp} onPress={this.resetToLogin}
underlayColor='#ffffff'>
<Text style={styles.signUpText}>Already A Member </Text>
</TouchableHighlight>
</View>
</View>
<View style={styles.copyright}>
</View>
</View>
);
},

resetToLogin: function() {
this.setState({
register: false //I want this to re render the home screen with the variable register as false
});
}
});

var styles = StyleSheet.create({
container: {
flex : 1
},
bottomSection: {
flex: 5,
flexDirection: 'row'
},
button: {
height: 36,
backgroundColor: '#32c5d2',
justifyContent: 'center',
marginTop: 20
},
buttonText: {
fontSize: 18,
color: 'white',
alignSelf: 'center'
},
signUpText: {
color: '#3598dc'
},
signUp: {
alignItems: 'flex-end',
marginTop: 10,
},
username: {
flex: 1,
padding: 5
},
rafitoImage: {
flex: 3,
justifyContent: 'center',
alignItems: 'center',
},
copyright: {
alignItems: 'center'
},
usernameInput: {
height: 36,
marginTop: 10,
marginBottom: 10,
fontSize: 18,
padding: 5
},
copyrightText: {
color: '#cccccc',
fontSize: 12
},
inputBorder: {
borderBottomWidth: 1,
borderBottomColor: '#ececec'
},
slogan: {
color: '#3598dc'
}
});

module.exports = Register;

尝试 1

根据答案,我将其添加到我的index.ios.js

renderRegisterScreen: function() {
return (
<Register login={this.login}/>
)
}

我将其添加到我的 register.js

<TouchableHighlight style={styles.signUp} onPress={this.props.login}
underlayColor='#ffffff'>
<Text style={styles.signUpText}>Already A Member </Text>
</TouchableHighlight>

但由于某种原因,它甚至不再进入注册屏幕,而是在注册屏幕呈现后立即执行登录功能。我现在缺少什么?请指教。

谢谢

更新

当我将其注册为属性(property)时,它会起作用,但当我不注册时,它就不起作用。我想了解为什么如果有人可以发布该内容。

谢谢

最佳答案

您可以将函数作为 props 传递给子级,然后以这种方式从子级内部设置父级的状态。

父组件:

   var Parent = React.createClass({

getInitialState() {
return {
registered: false
}
},

register(){
console.log("logging in... ");
this.setState({
registered: true
});

},

render: function() {
return (
<View style={styles.container}>
<Child register={this.register.bind(this)} registered={this.state.registered} />
{this.state.registered && <View style={{padding:10, backgroundColor:'white', marginTop:10}}>
<Text style={{fontSize:20}}>Congratulations, you are now registered!</Text>
</View>}
</View>
);
}
});

子组件:

var Child = React.createClass({

render: function() {
return(
<View style={{backgroundColor: 'red', paddingBottom:20, paddingTop:20 }}>
<TouchableHighlight style={{padding:20, color: 'white', backgroundColor: 'black'}} onPress={() => this.props.register() }>
{this.props.registered ? <Text style={{color: 'white'}}>registered</Text> : <Text style={{color: 'white'}}>register</Text>}
</TouchableHighlight>
</View>
)
}
})

关于javascript - React Native如何将 this.setState 更改传递给父级,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33720405/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com