Попытка изменить фон, обновив состояние в Reactjs

Итак, я пишу приложение, в котором есть несколько игр. Я хочу, чтобы пользователь мог нажать кнопку, и игра появилась на экране, а фон изменил цвет. Я хочу управлять этим с помощью состояния, чтобы изменился фон всего приложения, а не только игрового компонента.

С моим нынешним кодом состояние меняется, когда игра выходит, но страница не обновляется. Любой совет?

так выглядит мое состояние

state = {
  madLibsOut: false,
  ticTacOut: false,
  pigLatinOut: false,
  background: "green",
}

вот пример моей попытки изменить это. Состояние меняется, и игра появляется на экране, но цвет фона не обновляется.

handleClickTicTacToe = () => {
  const out = this.state.ticTacOut
  const newColor = 'red'
  this.setState({ ticTacOut: true, background: newColor })
}

на всякий случай, вот как я задаю стиль:

appStyle = {
  backgroundColor: this.state.background,
  height: "100vh",
  width: "100%",
}

render() {
  return (
    <div className = "App" style = {this.appStyle}>

Спасибо!

Поведение ключевого слова "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) для оценки ваших знаний,...
2
0
1 630
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Вы должны исключить весь объект appStyle внутри состояния вашего компонента.

Примерно так должно работать:

  state = {
     madLibsOut: false,
     ticTacOut: false,
     pigLatinOut: false,
     appStyle:{
     backgroundColor: "green",
     height: "100vh",
     width: "100%",
    }
 }


  handleClickTicTacToe = () => {
    const out = this.state.ticTacOut
    let appStyle = this.state.appStyle
    appStyle.backgroundColor = 'red'
    this.setState({ticTacOut: true, appStyle:appStyle})
 }

  render() {
   return (
      <div className = "App" style = {this.state.appStyle}>

«Я внес эти изменения и получил сообщение об ошибке« TypeError: Невозможно назначить только для чтения свойство «backgroundColor» объекта «# <Object>». Кажется, он без ума от строки, в которой написано appStyle.backgroundColor = 'red'

newbornCoder 09.04.2018 02:43

попробуйте объявить appStyle с let вместо const

Alessandro Messori 09.04.2018 02:44

Сделайте appStyle функцией, которая возвращает объект стиля в зависимости от вашего состояния.

appStyle = () => {
    return {
        backgroundColor:this.state.backgroundColor
    }
}
Ответ принят как подходящий

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

Предполагая, что у вас включен ES6. Вы должны сделать что-то похожее на то, что сказал @Allessandro Messori. Но в его решении нецелесообразно изменять свойство объекта и устанавливать состояние.

При установке состояния обычно следует создать новый объект для установки состояния. В этом случае вашим стилевым объектом должен быть новый объект.

state = {
  madLibsOut: false,
  ticTacOut: false,
  pigLatinOut: false,
  appStyle: {
    backgroundColor: "green",
    height: "100vh",
    width: "100%",
  } 
}


handleClickTicTacToe = () => {
  const out = this.state.ticTacOut
  // Use Object.assign(this.state.appStyle, { backgroundColor: 'red' }); if no ES6 enabled
  const newStyle = { ...this.state.appStyle, backgroundColor: 'red' }; 
  this.setState({ ticTacOut: true, appStyle: newStyle })
}

render() {
  return (
    <div className = "App" style = {this.state.appStyle}>

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

getAppStyle = () => {
  return {
    backgroundColor: this.state.background,
    height: "100vh",
    width: "100%",
  };
}

render() {
  const style = this.getAppStyle();
  return (
    <div className = "App" style = {style}>

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