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