diff --git a/src/react/ReactChildren.js b/src/react/ReactChildren.js index bbc07d81edaad3705a3dca0942e1cbc01bff2624..3ad614637db48974ba8b6d095d192e95baa3210f 100644 --- a/src/react/ReactChildren.js +++ b/src/react/ReactChildren.js @@ -1,8 +1,28 @@ -function mapChildren(children, func, context) { +import {ReactElement} from './ReactElement' +function mapChildren(children, callback, context) { //TODO实现此mapChildren方法 - return children; + var newChildren = []; + var indexObj = { index: 0 };//需要是个引用类型,值类型的话,递归函数内修改了,但是外边不知道,仍然以旧值循环 + traversalAll(children, newChildren, indexObj, callback); + return newChildren; } +function traversalAll(children, res, indexObj, callback, prefix = '') { + if (!children) { + return null; + } + if (Array.isArray(children)) { + for (let k = 0; k < children.length; k++) { + let spelator = prefix ? ':' : '.' + let newPrefixName = prefix + spelator + k; + traversalAll(children[k], res, indexObj, callback, newPrefixName); + } + } else { + var oldElement = children; + var clonedElement = ReactElement(oldElement.type, prefix, oldElement.ref, oldElement._self, oldElement._source, oldElement._owner, oldElement.props); + res.push(callback(clonedElement, indexObj.index++)) + } +} export { mapChildren as map, }; \ No newline at end of file diff --git a/src/react/ReactElement.js b/src/react/ReactElement.js index 25fdf5ea1b24116f963f57890892d03e3d2e3a78..0d33b6040f66d22e6b51fdd4050e5f73af862f8a 100644 --- a/src/react/ReactElement.js +++ b/src/react/ReactElement.js @@ -59,7 +59,7 @@ export function createElement(type, config, children) { type, key, ref, self, source, ReactCurrentOwner.current, props ) } -function ReactElement(type, key, ref, _self, _source, _owner, props) { +export function ReactElement(type, key, ref, _self, _source, _owner, props) { const element = { $$typeof: REACT_ELEMENT_TYPE, type,