Невозможно изменить состояние с помощьюStateHandlers из recompose

В чем разница? => Много.

Я думаю, версия this используется для включения инкапсуляции, т. Е. Скрытия данных. Это помогает манипулировать частными переменными.

Давайте посмотрим на следующий пример:

var AdultPerson = function() {

  var age;

  this.setAge = function(val) {
    // some housekeeping
    age = val >= 18 && val;
  };

  this.getAge = function() {
    return age;
  };

  this.isValid = function() {
    return !!age;
  };
};

Теперь структуру prototype можно применить следующим образом:

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

AdultPerson.prototype.getRights = function() {
  // Should be valid
  return this.isValid() && ['Booze', 'Drive'];
};

Давайте посмотрим на реализацию сейчас.

var p1 = new AdultPerson;
p1.setAge(12); // ( age = false )
console.log(p1.getRights()); // false ( Kid alert! )
p1.setAge(19); // ( age = 19 )
console.log(p1.getRights()); // ['Booze', 'Drive'] ( Welcome AdultPerson )

var p2 = new AdultPerson;
p2.setAge(45);    
console.log(p2.getRights()); // The same getRights() method, *** not a new copy of it ***

Надеюсь, что это поможет.

0
задан karolis2017 14 July 2018 в 02:09
поделиться

1 ответ

Документы для withStateHandlers указывают:

withStateHandlers(
  initialState: Object | (props: Object) => any,
  stateUpdaters: {
    [key: string]: (state:Object, props:Object) => (...payload: any[]) => Object
  }
)

Это означает, что каждое свойство state-updater является функцией, которая получает аргументы state и props и возвращает другое функция, которая, в свою очередь, принимает необязательные аргументы полезной нагрузки (то есть все, что вы передаете в качестве аргументов при вызове onTrigger), и возвращает новое состояние.

Ваш onTrigger возвращает новое состояние вместо функции, поэтому тип неверен. Если вы завершите результат в функцию стрелки, он должен работать:

onTrigger: ({ active }) => () => ({
  active: true
})
2
ответ дан Oblosys 17 August 2018 в 12:02
поделиться
  • 1
    Спасибо за ваш ответ, но это все равно одно и то же. Я console.log (активен), и всегда возвращается false, когда возвращаюсь к компоненту. Может быть, меня перетащили в новое место, пока состояние не настроено на активное: true? – karolis2017 14 July 2018 в 04:29
  • 2
    Когда я нажимаю на новый маршрут, я создаю новый компонент, а предыдущий - из DOM. Поэтому, когда я возвращаюсь к нему, он имеет репервенс и имеет начальное состояние, которое является false. Это имеет смысл или нет? – karolis2017 14 July 2018 в 05:10
  • 3
    Вам понадобится дополнительный () =>, чтобы заставить его работать вообще, но да, если компонент размонтирован и позже перемонтирован, его состояние снова инициализируется. Если вы хотите предотвратить это, вам нужно сохранить состояние в компоненте предка, который остается установленным, или использовать библиотеку управления состояниями, такую ​​как redux. – Oblosys 14 July 2018 в 14:10
Другие вопросы по тегам:

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