简体   繁体   English

在 React Native 中隐藏和显示组件

[英]Hide and Show Components in React Native

I dont understand how to hide and show Components dependet und a state. I came up with the following code, but i think its wrong, because the UI isnt being update after i press the "login" button.我不明白如何隐藏和显示依赖于 state 的组件。我想出了以下代码,但我认为它是错误的,因为在我按下“登录”按钮后 UI 没有更新。 Is there a general way to do this?有没有通用的方法来做到这一点? I also aks myself how to handle changing between "Dialogs".我也问自己如何处理“对话框”之间的变化。 For example i want that when a Button is clicked, that the current Dialog is closed and the target Dialog is renderd.例如,我希望当单击按钮时,关闭当前对话框并呈现目标对话框。 How could i do this?我怎么能这样做?

import React from 'react';
import { ImageBackground, StyleSheet, TouchableOpacity, Text, View, TextInput} from 'react-native';

function WelcomeScreen(props) {
   var loginDialog = {
      visible: false
};

var signUpDialog = {
    visible: false
};

var welcomeDialog = {
    visible: true
};

const login = loginDialog.visible ? (
    <View style={styles.loginDialog}>
        <TextInput style={styles.input}/>
    </View>
) : null;

const signup = signUpDialog.visible ? (
    <View style={styles.signUpDialog}>
        <TextInput style={styles.input}/>
    </View>
) : null;

const welcome = welcomeDialog.visible ? (
    <View style={styles.buttonContainer}>
            <TouchableOpacity onPress={changeState("login")}style={[styles.button, styles.login]}>
                <Text style={styles.text}>Log In</Text>
            </TouchableOpacity>
            <TouchableOpacity onPress={changeState("signup")} style={[styles.button, styles.signUp]}>
                <Text style={styles.text}>Sign Up</Text>
            </TouchableOpacity>
        </View>
) : null;

function changeState(mode){
    if(mode === "login"){
        console.log("Yes");
        welcomeDialog.visible = false;
        loginDialog.visible = true;
    }else if(mode === "signup"){
        welcomeDialog.visible = false;
        signUpDialog.visible = true;
    }
}

return (
    <ImageBackground style={styles.background}
        source={require('../assets/welcome_background.jpg')}>
       
        {login}

        {signup}

        {welcome}
        
    </ImageBackground>
);
}

export default WelcomeScreen;

Seems like you are new to react you should read about state https://reactjs.org/docs/state-and-lifecycle.html .好像你是新来的反应你应该阅读 state https://reactjs.org/docs/state-and-lifecycle.html You should use useState in functional component or setState in class component also I really recomend to use third party library for dialogs/modals.您应该在功能组件中使用 useState 或在 class 组件中使用 setState 我真的建议将第三方库用于对话框/模式。 https://github.com/mmazzarolo/react-native-dialog https://github.com/react-native-modal/react-native-modal https://github.com/mmazzarolo/react-native-dialog https://github.com/react-native-modal/react-native-modal

import React, {useState} from 'react';
import { ImageBackground, StyleSheet, TouchableOpacity, Text, View, TextInput} from 'react-native';

function WelcomeScreen(props) {
  const [loginDialog,setLoginDialog] = useState(false);
  const [signUpDialog ,setSignUpDialog ] = useState(false);
   const [welcomeDialog ,setWelcomeDialog ] = useState(false);

const login = loginDialog ? (
    <View style={styles.loginDialog}>
        <TextInput style={styles.input}/>
    </View>
) : null;

const signup = signUpDialog? (
    <View style={styles.signUpDialog}>
        <TextInput style={styles.input}/>
    </View>
) : null;

const welcome = welcomeDialog? (
    <View style={styles.buttonContainer}>
            <TouchableOpacity onPress={changeState("login")}style={[styles.button, styles.login]}>
                <Text style={styles.text}>Log In</Text>
            </TouchableOpacity>
            <TouchableOpacity onPress={changeState("signup")} style={[styles.button, styles.signUp]}>
                <Text style={styles.text}>Sign Up</Text>
            </TouchableOpacity>
        </View>
) : null;

const changeState = (mode) => {
    if(mode === "login"){
        console.log("Yes");
        setWelcomeDialog(false);
        setLoginDialog(true);
    }else if(mode === "signup"){
        setWelcomeDialog(false);
        setSignUpDialog(true);
    }
}

return (
    <ImageBackground style={styles.background}
        source={require('../assets/welcome_background.jpg')}>
       
        {login}

        {signup}

        {welcome}
        
    </ImageBackground>
);
}

export default WelcomeScreen;

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM