【发布时间】: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。