【问题标题】:Error importing context with React native使用 React native 导入上下文时出错
【发布时间】:2021-07-18 03:55:03
【问题描述】:

我正在学习在 React native 中使用上下文,实际上我正在关注一个博客,其中定义了如何在任何具有 React 和 Navigation 的应用程序中使用 createContext 和 useContext 进行身份验证逻辑。 在博客中没有定义如何导入类 AuthService 并在另一个组件中使用上下文,我有一个错误,因为当我尝试在我的导航器页面或登录页面中导入它们时函数和状态不存在。

代码:

AuthService.tsx

import React, {createContext, useState, useEffect} from 'react'
import AsyncStorage from '@react-native-community/async-storage'

const AuthContext = createContext({});

const AuthProvider = ({ children }) => {
   const [auth, setAuthState] = useState({});

   useEffect(() => {
     GetLogedUser();
   }, []);

   const GetLogedUser=async()=> {
     try {
        let userData = await AsyncStorage.getItem("userloged"|| {});
        let data = JSON.parse(userData);
        return data;
      } catch (error) {
        console.log("Something went wrong", error);
        setAuthState({});
        return null;
      }
   }

   const LoginUser=async(AuthData)=>{
     try{
        //many code omited...
        if(response.status==200 && json.response === true && json.error===""){
            let authUser = {id : json.data.id, nick: AuthData.nick, services: json.data.services };
            await AsyncStorage.setItem("userloged", JSON.stringify(authUser));
            setAuthState(authUser);
            return "OK";
        }
        else{
            return "Error response Login Service - "+ json.error; 
        }
     }catch(err){
        return "Error connecting or timeout service."; 
     }
   }

   return (
     <AuthContext.Provider value={{ auth, LoginUser }}>
      {children}
     </AuthContext.Provider>
   );
 }

 export { AuthContext, AuthProvider };

Navigator.tsx(auth导入状态如何使用?)

import React, {useContext} from 'react'
import { createStackNavigator } from '@react-navigation/stack'
import Login from '../Views/Login'
import Home from '../Views/Home'
import {AuthContext} from '../Services/Auth/AuthService'

const Stack = createStackNavigator();

const Navigator= (props) =>{
  const { auth } = useContext(AuthContext);

  return (
        <Stack.Navigator>
            {auth.id ? // <-- error undefined is not and object
                (<>    
                    <Stack.Screen name="Home" component={Home} options={{headerShown:false}}/>
                </>)
            :   (<>  
                    <Stack.Screen name="Login" component={Login}  options={{headerShown:false}}/>
                    <Stack.Screen name="Register" component={Register} options={{title:'Register.'}}/>                        
                </>)
            }
        </Stack.Navigator>
    );
 }

 export default Navigator;

Login.tsx(LoginUser导入函数如何使用???)

//..another imports omited
import {AuthContext} from '../Services/Auth/AuthService'

const Login=(props)=>{
   const {LoginUser} = useContext(AuthContext); //<---how here?
   const {navigation, users} = props;
   const [userName, setUserName] =useState('');
   const [password, setPassword] =useState('');

   return(
    <View style={styles.container}>
            <View style={styles.middleContainer}>
                <TextInput placeholder="Username..." defaultValue={userName} onChangeText={txt=> setUserName(txt)} style={styles.txtInputsLog}/>
                <TextInput placeholder="Password..." defaultValue={password} onChangeText={txt=> setPassword(txt)} style={styles.txtInputsLog} secureTextEntry={true}/>
                <Button primary style={styles.btnLogin} onPress={async ()=> await ValidateFields(userName, password) ? navigation.navigate('Home') : null}> 
                    <Text style={styles.txtLogin}>Login</Text> 
                </Button>            
            </View>     
    </View>
  );

  async function ValidateFields(userName:string, password:string){
    let result = await LoginUser({nick:userName, password: password}); //<--Error LoginUser is not a function
    return result==="OK" ? true: false;
  }
}

export default Login;

【问题讨论】:

    标签: react-native import navigation use-context createcontext


    【解决方案1】:

    你能说明你在哪里导入和使用你的&lt;AuthProvider /&gt;吗?

    您似乎没有使用您的&lt;AuthProvider /&gt; 组件。 因此,您可以尝试用您的&lt;AuthProvider /&gt; 包装您的Navigator 组件,如下所示:

    <AuthProvider>
        <Navigator />
    </AuthProvider>
    
    

    在您的代码示例中,您只是创建了一个 AuthProvider 挂钩,导入了它的数据,但您没有将代码放入上下文中。 因此,为了使上下文充分发挥作用,需要将需要该上下文的组件包装在其中。

    【讨论】:

    • 在两个页面中,我都导入如下: import {AuthContext} from '../Services/Auth/AuthService'
    • 您需要使用您的&lt;AuthProvider /&gt; 包装您的代码,并且您可以使用您的AuthContext 访问数据。换句话说,你需要用&lt;AuthProvider&gt; 组件包装你的代码
    • 你能举个例子吗?请
    • 但是如何在登录页面使用 LoginUser 功能呢?
    • 由于登录页面是在 Navigator 组件中实例化的,所以它可能会工作。
    猜你喜欢
    • 1970-01-01
    • 2018-03-05
    • 1970-01-01
    • 2018-12-19
    • 1970-01-01
    • 2019-10-18
    • 1970-01-01
    • 2021-03-30
    • 1970-01-01
    相关资源
    最近更新 更多