代码之家  ›  专栏  ›  技术社区  ›  sliptype

cycle.js-如何获取集合项中的集合长度

  •  2
  • sliptype  · 技术社区  · 6 年前

    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))
        }
      }
    });
    

    我知道透镜可以用来在组件之间共享状态,但似乎没有一种方法可以将透镜与集合一起使用。我想我可以把收集的长度传给孩子们,这样我就可以把它和身份证进行比较。

    1 回复  |  直到 6 年前
        1
  •  2
  •   Jan van Brügge    6 年前

    你可以用镜片 makeCollection 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 })