Как исправить setInterval в React?

Если я сейчас правильно понимаю, вы можете использовать Object.values и Spread Syntax , чтобы выполнить это:

var myFunction = function(param1, param2) {
  console.log(param1);
  console.log(param2);
}

var functionParameters = {
  data1: "test",
  data2: "another test"
};

var run = myFunction.bind(null, ...Object.values(functionParameters))
run();

Старый ответ

Я бы предположил, что самым простым решением будет просто передать массив ...

var myFunction = function(args) {
  args.forEach((i) => console.log(i));
}

var functionParameters = {
  1: "test",
  2: "another test",
  3: "another one"
};

var run = myFunction.bind(null, Object.values(functionParameters)) //Get array of values from the object
run();

Если вы планируете отправлять только определенные значения объекта, как у вас в вашем примере, вы можете использовать Rest Parameters ]:

var myFunction = function(...args) {
  args.forEach((i) => console.log(i));
}

var functionParameters = {
  data1: "test",
  data2: "another test",
  data3: "another one"
};

var run = myFunction.bind(null, functionParameters.data1, functionParameters.data2, functionParameters.data3) //Get array of values from the object
run();

//myFunction("This", "function", "will", "now", "take", "unlimited", "parameters");

0
задан oscicen 18 January 2019 в 20:32
поделиться

2 ответа

Поскольку вы используете обычную функцию в setTimeout и setInterval, вам нужно связать функцию или изменить ее на функцию стрелки, чтобы получить этот контекст внутри функции, и setState будет работать

Вот обновленный код для вашего ref

   playStep(step) {
       this.setState({ clickClass: "button hover" });
       this.sounds[step].play();
       setTimeout(function(){
           this.setState({ clickClass: "button" });
       }.bind(this), 300);
   }

   // Show all steps
   showSteps() {
        this.setState({ gameConsole: this.state.round });
        let num = 0;
        let moves = setInterval(function(){
       this.playStep(this.state.steps[num]);
       this.setState({ gameConsole: "Wait..." });
       num++;
       if (num >= this.state.steps.length) {
           this.setState({ gameConsole: "Repeat the steps!" });
           clearInterval(moves);
       }
     }.bind(this), 600);
  }

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

Вот обновленная демонстрация codepen https://codepen.io/anon/pen/bOPyVy

0
ответ дан Hemadri Dasari 18 January 2019 в 20:32
поделиться
this

неизвестно внутри функции обратного вызова. используйте .bind(this) каждый раз, когда вам нужно получить доступ к this в более глубоких областях. напр. :

let moves = setInterval(function(){
    this.playStep(this.state.steps[num]);
    this.setState({ gameConsole: "Wait..." });
    num++;
    if (num >= this.state.steps.length) {
        this.setState({ gameConsole: "Repeat the steps!" });
        clearInterval(moves);
    }
}.bind(this), 600)
0
ответ дан SomoKRoceS 18 January 2019 в 20:32
поделиться
Другие вопросы по тегам:

Похожие вопросы: