Установить состояние из другого компонента React js

У меня в index.js есть следующая структура:

<MyAppBar // + properties/>
 <Route path = {path} component = {Login}/>

MyAppBar.js

 class MyAppBar extends React.Component {

state = {
  auth: false,
  anchorElement: null
};

handleLogin(){
  this.setState({auth:true});
}

//another code
//end component

export default withStyles(styles)(MyAppBar)

Я хочу обновить флаг авторизация состояния MyAppBar до правда из обработчика действий компонента Авторизоваться (т.е. handleLogin), но я не знаю как.

Я пробовал импортировать MyAppBar (все компоненты) на страницу Авторизоваться, но там написано, что

MyAppBar.handleLogin(); 

это не функция ... Спасибо!

Спасибо!

Вы можете сделать это с помощью нового API контекста React здесь. По сути, вам следует обернуть ваш MyAppBar в Provider, а ваш Login - в Consumer. Дайте мне знать, если это недостаточно ясно.

Hasan Sh 17.10.2018 13:13

в таких сценариях лучше использовать redux, так как это упрощает взаимодействие между компонентами.

Sujit.Warrier 17.10.2018 13:13

Да, это то, что я собираюсь сделать. Большое спасибо!

Tobi 17.10.2018 14:22
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
3
6 069
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Логин должен быть дочерним компонентом MyAppBar. Затем вы можете передать функцию handleLogin в качестве реквизита для входа в систему.

Привет, у плаката проблемы, потому что компоненты не могут быть дочерними.

Sujit.Warrier 17.10.2018 13:29

Вам следует использовать REDUX.

В основном потому, что он позволяет вам иметь состояние, в котором любой компонент может читать или синхронизироваться с ним.

Я редко использую response state / setState.

В большинстве случаев состояние редукции можно изменить / посмотреть.

Вот что я собираюсь сделать! Спасибо!

Tobi 17.10.2018 14:22

в таких сценариях лучше использовать redux, так как это упрощает обмен данными между компонентами. В противном случае, если вы хотите пойти тяжелым путем, создайте родительский компонент, который будет обертывать как логин, так и MyAppBar.

  class ParentComp extends Component{
      constructor(props){ 
         super(props);
         this.state = {
             isLoggedIn:false
         };
        this.setLoginState=this.setLoginState.bind(this);
      }
      setLoginState(value){
          this.setState({isLoggedIn:value});
      }

       render(){
         return(<div>
                   <MyAppBar isLoggedIn = {this.state.isLoggedIn} />
               <Route path = {path} render = {props=><Login {..props} setLoginState = {this.setLoginState}/>}/>
                </div>);
       }
  }

в вашем LoginComponent вызовите метод setLoginState

   this.props.setLoginState(true);

и в вашем компоненте myappbar используйте свойство isLoggedIn для условного рендеринга

   renderLogin(){
     if (this.props.isLoggedIn){ 
          // return loggedin jsx
     }else{
         return the alternative
     }
   }

Я собираюсь использовать Redux, но большое спасибо за это альтернативное решение.

Tobi 17.10.2018 14:23
Ответ принят как подходящий

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

Вот как вы могли бы реализовать это с новым context.

Edit React Hooks

It's farily simple and nice to use. Check it here Let me know if that isn't clear.

Рад помочь :)

Hasan Sh 17.10.2018 14:13

хорошее решение. Чисто и просто

Sujit.Warrier 17.10.2018 19:06

Спасибо! Мне очень нравится этот новый API и то, как все это сочетается друг с другом :)

Hasan Sh 18.10.2018 12:17

О, спасибо @KhurshidAnsari за ваш комментарий, я понятия не имею, почему URL запутался !!! Только что обновил :)

Hasan Sh 11.04.2019 16:06

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