Могу ли я использовать matchPath без дочернего компонента?

Допустим, у меня есть этот компонент с myCurrentState со значением 0. И я хотел бы изменить его на 1, когда меня направляют на ConfirmComponent(/), и обратно на 0, когда меня направляют обратно на RootComponent(/confirm)

class MySpecialComponent extends Component {
  constructor() {
    super();
    ...
  }
}

state = {
  myCurrentState: 0,
};

<Router>
  <div>
    <Route
      path = "/"
      render = {() => <RootComponent />}
      exact
    />
    <Route path = "/confirm" render = {() => <ConfirmComponent />} />
  </div>
</Router>

Большинство примеров (matchPath, match), которые мне удалось найти, были примерами с добавлением кода в дочерние компоненты. Но хотелось бы сделать это все в этом основном MySpecialComponent компоненте.

Может ли кто-нибудь привести мне примеры, если это возможно, и если да, то как :)?

Есть ли причина, по которой вы не хотите добавлять код в дочерние компоненты? Если нет, вы можете вызвать функцию из дочернего элемента в конструкторе (переданную как опору из MySpecialComponent), чтобы изменить состояние

Marc Sloth Eastman 13.03.2019 16:15

Может быть, из-за того, что я все еще не знаю, как реагировать, но я не могу понять, как это сделать внутри ребенка, если у меня нет события onClick. Например, в RootComponent я использую <NavLink to = "/confirm"><button type = "button">Continue </button> </NavLink>... Мне показалось, что это не правильное место для добавления изменение состояния.

OFFLlNE 13.03.2019 16:23

Это просто странно, потому что я хочу знать путь внутри родителя, почему дочерний компонент должен заботиться о том, какой у меня текущий путь: D

OFFLlNE 13.03.2019 16:23

Можно ли иметь атрибут onClick внутри <button>, который находится внутри NavLink - если это нормальный способ, то мне, вероятно, придется пойти по этому пути

OFFLlNE 13.03.2019 16:26

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

Marc Sloth Eastman 13.03.2019 16:29
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Навигация по приложениям React: Исчерпывающее руководство по React Router
Навигация по приложениям React: Исчерпывающее руководство по React Router
React Router стала незаменимой библиотекой для создания одностраничных приложений с навигацией в React. В этой статье блога мы подробно рассмотрим...
Массив зависимостей в React
Массив зависимостей в React
Все о массиве Dependency и его связи с useEffect.
0
5
60
1

Ответы 1

Как мы обсуждали в комментариях, если у вас все в порядке с добавлением кода в дочерний элемент, это возможное решение.

class MySpecialComponent extends Component {
  constructor() {
    super();
    ...
  }

changeValue = (value) => {
  this.setState({myCurrentState: value});
}

state = {
  myCurrentState: 0,
};

render = () => <Router>
  <div>
    <Route
      path = "/"
      render = {() => <ConfirmComponent updateParentState = {() => this.changeValue(1)}/>}
      exact
    />
    <Route path = "/confirm" render = {() => <RootComponent updateParentState = {() => this.changeValue(0)} />} />
  </div>
</Router>;
}

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

В дочерних компонентах

class RootComponent extends Component {
  constructor(props){
    super(props)
    this.props.updateParentState(); //updates state of parent
  }
  ...
}
class ConfirmComponent extends Component {
  constructor(props){
    super(props)
    this.props.updateParentState(); //updates state of parent
  }
  ...
}

Попробую через минуту ;) Не смешанный :p Я просто использовал случайные имена, чтобы сделать его более общим :D Как в root и / и подтвердите с помощью /confirm

OFFLlNE 13.03.2019 17:16

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

OFFLlNE 13.03.2019 17:18

Здорово, это работает! :) Но теперь я понял, что не использую matchPath :D Является ли предложенный подход лучше, чем использование reactRouter match?

OFFLlNE 13.03.2019 17:33

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

Marc Sloth Eastman 13.03.2019 19:15

Другие вопросы по теме