Я вижу, что вы меняете маршрут (с помощью реакции-маршрутизатора?).
Помните, что this.setState
это asyn c и указывает c для вашего компонента, когда вы вызываете this.props.history.push('/Pqr')
, возможно this.state.data
еще не обновлено.
Чтобы поделиться этими данными через разные routes
в одном и том же реактивном проекте, я действительно знаю, что вы можете:
Если это не так, и вы просто хотите передать свойство вниз или выше дерева иерархии, в дополнение к комментариям выше, возможно, это может помочь:
Как вы, вероятно, знаете, проекты реагирования составляются компонентов, которые объединены для работы определенным образом c. В приведенном ниже примере есть два компонента (отец и ребенок)
import React from 'react';
// We can say that this component is "below" Father
function Child(props) {
return (
<button>
Hey, I'm a button!
</button>
);
}
// We can say that this component is "above" Child
function Father(props) {
return (
<div>
<Child />
</div>
);
}
Я не смог найти в предоставленном коде / вопросе один компонент child
, может быть, вы забыли написать его?
Если ответ «да», я создам вымышленный компонент с именем ... FictionalComponent
(я гений!) И передам данные о состоянии как свойство с именем ... data
.
Чтобы передать это свойство, если это так, вам просто нужно обновить метод рендеринга, чтобы он выглядел следующим образом:
render() {
return (
<form >
<button
className="btn btn-info btn-sm"
onClick={this.handleClick}
style={{ whitespace: 'nowrap' }}
>
Launch
<FictionalComponent data={this.state.data} />
</button>
</form>
)
}
Таким образом, когда this.state.data
изменяется FictionalComponent
будет перерисовано с новым значением data
.
Но, возможно, вы захотите выполнить обратную операцию, и вам нужно будет передать this.state.data
компоненту выше Abc
, отображается там при нажатии кнопки.
Для ее достижения вам необходимо иметь компонент «Отец» для вашего Abc
, компонент «Отец» должен обеспечить обратный вызов onDataChanged
для захвата события. , Этот обратный вызов получит data
и обработает его.
В этом случае я создам еще один компонент, который будет выше вашим Abc
. Я назову это ... AboveAbcComponent
, идеально!
...
class AboveAbcComponent extends React.Component {
constructor(props) {
this.state = {
dataFromChild: null
};
this.onDataChanged = this.onDataChanged.bind(this);
}
onDataChanged(dataReceived) {
console.log("Yey! It works!");
this.setState({ dataFromChild: dataReceived });
}
render() {// Just the passed props changes here
...
<Abc
onDataChanged={this.onDataChanged}
/>
...
}
}
export default class Abc extends React.Component {
constructor(props) { ... } // No changes here
handleClick = (e) => {
e.preventDefault();
axios.get(url)
.then(res => {
this.setState({
data: res.data
});
this.props.onDataChanged(res.data);
this.props.history.push("/Pqr"); // I really didn't understand Why this push is here... but ok
})
};
render() { ... } // No changes here
}
Надеюсь, это поможет, весело провести время!