redux не обновляет состояния в компоненте

#reactjs #redux #react-router-dom

#reactjs #redux #react-router-dom

Вопрос:

Из приведенного ниже кода, если я удалю переменную routes из code1 и перейду к коду code2, я не столкнусь с какой-либо проблемой. но если я прокомментирую переменную code2 routes и буду работать с code1, я столкнусь с проблемой, что, когда я нажимаю на кнопку отправки Auth.js file или /auth маршрут (без или с выборомлюбой ингредиент из маршрута / burgerBuilder . когда пользователь нажимает на кнопку отправки Auth.js file .он отправит действие аутентификации в хранилище redux, чем отправит authStart, чем после получения ответа от firebase, чем мы отправим authSuccess, который изменяет токен и некоторые другие данные в redux. тогда эти изменения будут перенаправлять все компоненты, у которых есть состояние объекта аутентификации в их mapStateToProps. но токен не обновляется в mapStateToProps в Auth.js файл
, где я ошибаюсь .

полный код вы можете проверить по ссылке ниже [1]: https://codesandbox.io/s/goofy-kowalevski-mos8f?fontsize=14amp;hidenavigation=1amp;theme=dark

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

 

    class App extends Component {
      
      render(){

      //console.log("App.js");
      
//code1::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::


      let routes ;

      routes = (
        <Switch>      
          <Route path="/auth"    component={Auth}/>
          <Route path="/" exact component={BurgerBuilder} />
        </Switch>);
      
        if(this.props.token)
        {
          routes = (
            <Switch>      
              <Route path="/checkout"    component={Checkout} />
              <Route path="/orders" component={Orders} />
              <Route path="/logout" component={Logout} />
              <Route path="/" exact component={BurgerBuilder} />
            </Switch>);
        }

        
//::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

//code2:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
        routes = (
          <Switch>      
            <Route path="/auth"    component={Auth}/>
            <Route path="/checkout"    component={Checkout} />
              <Route path="/orders" component={Orders} />
              <Route path="/logout" component={Logout} />
            <Route path="/" exact component={BurgerBuilder} />
          </Switch>);
        //::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

        return (
          <div>
            <Layout>
              {routes}
            </Layout>
          </div>
        );
      }

      componentDidMount() {
        this.props.onAuthCheck();
      }
      
    }

    const mapStateToProps = (state)=>{
      return {
        token:state.auth.token
      }
    }


    const mapDispatchToProps = (dispatch) => {
      return{
        onAuthCheck:() =>dispatch(authCheckState()) //when try to auto signin
      }
    }

    export default withRouter(connect(mapStateToProps,mapDispatchToProps)(App));
 Run code snippetHide resultsExpand snippet


 

то, что я уже пробовал -> я последовал за вопросом о stackoverflow, в котором говорилось, что это из-за не обновленных react и react-dom .я застрял в нем с 12 часов.
заранее спасибо.

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

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

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

Ответ №1:

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

еще немного информации и приведите больше ясности.—>

я знаю, что компонент Link или NavLink связан с маршрутом.

но как это на самом деле связано, но на самом деле происходит то, что происходит.компонент link является внутренним тегом привязки, когда вы нажимаете на него, он изменяет ваш URL.если ваш URL-адрес изменяется, это означает, что он изменяет ваше свойство url-адреса свойства match объекта prop.и в react мы знаем, что если какое-либо изменение prop вызывает повторное отображение.когда он повторно отображает соответствующий маршрут, путь которого совпадает с URL, отобразите компонент в его компонентных реквизитах.

//////////////////////////////////////////////////////////////////////////////////////////

из документации react-router .

Сопоставители маршрутов -> Есть два компонента сопоставления маршрутов: коммутатор и маршрут. Когда a отображается,{*** он выполняет поиск по своим дочерним элементам, чтобы найти тот, путь к которому соответствует текущему URL. Когда он находит один, он отображает его и игнорирует все остальные ***}. Это означает, что вы должны поместить s с более конкретными (обычно более длинными) путями перед менее конкретными.

Если совпадений нет, ничего не отображается (null).

//////////////////////////////////////////////////////////////////////////////////////////