reactjs 将一次性信息从组件传递到React中的祖先组件

umuewwlo  于 2023-08-04  发布在  React
关注(0)|答案(1)|浏览(93)

我有一个组件的结构,像这样:

<Ancestor>
  ...
    ...
      ...
         <Child thing="foo"/>
         <Child thing="bar"/>
         ...
      ...
         <Child thing="foo" />

字符串
如果祖先知道所有最终子组件的“事物”值的所有值,那将是非常有用的。这些值在每个组件的生命周期中永远不会改变。
我知道这是可以使用useContext实现的,或者一直向下传递回调。但在这个简化的例子中,这些 prop 没有改变,我想知道是否有更简单的解决方案。

to94eoyn

to94eoyn1#

解决方案是使用遗留的React API Children.forEach(children, fn, thisArg?)
Ancestor组件树中递归查找所有Child组件的thing属性。

import './styles.css';
import React, { useMemo } from 'react';

const getChildThing = (children) => {
    const things = [];
    const work = (arr) => {
        React.Children.forEach(arr, (c) => {
            if (c.type === Child) {
                things.push(c.props.thing);
            } else if (c.props.children) {
                return work(c.props.children);
            }
        });
    };
    work(children);
    return things;
};

const Child = ({ thing }) => <div>{thing}</div>;
const Ancestor = ({ children }) => {
    const things = useMemo(() => getChildThing(children), [children]);
    console.log(things);
    return <div>{children}</div>;
};

export default function App() {
    return (
        <div className="App">
            <Ancestor>
                <Child thing="a" />
                <Child thing="b" />
                <div>
                    <Child thing="c" />
                    <div>
                        <Child thing="d" />
                        <div>
                            <Child thing="e" />
                        </div>
                    </div>
                </div>
            </Ancestor>
        </div>
    );
}

字符串
日志:

["a", "b", "c", "d", "e"]


codesandbox

相关问题