Изменение отображаемых компонентов в зависимости от состояния

Я делаю очень простой веб-сайт, на котором у меня есть изображение, пара элементов h1/2 и две кнопки.

Моя цель состоит в том, что когда я нажимаю кнопку входа в систему, кнопки исчезают и появляется окно, содержащее форму входа.

То же самое для кнопки регистрации, но с полем регистрации.

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

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

import React, { Component } from 'react';
import logo from '../logo.png';
import './css/AddGame.scss';
import AddGameButton from './AddGameButton';

class AddGame extends Component {
  constructor () {
    super();
    this.state = {
      pageState: "buttons",
    }
  }

  openLogin() {
    this.setState({
      pageState: "login",
    });
  }

  openRegister() {
    this.setState({
      pageState: "register",
    });
  }

  render() {
    return (
      <div className = "AddGame">
        <img src = {logo} />
        <h1><span>OPlist</span> estará disponible próximamente.</h1>
        <h2>¿Quieres contribuir añadiendo juegos?</h2>
        {(this.state.pageState == "buttons") ? <div>
          <AddGameButton onclick = {this.openLogin} text = "Entrar" buttonType = "Login" /> <AddGameButton onclick = {this.openRegister} text = "Regístrate" buttonType = "Register" />
        </div> : null}
        {(this.state.pageState == "login") ? <div>LOGIN</div> : null}
        {(this.state.pageState == "register") ? <div>register</div> : null}

      </div>
    );
  }
}

export default AddGame;
Поведение ключевого слова "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
0
48
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

Это потому, что ваши обработчики вызываются из компонента AddGameButton, и при запуске в этом контексте они будут иметь другой this.

(читать https://reactjs.org/docs/handling-events.html)

Либо определите их как стрелочные функции, либо привяжите к ним this в конструкторе.

Путь функции стрелки

  openLogin = () => {
    this.setState({
      pageState: "login",
    });
  }

  openRegister = () => {
    this.setState({
      pageState: "register",
    });
  }

Свяжите thisconstructor способом

constructor () {
  super();
  this.state = {
    pageState: "buttons",
  }
  this.openLogin = this.openLogin.bind(this)
  this.openRegister = this.openRegister.bind(this)
}

Демо на https://codesandbox.io/s/x7x1848yp

Вау, спасибо! Я новичок в JS и React (я пришел из Java и вообще новичок в программировании), и мне часто приходится сталкиваться с оператором this и функциями со стрелками. Как бы вы связали методы в конструкторе?

Oscar Arranz 07.04.2019 02:02

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