2016-07-27 4 views
3

В ramda Как я могу обновить сразу несколько свойств? Самое близкое, что я мог получить, это использовать R.evolve(). evolve хочет, чтобы я изменил свойство с помощью функции преобразования. Я хотел бы сделать это напрямую. Однако, R.assoc() позволяет мне изменять только одно свойство за раз, и я должен указать свойство с помощью строки.Обновление нескольких свойств

Это, как я это делаю сейчас с evolve:

const STATE_INITIAL = { 
    isDisabled: true, 
    isLoading: false 
}; 

R.evolve({ 
    isDisabled: R.not, 
    isLoading:() => true // I don't want to set a value using a function 
    }, state) 

В JS Я бы object-spread оператор и я получил бы новый объект:

{ ...state, isDisabled: !state.isDisabled, isLoading: true} 

ответ

1

Одним из вариантов является использование линз:

const isDisabled = R.lensProp('isDisabled'); 
const isLoading = R.lensProp('isLoading'); 

// toggle :: State -> State 
const toggle = R.pipe(
    R.over(isDisabled, R.not), 
    R.set(isLoading, true) 
); 

toggle({isDisabled: true, isLoading: false}); 
// => {isDisabled: false, isLoading: true} 

См R.lensProp, R.over и R.set.

+0

Интересный вариант, Дэвид. Спасибо, что поделились ею. Довольно многословный. Я до сих пор не ответил. Может быть, кто-то будет с другим решением. Если ничего нового не появится, я приму ответ. – zatziky

1

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

const toggle = R.pipe(
    R.over(R.lensProp('isDisabled'), R.not), 
    R.set(R.lensProp('isLoading'), true) 
) 

, конечно, несколько более многословен, чем

const toggle = state => { 
    ...state, 
    isDisabled: !state.isDisabled, 
    isLoading: true  
} 

Но это не кажется, что плохо. Однако, если ваше возражение против использования функций для обоих свойств не слишком сильно, есть вариант вашей оригинальной версии с evolve это довольно просто:

const toggle = R.evolve({ 
    isDisabled: R.not, 
    isLoading: R.T 
}) 

R.T просто сокращание R.always(true)

+0

Скотт, спасибо за ваше мнение. «R.evolve» кажется мне очень хорошим, когда его поддерживают «R.T» и «R.F». – zatziky

Смежные вопросы