Cycle.js — как получить длину коллекции в элементе коллекции

Я пытаюсь добавить некоторое поведение исключительно к последнему элементу списка в Cycle.js. Я попытался использовать цикл-onionify для создания такой коллекции:

const List = makeCollection({
  item: Child,
  itemKey: (childState, index) => String(index),
  itemScope: key => key,
  collectSinks: instances => {
    return {
      onion: instances.pickMerge('onion'),
      DOM: instances.pickCombine('DOM')
        .map(itemVNodes => ul(itemVNodes))
    }
  }
});

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

Есть ли что-то, что мне не хватает?


person sliptype    schedule 13.06.2018    source источник


Ответы (1)


Вы можете использовать линзы с makeCollection. Помните, что он возвращает обычный компонент Cycle.js, который вы можете изолировать. Итак, если вы хотите добавить логическое значение isLast, вы можете сделать это следующим образом:

function omit(obj, key) {
    let tmp = { ...obj }; //Copy the object first
    delete tmp[key];
    return tmp;
}

const listLens = {
   get: stateArray => stateArray.slice(0, -1).concat({
            ...stateArray[stateArray.length - 1],
            isLast: true
        }),
   set: (stateArray, mappedArray) => mappedArray.slice(0, -1)
           .concat(omit(mappedArray[mappedArray.length - 1], 'isLast'))
};

const List = isolate(
    makeCollection({
        item: Child,
        itemKey: (childState, index) => String(index),
        itemScope: key => key,
        collectSinks: instances => ({
            onion: instances.pickMerge('onion'),
            DOM: instances.pickCombine('DOM')
                .map(itemVNodes => ul(itemVNodes))
        })
    }),
    { onion: listLens, '*': null }
);

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

itemScope: key => ({ onion: myLens, '*': key })
person Jan van Brügge    schedule 13.06.2018