React Native - вложенный объект set State не работает должным образом

Я хочу установить состояние вложенного объекта, и я пробовал этот ответ, но я не знаю каждый раз, когда я setState после ответа, состояние все еще не установлено

Вот мой код, который я пробовал:

// declare the state
constructor(props){
  super(props); 
  this.state = {
    bius: {name:'bius', time:0, status:false},
  }
}

// Function to setstate
_timer(name){
    // this.setState({[name]: !this.state.name})
  var upd = {...this.state[name]}
  upd.status = !upd.status
  console.info(upd.status)
  console.info(this.state.bius)
  this.setState({upd})
  console.info("setstate upd")
  console.info(upd)
  console.info(this.state.bius)
}

// here I call the function to set state
<TouchableOpacity  onPress = {()=>{this._timer('bius')}}>
  <Text style = {[global.global.SubHeaderText, {color:'white'}]}>Start</Text>
</TouchableOpacity>

и вот вывод журнала:

I/ReactNativeJS(6694): true
I/ReactNativeJS(6694): { name: 'bius', time: 0, status: false }
I/ReactNativeJS(6694): setstate upd
I/ReactNativeJS(6694): { name: 'bius', time: 0, status: true }
I/ReactNativeJS(6694): { name: 'bius', time: 0, status: false }

Я не знаю, почему upd.status уже true, а this.state.bius.status все еще false?

почему this.state.bius.status не установлен на true?

Я думаю, вам нужно привязать функцию _timer к компоненту, потому что он не знает о состоянии. Перепишите его в es6 ‘func _timer = (name) => {}’ или в конструкторе ‘this._timer.bind (this._timer)’

parohy 20.04.2018 05:39

Разве this.setState (...) не должен находиться вне функции _timer?

Rama 20.04.2018 05:39

@parohy по-прежнему не повезло, ваш 1-й предлагает дать мне тот же результат, а ваш 2-й предложение заставляет мою функцию не работать должным образом

flix 20.04.2018 05:46
Поведение ключевого слова "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
158
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Я думаю, вы ошиблись, я this.setState({upd})

Можно по другому сделать this.setState({bius:upd}) Попробуйте это, дайте мне знать, что случилось.

Вы можете проверить свое обновление состояния или нет в обратном вызове this.setState ({bius: upd}, () => {Console.log (this.state.bius);}) Проверьте это, я уверен, что вы получаете обновленное состояние в вызове назад.

Asif vora 20.04.2018 05:45

кажется, что console.info не появляется, что случилось -_-

flix 20.04.2018 05:48
Ответ принят как подходящий

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

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

this._timer.bind(this,'bius');
//..

this.setState(prevState => ({ 
   bius: {
      ...prevState.bius,
      status: !prevState.bius.status
}));

И у вас upd.status = !upd.status; не будет работать, так как состояние не изменилось. Вам также нужно вызвать setState. И еще одна вещь, о которой упоминалось в комментарии к вашему вопросу. Вам следует использовать стрелочные функции, если вы не собираетесь привязывать обработчик событий.

Я пробовал ваш код, но приложение не обнаружило status как переменную

flix 20.04.2018 05:56

может понадобиться status: !prevState.status

pmonty 20.04.2018 05:56

Дай мне знать, как дела

pmonty 20.04.2018 06:00

Как вы видите в моем коде о событии onPress, я использую {()=>{this._timer('bius')}}, поэтому привязка не используется, но все же console.info показывает тот же результат, что и я объявляю, подходит ли ...prevState.bius для реализации?

flix 20.04.2018 06:01

o.O ой status: !prevState.bius.status

pmonty 20.04.2018 06:07

setState - это асинхронная функция. Итак, если вы хотите распечатать свое состояние, вам следует выполнить обратный вызов console.info (). Например:

this.setState({bius: {name:'example'}},()=>{console.info(this.state)})
this.setState() updates the state  asynchronously. That is why you do not see in console log. To get the log correctly add a console.info in render function as below .

export default class app extends Component {
  constructor(props) {
    super(props);
    this.state = {
      bius: { name: 'bius', time: 0, status: false },
    }
  }

  // Function to setstate
  _timer(name) {
    var upd = { ...this.state[name] }
    upd.status = !upd.status
    this.setState({ bius: upd })
  }


  render() {
    console.info("MYLOG", this.state.bius)
    return (
      <TouchableOpacity style = {{ margin: 100 }} onPress = {() => { this._timer('bius') }}>
        <Text >Start</Text>
      </TouchableOpacity>
    )
  }
}

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