diff --git a/src/react/ReactChildren.js b/src/react/ReactChildren.js index bbc07d81edaad3705a3dca0942e1cbc01bff2624..48a591662fdba459377b5dc94876b0d59af44334 100644 --- a/src/react/ReactChildren.js +++ b/src/react/ReactChildren.js @@ -1,6 +1,91 @@ +/** + * 输入数据: +0: {$$typeof: Symbol(react.element), type: "div", key: null, ref: null, props: {…}, …} +1: {$$typeof: Symbol(react.element), type: "div", key: "key2", ref: null, props: {…}, …} +2: {$$typeof: Symbol(react.element), type: "div", key: "key3", ref: null, props: {…}, …} +3: Array(3) + 0: {$$typeof: Symbol(react.element), type: "div", key: "key4", ref: null, props: {…}, …} + 1: {$$typeof: Symbol(react.element), type: "div", key: "key5", ref: null, props: {…}, …} + 2: {$$typeof: Symbol(react.element), type: "div", key: "key6", ref: null, props: {…}, …} + * 输出数据: +0: {$$typeof: Symbol(react.element), type: "div", key: ".0/.$div0A", ref: null, props: {…}, …} +1: {$$typeof: Symbol(react.element), type: "div", key: ".0/.$div0B", ref: null, props: {…}, …} +2: {$$typeof: Symbol(react.element), type: "div", key: ".$key2/.$div1A", ref: null, props: {…}, …} +3: {$$typeof: Symbol(react.element), type: "div", key: ".$key2/.$div1B", ref: null, props: {…}, …} +4: {$$typeof: Symbol(react.element), type: "div", key: ".$key3/.$div2A", ref: null, props: {…}, …} +5: {$$typeof: Symbol(react.element), type: "div", key: ".$key3/.$div2B", ref: null, props: {…}, …} +6: {$$typeof: Symbol(react.element), type: "div", key: ".3:$key4/.$div3A", ref: null, props: {…}, …} +7: {$$typeof: Symbol(react.element), type: "div", key: ".3:$key4/.$div3B", ref: null, props: {…}, …} +8: {$$typeof: Symbol(react.element), type: "div", key: ".3:$key5/.$div4A", ref: null, props: {…}, …} +9: {$$typeof: Symbol(react.element), type: "div", key: ".3:$key5/.$div4B", ref: null, props: {…}, …} +10: {$$typeof: Symbol(react.element), type: "div", key: ".3:$key6/.$div5A", ref: null, props: {…}, …} +11: {$$typeof: Symbol(react.element), type: "div", key: ".3:$key6/.$div5B", ref: null, props: {…}, …} + * 转换思路: + * 1,flatten + * 2,flatten后的每一项带入func + */ +import { createElement } from './ReactElement'; + function mapChildren(children, func, context) { - //TODO实现此mapChildren方法 - return children; + let clonedArr = cloneElement(children); + //1,flatten + let flattenArr = flatten(clonedArr); + /** +0: {$$typeof: Symbol(react.element), type: "div", key: ".0", ref: null, props: {…}, …} +1: {$$typeof: Symbol(react.element), type: "div", key: ".$key2", ref: null, props: {…}, …} +2: {$$typeof: Symbol(react.element), type: "div", key: ".$key3", ref: null, props: {…}, …} +3: {$$typeof: Symbol(react.element), type: "div", key: ".3:$key4", ref: null, props: {…}, …} +4: {$$typeof: Symbol(react.element), type: "div", key: ".3:$key5", ref: null, props: {…}, …} +5: {$$typeof: Symbol(react.element), type: "div", key: ".3:$key6", ref: null, props: {…}, …} + */ + //2,带入func + let resultArr = []; + for (let i = 0; i < flattenArr.length; i++) { + const {key, props} = flattenArr[i]; + const tmp = flatten(func(props.children, i), `${key}/.`); + resultArr.push(...tmp); + } + /** +0: {$$typeof: Symbol(react.element), type: "div", key: ".0/.$div0A", ref: null, props: {…}, …} +1: {$$typeof: Symbol(react.element), type: "div", key: ".0/.$div0B", ref: null, props: {…}, …} +2: {$$typeof: Symbol(react.element), type: "div", key: ".$key2/.$div1A", ref: null, props: {…}, …} +3: {$$typeof: Symbol(react.element), type: "div", key: ".$key2/.$div1B", ref: null, props: {…}, …} +4: {$$typeof: Symbol(react.element), type: "div", key: ".$key3/.$div2A", ref: null, props: {…}, …} +5: {$$typeof: Symbol(react.element), type: "div", key: ".$key3/.$div2B", ref: null, props: {…}, …} +6: {$$typeof: Symbol(react.element), type: "div", key: ".3:$key4/.$div3A", ref: null, props: {…}, …} +7: {$$typeof: Symbol(react.element), type: "div", key: ".3:$key4/.$div3B", ref: null, props: {…}, …} +8: {$$typeof: Symbol(react.element), type: "div", key: ".3:$key5/.$div4A", ref: null, props: {…}, …} +9: {$$typeof: Symbol(react.element), type: "div", key: ".3:$key5/.$div4B", ref: null, props: {…}, …} +10: {$$typeof: Symbol(react.element), type: "div", key: ".3:$key6/.$div5A", ref: null, props: {…}, …} +11: {$$typeof: Symbol(react.element), type: "div", key: ".3:$key6/.$div5B", ref: null, props: {…}, …} + */ + return resultArr; +} + +function cloneElement(children) { + let result; + if (Array.isArray(children)) { + result = [children.length]; + for (let i = 0; i < children.length; i++) { + result[i] = cloneElement(children[i]); + } + } else { + const {type, key} = children; + result = createElement(type, {key}, children); + } + return result; +} + +function flatten(arr, prefix = '.') { + return arr.reduce((prev, curr, index) => { + if (Array.isArray(curr)) { + prev = prev.concat(flatten(curr, `${prefix}${index}:`)); + } else { + curr.key = curr.key == null ? `${prefix}${index}` : `${prefix}$${curr.key}`; + prev = prev.concat(curr); + } + return prev; + }, []); } export {