Реакция: чтение данных, переданных как параметр в history.push

Я новичок в реакции, и я пытаюсь отправить некоторые данные в качестве параметра в history.push.

В основном я вызываю метод нажатием кнопки, а внутри метода я вызываю api. Если я получаю успешный ответ, я перенаправляюсь на другую страницу, и мне также нужно передать некоторые данные.

Ниже мой код для этого:

class Login extends Component  {

  constructor(props) {
    super(props);
    this.state = {
      enteredName: null,
      enteredPwd: null,
      rescode: null,
      userName: null,
      formatDesc: null,
      userFormat : null,
      success: false,
      responseJson : null,
    };
  }

  state = {
    enteredName: null,
    enteredPwd: null,
    rescode: null,
    userName: null,
    formatDesc: null,
    userFormat : null,
    success: false,
    responseJson : null,
  }
    render=() =>{

        return (
          <Router>
          <div id= "login-page">
            <div className="back-image" style={{height:"100vh"}}>
              <div className="container">
                <form className="form-login" action="index.html">
                  <h2 className="form-login-heading">sign in now</h2>
                  <div className="login-wrap">
                    <label>User ID</label>
                    <input type="text" ref="usrname" className="form-control" placeholder="User ID" autofocus/>
                    <br/>
                    <label>Password</label>
                    <input type="password" ref = "password" className="form-control" placeholder="Password"/>
                    <br/>
                    <a  className="btn btn-theme btn-block" onClick={this.login.bind(this)}><i className="fa fa-lock mr-10"/>SIGN IN</a>
                    <Dialog ref={(component) => { this.dialog = component }} />
                  </div>
                </form>
              </div>
            </div>
          </div>
          </Router>
        );

}
login = (e) => {
  e.preventDefault();

  fetch('some url', {
    method: 'POST',
    body: JSON.stringify({
      "userId": this.refs.usrname.value,
      "password": this.refs.password.value
    })
  })
    .then((response) => response.json())
    .then((responseJson) => {
      console.log(`response: ` , responseJson)
      if (responseJson.errorCode === '00') {
        this.setState({ rescode: responseJson.errorCode })
        this.setState({ userName: responseJson.userName })
        this.setState({ formatDesc: responseJson.formatDesc });
        this.setState({userFormat : responseJson.userFormat});
        this.setState({success : true});
        this.setState({responseJson: responseJson});
        this.props.history.push(
          '/Taskactive',
          {
            role_id : this.userFormat,
            userName : this.userName
          }
        );
      }
      else {
        alert("Error Logging in.." + responseJson.errorMsg);
        this.refs.usrname.value = "";
        this.refs.password.value = "";
      }

    })
    .catch((error) => {
      console.error(error);
    });

  this.refs.usrname.value = "";
  this.refs.password.value = "";
}

так что до сих пор все в порядке, но теперь мне нужно прочитать переданные данные, то есть role_id и userName на следующей странице, то есть Taskactive. Итак, как мы можем прочитать эти данные в Taskactive.jsx?


person Molly    schedule 08.02.2019    source источник


Ответы (3)


Хорошо, после 4 дней борьбы и размышлений над ответами Луны и Юпитер-Эми, вот что сработало для меня:

внутри Login.jsx

this.props.history.push({
          pathname : '/Taskactive',
          state :{
          role_id : responseJson.userFormat,
          userName : this.userName,
          userid: this.refs.usrname.value
          }
          } 
        );

и в Taskactive.jsx

this.props.location.state.role_id

Надеюсь, это поможет кому-то в будущем.

person Molly    schedule 13.02.2019

изменить это

this.props.history.push(
          '/Taskactive',
          {
            role_id : this.userFormat,
            userName : this.userName
          }
        );

к этому:

this.props.history.push({
          pathname: '/Taskactive',
          appState: {
            role_id : this.userFormat,
            userName : this.userName
          }
        });

И внутри компонента, который вы визуализируете для path / Taskactive, вы можете получить доступ к значениям как this.props.location.appState.role_id или this.props.location.appState.userName. Вы также можете изменить имя объекта (которое у меня есть хранится как состояние) по вашему желанию.

Надеюсь это поможет.

person JupiterAmy    schedule 11.02.2019
comment
Привет, Чандрани, Пожалуйста, попробуйте сейчас, произошла синтаксическая ошибка. Я обновил свой ответ сейчас. - person JupiterAmy; 11.02.2019
comment
Я получаю TypeError: не удается прочитать свойство role_id для undefined, когда я пытаюсь прочитать в Taskactive.jsx, например alert (getroles called + this.props.location.appState.role_id); - person Molly; 12.02.2019
comment
проверьте в своем инструменте разработки реакции, есть ли у вас appState, доступный в качестве опоры внутри местоположения. - person JupiterAmy; 12.02.2019

если это компонент, отображаемый с помощью response-router, переданный материал находится внутри свойств компонента.

console.log(this.props.match.params)

из того, что я вижу, у вас неправильная конфигурация маршрутизатора. Логин должен быть дочерним по отношению к <Router>, а не контейнерным маршрутизатором.

Пример конфигурации:

<Router>
  <Switch>
    <Route exact path="/" component={Login} />
    <Route path="/login" component={Login} />
    <Route path="/signup" component={Signup} />
    <Route path="/restore-password" component={RestorePass} />
    <Route path="/forgot-password" component={ForgotPass} />
  </Switch>
</Router>
person Luna    schedule 08.02.2019
comment
Я пробовал читать role_id в Taskactive.jsx, например this.props.role_id, но в ответ получаю undefined - person Molly; 08.02.2019
comment
@ChandraniChatterjee нет, это не this.props.role_id. его под this.props.match.params. console.log, и вы увидите. - person Luna; 08.02.2019
comment
все еще не определено в консоли - person Molly; 08.02.2019
comment
@ChandraniChatterjee - это ваш компонент, в котором консольный журнал отображается с помощью response-router? для работы он не должен быть дочерним компонентом. что именно вы пытаетесь войти? попробуйте записать именно то, что я написал, и проверить его содержимое - person Luna; 08.02.2019
comment
Я получаю undefined в журнале, а Taskactive.jsx не является дочерним по отношению к Login.jsx - person Molly; 12.02.2019
comment
@ChandraniChatterjee Думаю, я вижу проблему. ваша конфигурация неверна. в остальном это работает из коробки. У вас есть Маршрутизатор в Логине, а под ним нет Маршрута. Предлагаю перенастроить response-router, но правильно - person Luna; 12.02.2019