如标题所述,使用React.cloneElement
inside React.Children.map
导致元素键发生更改。
这是一个演示此内容的沙箱。
React.Children.map(children, (child) => {
let clonedEl = React.cloneElement( child );
console.log(clonedEl);
return clonedEl;
});
该代码块的结果将元素.$
添加到每个键的前面。这确实令人困惑,原因有两个。
1:文档说cloneElement将保留键和引用。
克隆并使用element作为起点返回一个新的React元素。生成的元素将具有原始元素的道具,而新的道具将被浅层合并。新的孩子将替换现有的孩子。原始元素的key和ref将被保留。
2:的结果console.log
是具有保留键和引用的元素。
这会让我相信添加操作发生在React.Children.map代码的某个地方。
更新:查看React.Children.map的代码后…
我发现它是通过以下功能链添加的:mapChilren-> mapIntoWithKeyPrefixInternal->
traverseAllChildren-> traverseAllChildrenImpl-> mapSingleChildIntoContext。
mapSingleChildIntoContext
第三个参数是childKey。它被称为with nameSoFar === '' ? SEPARATOR + getComponentKey(children, 0) : nameSoFar
作为它的第三个参数traverseAllChildrenImpl
。
SEPARATOR = "."
并getComponentKey
在转义函数中返回带有$前缀的键。
更新的问题:
现在,我正在寻找解决此问题的方法…我不确定是否有考虑将traverseAllChildrenImpl调用为空字符串作为nameSoFar
traverseAllChildren内部对象的问题。
我认为这可能是React.Children.map
构建新DOM 的预期行为。这在尝试更新动态子项上的道具时给我造成了困扰。
解决方案:不要使用不打算使用的东西。
我正在构建一组窗体控件,这些控件对于开发人员来说真的很容易。状态树是通过映射子级并使用来动态构建的。从具有名称的元素中划定字符串名称,以在顶级组件上创建键和值。
顶层表单组件具有用于不同类型控件的onChange处理程序,并且根据需要将其应用于元素的onChange属性。这种映射是在componentWillMount方法中完成的,这就是导致我遇到问题的原因。
将映射移动到render方法可以使我不必更新句柄中的子级。手柄中的更新导致元素失去焦点。现在一切都好!
问题不cloneElement
在于改变您的钥匙。如文档中所述,cloneElement保留原始密钥。它React.Children.map
为其添加了前缀。如果您不希望更改键,请使用forEach
代替map
这是React代码的摘录:
function escape(key) {
var escapeRegex = /[=:]/g;
var escaperLookup = {
'=': '=0',
':': '=2',
};
var escapedString = ('' + key).replace(escapeRegex, function(match) {
return escaperLookup[match];
});
return '$' + escapedString;
}
function getComponentKey(component, index) {
// Do some typechecking here since we call this blindly. We want to ensure
// that we don't block potential future ES APIs.
if (
typeof component === 'object' &&
component !== null &&
component.key != null
) {
// Explicit key
return escape(component.key);
}
// Implicit key determined by the index in the set
return index.toString(36);
}
function mapSingleChildIntoContext(bookKeeping, child, childKey) {
var {result, keyPrefix, func, context} = bookKeeping;
var mappedChild = func.call(context, child, bookKeeping.count++);
if (Array.isArray(mappedChild)) {
mapIntoWithKeyPrefixInternal(
mappedChild,
result,
childKey,
emptyFunction.thatReturnsArgument,
);
} else if (mappedChild != null) {
if (ReactElement.isValidElement(mappedChild)) {
mappedChild = ReactElement.cloneAndReplaceKey(
mappedChild,
// Keep both the (mapped) and old keys if they differ, just as
// traverseAllChildren used to do for objects as children
keyPrefix +
(mappedChild.key && (!child || child.key !== mappedChild.key)
? escapeUserProvidedKey(mappedChild.key) + '/'
: '') +
childKey,
);
}
result.push(mappedChild);
}
}
function mapChildren(children, func, context) {
if (children == null) {
return children;
}
var result = [];
mapIntoWithKeyPrefixInternal(children, result, null, func, context);
return result;
}
正如标题所述,在中使用会导致元素键发生更改。 的第三个参数是ChildKey。它是用,它是中的第三个参数。 和在转义函数中返回前缀为$的键。 更新的问题: 顶级窗体组件具有用于不同类型控件的onChange处理程序,并根据需要将它们应用于元素的onChange属性。这个映射是在componentWillMount方法中完成的,也是导致我出现问题的原因。 将映射移动到render方法使我不必更新句柄
有没有一个“最佳实践”来改变流中的元素?我特别指的是流管道内的元素,而不是流管道外的元素。 例如,考虑这样的情况:我希望获取用户列表,为null属性设置默认值并将其打印到控制台。 编辑:官方的流java文档声明了少量的流操作,如forEach()和peek(),只能通过副作用来操作;这些应该小心使用。“鉴于这将是一个不干涉的行动,有什么特别使它危险呢?我所看到的例子涉及到管道之外,这显然是粗略的。
问题内容: 我有一个键为数字值的形式的关联数组,但是它不是顺序的数字值。密钥实际上是一个ID号,而值是一个计数。这在大多数情况下都很好,但是我想要一个函数,该函数获取数组的可读名称并将其用于键,而不更改值。 我没有看到执行此操作的函数,但是我假设我需要提供旧键和新键(我都拥有)并转换数组。有有效的方法吗? 问题答案:
尝试使用Hoare分区方案实现快速排序,但我遇到了一个问题,即无论数组大小如何,更改pivot的索引都会导致溢出。代码: 这个实现选择低索引(这里名为min)作为轴心元素,这样做很好。但是,将pivot元素更改为任何其他索引都会导致StackOverflow错误,而与正在排序的数组的大小无关。(错误参考第3行,其中调用了partition())我最好在(min,max)范围内随机选择pivot元素
我有一个priority_queue,我想修改它的一些内容(优先级值),那么这个队列会被使用吗? 这取决于它是使用Push/Pop(更有可能,因为你只需要“插入”,而不是整个使用),还是访问top或Pop。 我很想更改队列中的一些元素。大概是这样的:
本文向大家介绍为什么float会导致父元素塌陷?相关面试题,主要包含被问及为什么float会导致父元素塌陷?时的应答技巧和注意事项,需要的朋友参考一下 “当元素设置浮动后,会自动脱离文档流”, 翻译成白话就是说,元素浮动后,就不在整个文档流的管辖范围,那么它之前存在在父元素内的高度就随着浮动不复存在了,而此时父元素会默认自己里面没有任何内容 (前提是未给父元素设置固定高度,如果父元素本身有固定高度
img单击很少会失败,即使要获得单击的元素是相同的,也不会声称该元素不可单击。 我有一个对话框,包含一些按钮(关闭按钮与img X在里面)。 如您所见,元素是相同的。我开始怀疑这个元素的陈旧性,它的支持性,甚至元素移动的可能性。 下面是一个代码片段,其中包括调试消息,我将解释。 在执行单击之前: 正如您所看到的,内部HTML只是一个IMG: 因此,任何关于为什么会发生这种情况的建议都将非常感谢。
我对导航菜单中元素的位置有问题: 是我遇到问题的元素。我使用来定位标头中的元素。但是我对的位置有问题,我不能将它定位到右边。我在左边插入了一个填充来移动它,但这只是一个糟糕的解决方案。 您可以在CodePen中查看我的工作:http://codepen.io/marcvs/pen/JRmQjx