【问题标题】:Less mixin scope problems更少的 mixin 范围问题
【发布时间】:2014-10-27 07:06:40
【问题描述】:

我构建了一个参数 mixin,它根据我创建的“节点值”系统查找元素的子元素。发生的事情是通过循环函数“.extractArrays”找到孩子,其中包含“.deliverChild”。然后将孩子(最多 4 个)放入“.calculateWidth”中,它在变量中返回孩子的宽度(例如“calculatedWidth1”)。

问题是:当没有第三个和第四个孩子时,@child3 和@child4 未设置,这会产生错误。我在 mixins 之前将 @child3 和 @child4 设置为零,希望这会在调用 mixins 之前给它们默认值 0。然而,由于某种原因,当有第三个孩子时,mixin 的 @child3 返回值不会覆盖设置为 0 的 @child3。我不确定为什么会发生这种情况,但我觉得有几件事当涉及到 mixins 和范围时,这让我对 Less 感到厌烦。

@child3: none, 0 0, 0, 0;
@child4: none, 0 0, 0, 0;

    .extractArrays(@index, @node, @node-value, @elements-array) when (@index <= @length-elements-array) {
        @element-array: extract(@elements-array, @index);
        @found-node: extract(@element-array, 2);
        .deliverChild(@element-array, @found-node) when (@found-node = @child-node-value1) {
            @child1: extract(@element-array, 1);
        }
        .deliverChild(@element-array, @found-node) when (@found-node = @child-node-value2) {
            @child2: extract(@element-array, 1);
        }
        .deliverChild(@element-array, @found-node) when (@found-node = @child-node-value3) {
            @child3: extract(@element-array, 1);
        }
        .deliverChild(@element-array, @found-node) when (@found-node = @child-node-value4) {
            @child4: extract(@element-array, 1);
        }
        .deliverChild(@element-array, @found-node);
        .extractArrays(@index + 1, @node, @node-value, @elements-array);
    }
    .extractArrays(1, @node, @node-value, @elements-array);


    .calculateWidth(@child1, 1);
    .calculateWidth(@child2, 2);
    .calculateWidth(@child3, 3);

    width: @calculatedWidth1 + @calculatedWidth2 + @calculatedWidth3 + @calculatedWidth4;

【问题讨论】:

  • 这个发现的儿童是否在其他地方使用过?我宁愿创建一个找到的孩子的数组,并通过另一个循环计算它们的宽度(或者更简单:直接在查找循环中计算它们的宽度)。使用数组和循环来创建一堆具有预定义名称的变量看起来根本不是一个好主意(如果有 5 个呢?9 个?99 个?)。
  • 换句话说,我建议从头开始重新设计它,而不是尝试解决这种方法的性质根本无法解决的副作用和问题。但要做到这一点,我们需要更多关于源数组及其元素的信息(特别是这些元素实际上是如何定义其width 的)。
  • 创建一个找到的孩子的数组听起来确实是一个更好的主意。然而,我不认为这是可能的。 Less 似乎在 Internet 上没有得到很好的记录。你能解释一下如何创建一个不断被循环添加的数组吗?
  • 元素数组是一个“元素数组”的数组,它由两个值组成: 1. 一个存储a的数组。元素或类名 b.宽度和高度 C.填充 d.边距和 2. 表示它在 DOM 中的位置的数字。例如 121 和 122 是 12 的第一个和第二个子元素。此外,宽度是通过添加子元素的水平属性来定义的(margin-left、padding-right、width 等)
  • 回答关于范围的最初问题:请参阅Mixins as Functions

标签: css less frontend mixins


【解决方案1】:

(不是对上述“范围”问题的确切答案,而是在上述 cmets 建议的替代方法中用作起点的算法):

通用数组过滤 mixin 看起来像这样(小于 1.7.5 或更高版本):

@array: // key value
    a 1,
    b 2,
    c 3,
    a 4,
    d 5,
    a 6,
    c 7;

// usage:
usage {
   .filter-array(@array, a); 
    result: @filter-array;
}

// impl.:
.filter-array(@array, @key, @key-index: 1) {
    .-(length(@array));
    .-(@i, @r...) when (@i > 0)
        and not(@key = extract(extract(@array, @i), @key-index)) {
            // skip item since key does not match
            .-((@i - 1), @r);
    }
    .-(@i, @r...) when (length(@r) > 0)
        and (@key = extract(extract(@array, @i), @key-index)) {
            // key matches and @r is not empty so concat current item to @r
            .-((@i - 1); extract(@array, @i), @r);
    }
    .-(@i, @r...) when (length(@r) = 0)
        and (@key = extract(extract(@array, @i), @key-index)) {
            // key matches and @r is empty so this is our first item
            .-((@i - 1), extract(@array, @i));
    }
    .-(@i, @r...) when (@i = 0) {
        // define "return" variable:
        @filter-array: @r;
    }
}

结果数组等于:

@filter-array:
    a 1,
    a 4,
    a 6;

这看起来相当可怕和冗长,但仍然比原来的方法更干净、更可控。

此外,提供一个专用的 mixin 来返回数组项的某些值的总和(或任何其他“转换”,结果为单个值)是有意义的(这样可以将实现简化到某个点因为您不需要连接任何东西,并且上述某些条件和/或 mixin 特化变得不必要)。

【讨论】:

  • 我相信我理解这一点,但不太支持诸如“and”和“and not”之类的陈述。
  • @user1940631 我开始怀疑你错过了The Docs ;)。
  • 我想我已经很接近了,但是对于 @r 不为空并且你连接当前项目的函数,为什么 (@i-1) 后面有一个分号?这是一个错字还是用于指定“提取(@array,@i),@r)”的语法被制成一个值?
  • @user1940631,是的,; 是强制将下一条语句解释为单个值而不是两个不同的参数(即; 更改了参数逗号的含义 - 请参阅Mixins With Multiple Parameters )。
  • 混合不工作,因为被测试的第一个值不是孩子,这使它通过你写的第一个混合,带有注释“跳过项目,因为键不匹配”的那个. @r 未定义,然后作为未定义值放回 mixin。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-12-28
  • 1970-01-01
  • 2014-01-28
  • 2021-11-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多