Передайте имя пользователя из компонента входа в компонент домашней страницы

Если у меня есть такой компонент страницы входа в систему ...

class Login extends Component {
    constructor(props) {

        super(props);
        this.state = {
            username: ""
        };

и я хочу получить доступ к этому имени пользователя на домашней странице, чтобы показать пользовательскую информацию с помощью выборки, как мне это сделать?

class AccountItem extends Component {

    constructor(props) {
        super(props);
        this.state = {
            username : // How to get the same field as Login username here?
        };
    }

Вы можете сохранить имя пользователя в localstorage после входа в систему, а затем получить его в компоненте AccountItem.

Shubham Khatri 11.04.2018 21:37

Я изучу это

Vincent Nguyen 11.04.2018 21:40

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

Curious13 11.04.2018 21:45

@ Curious13 Я не совсем понимаю, как бы я это сделал

Vincent Nguyen 11.04.2018 21:46
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Навигация по приложениям React: Исчерпывающее руководство по React Router
Навигация по приложениям React: Исчерпывающее руководство по React Router
React Router стала незаменимой библиотекой для создания одностраничных приложений с навигацией в React. В этой статье блога мы подробно рассмотрим...
Массив зависимостей в React
Массив зависимостей в React
Все о массиве Dependency и его связи с useEffect.
3
4
4 360
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Лучший способ справиться с этим - использовать React.createContext, если у вас есть Реагировать 16.3, обновлять свое состояние на уровне приложения или иметь систему управления состоянием, такую ​​как Redux, для отслеживания вашего текущего имени пользователя.

Example with React.createContext which I highly recommend using if you don't have a state management

// This is where you have your routes etc.
import * as React from 'react';

const UsernameContext = React.createContext('');

class App extends Component {

  constructor(props) {
    super(props);
    this.state = { username: '' };
  }

  onUsernameChange = (username) => {
    this.setState({ 
      username: username
    });
  }

  render() {
    <UsernameContext.Provider value = {this.state.username}>
      <Switch>
        <Route exact path = "/" render = {Home} />
        <Route path = "/login" render = {()=><LoginPage onUsernameChange = {this.onUsernameChange}/>
      </Switch>
    </UsernameContext.Provider>
  }
}


class Login extends Component {
  constructor(props) {

    super(props);
    this.state = {
      username: ""
    };
  }

  onSubmit = () => {
    // This is pseudo code so you want to handle login somewhere
    // when that is done you can call your onUsernameChange
    this.props.onUsernameChange(this.state.username);
  };

  ...
}


class AccountItem extends Component {

  render() {
    return (
      <UsernameContext.Consumer>
        {(username) => { 
          // you have username in props
        }}
      </UsernameContext.Consumer>
   )
 }

Ниже приведен простой пример без Redux или React.createContext

// This is where you have your routes etc.
class App extends Component {

  constructor(props) {
    super(props);
    this.state = { username: '' };
  }

  onUsernameChange = (username) => {
    this.setState({ 
      username: username
    });
  }

  render() {
    <Switch>
      <Route path = "/login" render = {()=><LoginPage onUsernameChange = {this.onUsernameChange}/>
      <Route path = "/account" render = {() => <AccountItem username = {this.state.username} />} />
    </Switch>
  }
}


class Login extends Component {
  constructor(props) {

    super(props);
    this.state = {
      username: ""
    };
  }

  onSubmit = () => {
    // This is pseudo code so you want to handle login somewhere
    // when that is done you can call your onUsernameChange
    this.props.onUsernameChange(this.state.username);
  };

  ...
}


class AccountItem extends Component {

  render() {
    this.props.username // you have username in props

В итоге я дал своему маршрутизатору имя пользователя в его состоянии, затем передал его Home и снова передал AccountItem. Вероятно, это плохой дизайн, но пока он работает

Vincent Nguyen 11.04.2018 22:22

Еще вы можете использовать React.createContext, если вы используете 16.3. Я могу опубликовать простой пример того, как это сделать. Что должно быть лучшим способом справиться с этим случаем, поскольку App -> Home -> AccountItem

Kenneth Truong 11.04.2018 22:28

Это не нужно чем ты @KennethTruong

Vincent Nguyen 11.04.2018 22:31

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