From 9611ced3785ede3da48ca2c8debcbf4918144491 Mon Sep 17 00:00:00 2001 From: fanbingkun <811757912@qq.com> Date: Mon, 6 Apr 2020 11:28:38 +0800 Subject: [PATCH] =?UTF-8?q?#632#=E8=8C=83=E7=A6=80=E5=9D=A4=E4=BD=9C?= =?UTF-8?q?=E4=B8=9A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/index.js | 2 +- src/react/ReactChildren.js | 48 +++++++++++++++++++++++++++++++++++++- src/react/ReactElement.js | 4 ++-- 3 files changed, 50 insertions(+), 4 deletions(-) diff --git a/src/index.js b/src/index.js index 8243347..4e84a73 100644 --- a/src/index.js +++ b/src/index.js @@ -7,7 +7,7 @@ class Child extends Component { const mappedChildren = React.Children.map( this.props.children, (item, index) => ( - [
{item}
,
{item}
] + [
{item}
, [2222],
{item}
] ) ); console.log(mappedChildren); diff --git a/src/react/ReactChildren.js b/src/react/ReactChildren.js index bbc07d8..2c3e1fc 100644 --- a/src/react/ReactChildren.js +++ b/src/react/ReactChildren.js @@ -1,6 +1,52 @@ +import {ReactElement} from './ReactElement' + function mapChildren(children, func, context) { //TODO实现此mapChildren方法 - return children; + let result = [] + for(let i = 0,len =children.length;i < len; i++) { + let child = children[i] + let newEl = null + if(Array.isArray(child)) { + child.forEach((item, index)=>{ + let oldkey = item.key ? item.key : i + newEl = func(child, i) + newEleChange(result, newEl, oldkey) + console.log(oldkey) + }) + }else{ + let oldkey = child.key ? child.key : i + newEl = func(child, i) + newEleChange(result, newEl, oldkey) + console.log(oldkey) + } + + } + console.log(result, 'jieguo') + return result; +} + +// key的算法不懂怎么弄 +function newEleChange(result, newEl, oldkey){ + if(Array.isArray(newEl)) { + for(let j = 0, len = newEl.length; j < len; j++) { + let subChild = newEl[j] + newEleChange(result, subChild, oldkey) + } + }else{ + replaceKeyAndClone(result, newEl, oldkey) + } +} + +function replaceKeyAndClone(result, oldEl, oldkey) { + result.push(ReactElement( + oldEl.type, + oldkey+'/'+(oldEl.key?oldEl.key:''), + oldEl.ref, + oldEl._self, + oldEl._source, + oldEl._owner, + oldEl.props, + )) } export { diff --git a/src/react/ReactElement.js b/src/react/ReactElement.js index 25fdf5e..823e9f5 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, @@ -71,4 +71,4 @@ function ReactElement(type, key, ref, _self, _source, _owner, props) { _source } return element; -} \ No newline at end of file +} -- Gitee