@alexsteadfast
I am noob

Почему не срабатывают роуты в реакте?

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

Код

import React, { Component } from 'react'
import PropTypes from 'prop-types';
import { GET , DEL , EDIT} from '../constants/Api'


import {
  BrowserRouter as Router,
  Switch,
  Route,
  Link
} from "react-router-dom";

/**
     * Компонент приложения, который отвечает за отрисовку данных с сервера
     * @component
     * @function {component , id} del - Тип отпрвляемого запроса
       * @param {object} component - Объект компонента, 
            который передается в запрос, для последующего обновления.
       * @param {string} id - Идентификатор элемента.
     */

function TaskItem(that) {
  return <div>
                      <span className='task__title'>
                        Задача №{ that.item.id }
                      </span>
                      <span className='task__discr'>
                        { that.item.title }
                      </span>
                      <div className='task__btn-block'>
                        <button className='task__item-del'
                          onClick={
                            that.component.del.bind(
                              that.component,
                              that.item.id
                            )
                          }
                        > 
                        </button>
                        <button className='task__item-edit'
                          onClick={
                            that.component.edit.bind(
                              that.component,
                              that.item.id,
                              that.item.title
                            )
                          }
                        >  
                        </button>
                       </div> 
                    </div>;
}

export default class Api extends Component {
  constructor() {
    super(...arguments);
    
    const {
      store
    } = this.props
    this.state = {
      data: ''
    }
    this.unsubscribe = store.subscribe(() => {
      this.setState(store.getState());
    });

  }
  componentDidMount() {
    
    const {
      store
    } = this.props
    const {
      setApi
    } = this.props

    store.dispatch({
      type: GET,
      data: {
        'store':store,
        'Component' : this
      }
    })
    
  }

  del(id , component) {
    
    this.props.store.dispatch({
      type: DEL,
      data: {
        'Component' : this ,
        'id': id
      }
    })
  }

  edit(id , title , component ) {
    let newTitle = prompt("Напишите новое описание задачи", title);
    this.props.store.dispatch({
      type: EDIT,
      data: {
        'Component' : this ,
        'title': newTitle,
        'id': id
      }
    })
  }

  render() {
    if(this.state.data.length == undefined){
      return <div className='overlay'>
        <div className='lds-ripple'>
          <div></div>
          <div></div>
        </div>
      </div>
    }else if (this.state.data.length == 0){
        return <div>Нет данных</div>
    }else {
      return <Router>
          <Switch>
            <Route path="/">
              {
                    this.state.data.map(item => 
                      <Link className='task__item' 
                            to={ "/task/" + item.id }
                      >
                        <TaskItem item={item} component={this}/>
                      </Link>  
                    )
                  } 
            </Route>
            <Route path="/task/:id">
              Topics 
              <Link to="/">На главную</Link>
            </Route>
          </Switch>
      </Router>
    }  
  }
}
  • Вопрос задан
  • 522 просмотра
Решения вопроса 1
search
@search
мама говорит что я особенный
Потому что роут "/" срабатывает раньше чем "/task/:id". Поменяйте их местами и проблема исчезнет. Реактовский роутер жадно выбирает все роуты, которые подходят по маске. Роут "/" наименее специфичный, поэтому будет срабатывать всегда.

Для того чтоб подобной проблемы не возникало, необходимо расставлять роуты от более специфичным к менее, например "/a/b" -> "/a" -> "/".

Так же можно добавлять роутам атрибут "exact". Тогда роутер будет выбирать точное совпадение, а не вхождение.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы