как awoid 2 раза повторно рендеринг в реагирующем нативном - PullRequest
0 голосов
/ 28 мая 2020

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

Я использую redux, и вот мой "useeffect" в mainrouter. js

// currentUser : null // in  initialState for users

useEffect(() => {
    if(states.currentUser== null)
    {
        console.log("Checking user for routing");
        actions.getCurrentUserACT();
    }
    else{
        console.log("Logged in")
    }
},[]);

мой mainrouter. js return

 return (
    <NavigationContainer>
        {
            states.currentUser == null ?
                (this.SignStackScreen()) :
                (this.MainTabNavigator())
        }
    </NavigationContainer>
);

вот мой метод getCurrentUserAct в действиях redux

export function getCurrentUserACT() {
return function (dispatch) {

    firebase.auth().onAuthStateChanged(user => {
        if (user) {
            console.log("User authed..");
            dispatch({type:actionTypes.CURRENT_USER,payload:user})
        } else {
            console.log("User notauthed..");
            dispatch({type:actionTypes.CURRENT_USER,payload:null})
        }
    });
}

enter image description here

при запуске моего приложения журналы ... (если я входил в систему раньше)

  • Проверка пользователя для маршрутизации
  • Пользователь авторизован
  • Пользователь авторизован

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

так как я могу этого избежать? есть ли способ запустить метод раньше из useeffect и избежать второй рендер? или ждать данные в использовании эффект?

Ответы [ 2 ]

0 голосов
/ 29 мая 2020
export function getCurrentUserACT() {
return function (dispatch) {

    firebase.auth().onAuthStateChanged(user => {
        dispatch(setCurrentUserACT(user))
        console.log("control point" + user);
        // if (user) {
        //     console.log("User authed..");
        //     dispatch({type:actionTypes.CURRENT_USER,payload:user})
        // } else {
        //     console.log("User notauthed..");
        //     dispatch({type:actionTypes.CURRENT_USER,payload:null})
        // }
    });
}

Журналы были двойными

  • Проверка пользователя на маршрутизацию
  • контрольная точка [объект-объект]
  • контрольная точка [объект-объект]

______________________ Отредактировано 31.05 ______________________

Я немного изменил свой код, как показано ниже

const dispatch = useDispatch();
const currentUser = useSelector(state => state.currentUserReducer);
useEffect(() => {
    console.log(JSON.stringify(currentUser));
    if (currentUser == null) {
        console.log("Checking user for routing");
        //dispatch(getCurrentUserACT());
    }
    else {
        console.log("Logged in")
    }
}, []);

Я нашел что-то вроде подсказки, но не могу исправить, потому что я не знаю, когда запускается приложение журналы:

  • null
  • Проверка пользователя на маршрутизацию

Я не отправлял getCurrentUserAct (), поэтому журналы правильные. Если я отправлю, пользователь будет проверять (пользователь уже вошел в систему), выполнять повторную визуализацию компонентов, и вот двойные журналы от двойной визуализации.

Мне нужна отправка до использования эффекта, а не использования эффекта

Есть ли путь?

0 голосов
/ 28 мая 2020

Ваш код выглядит правильно, и нет причин регистрировать два раза из-за useEffect, потому что вы использовали его как componentDidMount, поэтому он вызывается один раз.

Причина регистрации два раза - это фрагмент кода:

firebase.auth().onAuthStateChanged(user => {

здесь onAuthStateChanged - это обратный вызов, который вызывается при изменении состояния аутентификации в Firebase. Если вы собираетесь проверить, вошел ли пользователь в систему, вам нужно избегать действий, описанных ниже

if (user) { }

Попробуйте console.log (пользователь) и проверьте, сохраняет ли пользователь то же самое при двойном входе в систему. Я считаю, что внутренние свойства пользователя будут изменены.

Надеюсь, это поможет вам понять

...