`

flattenChildren

 
阅读更多

flattenChildren模块用于将props.children子节点根据key值加以扁平化后输出。

 

/**
 * Copyright 2013-present, Facebook, Inc.
 * All rights reserved.
 *
 * This source code is licensed under the BSD-style license found in the
 * LICENSE file in the root directory of this source tree. An additional grant
 * of patent rights can be found in the PATENTS file in the same directory.
 *
 * 
 */

'use strict';

var KeyEscapeUtils = require('./KeyEscapeUtils');
var traverseAllChildren = require('./traverseAllChildren');
var warning = require('fbjs/lib/warning');

var ReactComponentTreeHook;

if (typeof process !== 'undefined' && process.env && process.env.NODE_ENV === 'test') {
  ReactComponentTreeHook = require('./ReactComponentTreeHook');
}

function flattenSingleChildIntoContext(traverseContext, child, name, selfDebugID) {
  if (traverseContext && typeof traverseContext === 'object') {
    var result = traverseContext;
    var keyUnique = result[name] === undefined;
    if (process.env.NODE_ENV !== 'production') {
      if (!ReactComponentTreeHook) {
        ReactComponentTreeHook = require('./ReactComponentTreeHook');
      }
      if (!keyUnique) {
        // ReactComponentTreeHook.getStackAddendumByID当key值相同,获取祖先节点的信息,警告用
        process.env.NODE_ENV !== 'production' ? 
          warning(false, 'flattenChildren(...): Encountered two children with the same key, ' 
            + '`%s`. Child keys must be unique; when two children share a key, only ' 
            + 'the first child will be used.%s', 
            KeyEscapeUtils.unescape(name), ReactComponentTreeHook.getStackAddendumByID(selfDebugID)) 
          : void 0;
      }
    }
    if (keyUnique && child != null) {
      result[name] = child;
    }
  }
}

// 由key值将子节点扁平化
function flattenChildren(children, selfDebugID) {
  if (children == null) {
    return children;
  }
  var result = {};

  if (process.env.NODE_ENV !== 'production') {
    // traverseAllChildren函数中,第三个参数result将作为第二个参数回调函数的首参,将子节点扁平化后输出
    traverseAllChildren(children, function (traverseContext, child, name) {
      return flattenSingleChildIntoContext(traverseContext, child, name, selfDebugID);
    }, result);
  } else {
    traverseAllChildren(children, flattenSingleChildIntoContext, result);
  }
  return result;
}

module.exports = flattenChildren;

 

0
0
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics