Есть ли способ карри нескольких методов ramda's AssocPath в редукторе? - PullRequest
0 голосов
/ 19 февраля 2020

Поэтому хотелось узнать, есть ли способ, которым я мог бы каррировать несколько методов assocPath в редукторном редукторе. sh Я должен обновить состояние объекта и массива в моем редукторном редукторе, не изменяя его. Для которого я должен установить значение в нескольких объектах / массивах. Я пытаюсь это сделать, создав клон объекта и обновив его, а затем снова установив его в состояние, что я делаю в состоянии компонентов. Так что в настоящее время я делаю что-то подобное в своем состоянии компонентов. Я sh хочу сделать то же самое в редукторном редукторе

 let newState;
    newState = _.assocPath(["project", "value"], project, this.state);
    newState = _.assocPath(["project", "error"], false, newState);
    this.setState(newState);

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

Пожалуйста, дайте мне знать, если вы хотите больше информации. Спасибо

Ответы [ 2 ]

1 голос
/ 19 февраля 2020

Я думаю, что решение от Ори Дрори лучше, чем это, но мне кажется, что это то, что вы просите:

const foo = (project, errVal) => pipe (
  prop ('state'),
  assocPath (["project", "value"], project),
  assocPath (["project", "error"], errVal)
) 

this .setState (foo (project, false) (this))

foo (хорошо, так что я ужасен в naming!) принимает ваши значения project и err и возвращает функцию, которая принимает объект и возвращает обновленную версию его свойства state после установки project.value и project.error. Это то, что вы хотите сделать?

Терминология

Вы говорите так:

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

И я просто хочу указать на некоторые проблемы с формулировкой. Во-первых, у Рамды нет методов . Методы - это функции, которые воздействуют на состояние объекта. Рамда очень осторожен, чтобы не видоизменить ваше состояние. Рамда вместо этого просто имеет функций . R (или _, если вы выберете) служит пространством имен для большого числа независимых функций.

И, во-вторых, то, что вы делаете, не имеет ничего общего с curry, Вы просто вызываете функции. Мой ответ использует pipe для объединения некоторых функций в новую, и, возможно, это то, что вы имели в виду. Карринг - это процесс преобразования функции с несколькими аргументами во вложенную последовательность функций с одним аргументом. (a, b, c) => 'foo' ===> (a) => (b) => (c) => 'foo'. В карри Рамды есть некоторые дополнительные функции, которые позволяют вам вызывать полученную функцию несколькими способами, но дело в том, что в вопросе нет ничего общего с карри.

1 голос
/ 19 февраля 2020

Я бы создал редуктор, используя R.mergeDeepLeft с объектом, который я sh, чтобы объединить с исходным состоянием, а затем вызвал бы его в старом состоянии.

Пример :

const state = { project: { value: null, error: true, other: 'other' } }
const project = {}

const reducer = R.mergeDeepLeft({
  project: {
    value: project,
    error: false
  }
})

const newState = reducer(state)

console.log(newState)
<script src="https://cdnjs.cloudflare.com/ajax/libs/ramda/0.27.0/ramda.js"></script>
...