Рекомендации по обработке потока проверки подлинности в react native

#reactjs #react-native

#реагирует на #реагировать-родной

Вопрос:

У меня есть собственное приложение react, и я реализую поток аутентификации, используя Context API природу приложения, когда пользователь открывает его, он не запрашивает вход или регистрацию, и пользователь может просматривать экраны приложений, однако, когда пользователь добавляет товары в корзину и собирается оформить заказ, ему будет предложено войти/зарегистрироваться, чтобы продолжить.

давайте предположим, что это экраны

 Home-gt; shop -gt; cart   

поэтому, когда пользователю в корзине будет предложено войти в систему, после входа в систему значение пользователя в поставщике контекста будет обновлено, и они продолжат с того же экрана, на который вошел пользователь (который в данном случае является экраном корзины). Однако, когда значение поставщика обновлено, все экраны снова отображаются и перенаправляются на начальный маршрут, который является начальным экраном. как я могу справиться с этим сценарием, который не будет повторно отображать весь экран снова.

В моем приложении я передаю навигацию, застрявшую в качестве дочерней, поставщику контекста следующим образом:

 lt;AuthProvidergt;  lt;Routes /gt; lt;/AuthProvidergt;  

а вот код поставщика контекста: authProvider.js:

 export const AuthContext = createContext();  export const AuthProvider = ({ children }) =gt; {    const [user, setUser] = useState(null);  const value = useMemo(  () =gt; ({ user, setUser }),  [user]);    return (  lt;AuthContext.Provider   value={{  value,  login: async (email, password) =gt; {  //here i am validating the login details and update user state   // if login successful   setUser(/*some data related to user */)  //when i set user data here it re-render all screens again  // if login failed   setUser(null)  }  }}gt;   {children}  lt;/AuthContext.Provider gt;  

и следующие Маршруты.js, который я передаю как дочерний код в вышеприведенный код:

 const Routes = () =gt; {   const { value } = useContext(AuthContext);    // validate token with backend useEffect(() =gt; {  setTimeout(async () =gt; {  const Token = await AsyncStorage.getItem('Token');  if (Token === null) {  value.setUser(null)  } else {  await axios.get(URL, {  headers: { 'x-auth-token': Token },  }).then(async (res) =gt; {  const {data} = res;  value.setUser(data)   }).catch(async (err) =gt; {  if (err.response) {  await AsyncStorage.removeItem('Token');  value.setUser(null)  }  });  }  }, 1000)   }, []);     return (  lt;gt;  lt;NavigationContainergt;  //this is the stuck where i have the three screen mentioned above (home, shop, cart)  lt;AppStuckScreen /gt;  lt;/NavigationContainergt;  lt;/gt;    ) }  export default Routes;  

На экране корзины я проверяю пользовательские значения, сохраненные в поставщике контекста, если они равны нулю, затем открываю форму входа в систему.

Я надеюсь, что кто-нибудь может помочь мне в том, как справиться с этой ситуацией, когда не нужно повторно отображать все компоненты снова при обновлении пользовательского значения в поставщике контекста.

Ответ №1:

Почему бы вам не сохранить текущий экран в контексте? Поэтому после успешного входа в систему вы просто переходите на этот экран.

Комментарии:

1. эй, я думаю, вы меня неправильно поняли, на самом деле пользователь даже до входа в систему все еще может перейти на экран корзины, но затем при оформлении заказа он должен войти в систему. если я сделал то, что вы мне сказали, то после входа в систему пользователь не сможет посетить экран магазина после аутентификации !

2. Я отредактировал исходный ответ.

3. спасибо, из вашего ответа следует, что вы имеете в виду сохранение последнего маршрута, по которому я вошел в систему, и повторную навигацию после входа в систему?