当前位置: 首页 > 知识库问答 >
问题:

react.children.map中的react.cloneElement导致元素键更改

马航
2023-03-14

正如标题所述,在react.cloneElement中使用react.children.map会导致元素键发生更改。

React.Children.map(children, (child) => {
    let clonedEl = React.cloneElement( child );
    console.log(clonedEl);
    return clonedEl;
});

MapSingleChildIntoContext的第三个参数是ChildKey。它是用namesofar===''调用的?SEPARATOR+getComponentKey(children,0):namesofar,它是TraverSeallChildrenImpl中的第三个参数。

separator=“.”GetComponentKey在转义函数中返回前缀为$的键。

更新的问题:

顶级窗体组件具有用于不同类型控件的onChange处理程序,并根据需要将它们应用于元素的onChange属性。这个映射是在componentWillMount方法中完成的,也是导致我出现问题的原因。

将映射移动到render方法使我不必更新句柄中的子句。在句柄中更新会导致元素失去焦点。现在一切都好了!

共有1个答案

韩弘壮
2023-03-14

问题不在于更改密钥的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;
}
 类似资料:
  • 问题内容: 我有一个键为数字值的形式的关联数组,但是它不是顺序的数字值。密钥实际上是一个ID号,而值是一个计数。这在大多数情况下都很好,但是我想要一个函数,该函数获取数组的可读名称并将其用于键,而不更改值。 我没有看到执行此操作的函数,但是我假设我需要提供旧键和新键(我都拥有)并转换数组。有有效的方法吗? 问题答案:

  • 尝试使用Hoare分区方案实现快速排序,但我遇到了一个问题,即无论数组大小如何,更改pivot的索引都会导致溢出。代码: 这个实现选择低索引(这里名为min)作为轴心元素,这样做很好。但是,将pivot元素更改为任何其他索引都会导致StackOverflow错误,而与正在排序的数组的大小无关。(错误参考第3行,其中调用了partition())我最好在(min,max)范围内随机选择pivot元素

  • 我有一个priority_queue,我想修改它的一些内容(优先级值),那么这个队列会被使用吗? 这取决于它是使用Push/Pop(更有可能,因为你只需要“插入”,而不是整个使用),还是访问top或Pop。 我很想更改队列中的一些元素。大概是这样的:

  • 我使用引导可编辑插件允许用户编辑屏幕上的字段。单击其中一个字段时,会显示一个小弹出窗口,允许用户从下拉列表中进行选择,下拉列表旁边有一个复选标记,以允许用户将值应用于该字段。我的标记有一个简单的锚,看起来像这样: 我的jQuery代码具有以下功能:使用引导启用此功能: 如果您注意到我的标记有一个默认值为"0"的data-value属性。 我遇到的问题是当用户从下拉列表中选择另一个项目并单击复选标记

  • 本文向大家介绍为什么float会导致父元素塌陷?相关面试题,主要包含被问及为什么float会导致父元素塌陷?时的应答技巧和注意事项,需要的朋友参考一下 “当元素设置浮动后,会自动脱离文档流”, 翻译成白话就是说,元素浮动后,就不在整个文档流的管辖范围,那么它之前存在在父元素内的高度就随着浮动不复存在了,而此时父元素会默认自己里面没有任何内容 (前提是未给父元素设置固定高度,如果父元素本身有固定高度

  • img单击很少会失败,即使要获得单击的元素是相同的,也不会声称该元素不可单击。 我有一个对话框,包含一些按钮(关闭按钮与img X在里面)。 如您所见,元素是相同的。我开始怀疑这个元素的陈旧性,它的支持性,甚至元素移动的可能性。 下面是一个代码片段,其中包括调试消息,我将解释。 在执行单击之前: 正如您所看到的,内部HTML只是一个IMG: 因此,任何关于为什么会发生这种情况的建议都将非常感谢。