我有以下登录屏幕,在将react-ative
更新为0.60.4
之前工作正常。
interface OwnProps {
navigation: any
}
interface StateProps {
isLoggedIn: boolean,
isAuthenticating: boolean
}
interface DispatchProps {
actions: {
auth: {
authenticate: (username: string, password: string) => Promise<void>
}
}
}
type Props = OwnProps & StateProps & DispatchProps
interface State {
username: string,
password: string,
error?: string,
fadeAnim: Animated.Value
}
class LoginScreen extends Component<Props, State> {
static propTypes = {
isLoggedIn: PropTypes.bool.isRequired,
isAuthenticating: PropTypes.bool.isRequired,
actions: PropTypes.shape({
auth: PropTypes.object
})
}
state: State = {
username: '',
password: '',
error: null,
fadeAnim: new Animated.Value(1)
}
keyboardDidShowListener: EmitterSubscription
keyboardDidHideListener: EmitterSubscription
constructor(props) {
super(props)
this._onLogin = this._onLogin.bind(this)
this._handleUsernameChange = this._handleUsernameChange.bind(this)
this._handlePasswordChange = this._handlePasswordChange.bind(this)
}
componentDidMount() {
this.keyboardDidShowListener = Keyboard.addListener('keyboardDidShow', this._keyboardDidShow)
this.keyboardDidHideListener = Keyboard.addListener('keyboardDidHide', this._keyboardDidHide)
}
componentWillUnmount(): void {
this.setState({
username: '',
password: null,
error: null,
fadeAnim: new Animated.Value(1)
})
this.keyboardDidShowListener.remove()
this.keyboardDidHideListener.remove()
}
_keyboardDidShow = (): void => {
Animated.timing(
this.state.fadeAnim,
{
toValue: 0,
duration: 500
}
).start()
}
_keyboardDidHide = (): void => {
Animated.timing(
this.state.fadeAnim,
{
toValue: 1,
duration: 500
}
).start()
}
_onLogin = (): void => {
dismissKeyboard()
if (this.isFormValid()) {
this.props.actions.auth.authenticate(this.state.username, this.state.password)
.catch((error: Error) => {
const message: string = error ? error.message : 'Si e\' verificato un errore.'
this.setState({ error: message })
Toast.error(error.message)
})
}
}
isFormValid(): boolean {
this.setState({ error: null })
if (!this.state.username || this.state.username === '') {
this.setState({ error: 'Username non valido.' })
Toast.error('Username non valido.')
return false
}
if (!this.state.password || this.state.password === '') {
this.setState({ error: 'Password non valida.' })
Toast.error('Password non valida.')
return false
}
return true
}
_handleUsernameChange = (username: string) => {
this.setState({ username })
}
_handlePasswordChange = (password: string) => {
this.setState({ password })
}
render(): JSX.Element {
const { fadeAnim } = this.state
return (
<Content
padder
style={styles.content}
contentContainerStyle={styles.contentContainer}
keyboardShouldPersistTaps='always'
keyboardDismissMode='on-drag'
>
<TouchableWithoutFeedback onPress={dismissKeyboard}>
<View style={styles.contentContainer}>
<Spinner visible={this.props.isAuthenticating} textContent={'Accesso in corso...'} textStyle={{color: 'white'}} />
<Animated.View style={[styles.logosContainer, { opacity: fadeAnim }]}>
<Image
style={styles.logo}
source={require('../../assets/logo.png')}
/>
</Animated.View>
<Form style={styles.form}>
<Item floatingLabel error={this.state.error ? true : false}>
<Label>Username</Label>
<Input
autoCapitalize='none'
autoCorrect={false}
value={this.state.username}
onChangeText={this._handleUsernameChange}
/>
</Item>
<Item floatingLabel error={this.state.error ? true : false}>
<Label>Password</Label>
<Input
autoCapitalize='none'
autoCorrect={false}
secureTextEntry
value={this.state.password}
onChangeText={this._handlePasswordChange}
/>
</Item>
</Form>
{/*this.state.error ? (<FormMessage message={this.state.error} />) : null*/}
<Button block success style={styles.loginButton} onPress={this._onLogin}>
<Text>Accedi</Text>
</Button>
</View>
</TouchableWithoutFeedback>
</Content>
)
}
}
[...]
export default connect(mapStateToProps, mapDispatchToProps)(LoginScreen)
更新后,当我尝试输入用户名或密码时,会抛出以下expection:
不变冲突:超过了最大更新深度。当组件重复调用componentWillUpdate或componentDidUpdate内部的setState时,会发生这种情况。React限制嵌套更新的数量,以防止无限循环。
我在这里阅读了许多关于堆栈溢出和互联网的问题,但似乎没有什么可以解决这个问题。
有人能帮我吗?
不知道为什么,升级到最新的< code>react-navigation版本后,一切又正常了。
在卸载和销毁组件之前立即调用组件WillUnmount()。在此方法中执行任何必要的清理,例如使计时器无效、取消网络请求或清理在compentDidMount()
中创建的任何订阅。
您不应该在组件中调用 setState()
因为
组件永远不会重新呈现。卸载组件实例后,将永远不会再次挂载该实例。
你可以删除setState()
中的组件WillUnmount()
componentWillUnmount(): void {
this.keyboardDidShowListener.remove()
this.keyboardDidHideListener.remove()
}
我有从另一个类设置我的状态的功能,但我收到了以下错误 超过最大更新深度。当组件在componentWillUpdate或componentDidUpdate内重复调用setState时,可能会发生这种情况。React限制嵌套更新的数量,以防止无限循环。 这是我的代码,看起来像 ... ... ... 有人能帮忙吗?
const[number, setNum]=useState(0);当我想添加和更改它时,我收到了这个错误(setNum(number 1))。我的错误:超过了最大更新深度。当组件在组件WillUpdate或组件DiUpdate中重复调用setState时,可能会发生这种情况。React限制嵌套更新的数量以防止无限循环。我能做些什么来解决这个问题?
我有这个错误,以前也没有过:这是错误的图像“不变量冲突:超过最大更新深度”。当组件在componentWillUpdate或componentDidUpdate内重复调用setState时,可能会发生这种情况。React限制嵌套更新的数量,以防止无限循环。 此错误位于:Connect中(位于LoginForm.js:75) 我不知道为什么是错误,有人能帮忙吗? 这是我的代码:
我遇到一个错误: 超过了最大更新深度。当组件重复调用componentWillUpdate或componentDidUpdate内部的setState时,会发生这种情况。React限制嵌套更新的数量,以防止无限循环。 我的代码是: 我有另一个使用路由器切换页面的组件,以及一个包含登录页面的邮件组件。
我有以下组件:- 我得到了错误:- 我怀疑它必须对多次调用setState的Submit按钮(onClick)做一些事情,但是我似乎无法解决问题。 因此,我有以下问题:- 如何修复点击()? 我想点击开始游戏按钮,然后触发 并 这样我就可以填满套牌,套牌1和套牌2。有没有办法做到这一点?目前,我已经创建了一个这取决于正在填充的甲板,这是用钩子做的正确方法吗? 谢谢你的帮助和时间!
尝试在基本应用程序中包含 react-table,该应用程序在字段中接受输入,在字段内容更改时将其存储在组件状态中,然后在按下按钮时从 Github 获取数据。 在我加上线之前一切正常 该页面可以正常加载,但是当输入字段改变时(即你在其中输入),应用程序崩溃并显示错误: 错误:超过了最大更新深度。当组件重复调用componentWillUpdate或componentDidUpdate内部的set