reactjs - 在React中,如何遍历整个渲染树,而不仅仅是 "children"

标签 reactjs

我有兴趣遍历 React 中的整个组件树。

假设我有一个组件:

class Child extends Component {
    //...
    render() {
        return <div>
            <span>Not reachable</span>
        </div>
    }
}

class Parent extends Component {
    //...
    traverse(children) {
        console.log(children);
        React.Children.map(this.traverse);
    }
    render() {
        this.traverse(this.props.children);
        return <div>{this.props.children}</div>
    }
}

class Container extends Component {
    //...
    render() {
        return <Parent>
            <Child />
        </Parent>
    }
}

我希望能够访问“无法访问”跨度,但是 React.Children.map 只遍历字面写的“子项”,而不是组件内部子项。

有什么方法可以访问遍历函数中的那些吗?

最佳答案

可以遍历树结构。您已经找到了 React.Children.map 方法,这已经做得很好了。这是深入研究的关键。

React.Children.map(this.props.children, child => {/* work with child */}) 使您可以访问 child 对象。如果 child 有 child ,则可以通过 child.props.children 访问它们。

您可以使用递归组件递归地遍历树结构。这是一个示例组件,它简单地呈现每个节点拥有的子节点数量。

const RecursiveWrapper = props => {
    const wrappedChildren = React.Children.map(
        props.children,
        child => {
            if (child.props && child.props.children) {
                return (
                    <RecursiveWrapper>
                        {child.props.children}
                    </RecursiveWrapper>
                )
            }
            return (
                <div>
                    {'children: 0'}
                </div>
            )
        }
    )
    return (
        <React.Fragment>
            {`children: ${wrappedChildren.length}`}
            <div>
                {wrappedChildren}
            </div>
        </React.Fragment>
    )
}

用更容易理解的东西替换每个子项,以创建此类包装器中包装的任何节点的树结构的可视化。

关于reactjs - 在React中,如何遍历整个渲染树,而不仅仅是 "children",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38227647/

相关文章:

javascript - React,有没有办法避免需要将 div 包裹在 div 中?

reactjs - 基于JSON加载子组件

javascript - 在 React Helmet/Gatsby 中插入自定义脚本

javascript - Passport.js - 将数据发送回react/redux应用程序,同时在登录后重定向

reactjs - 如何在 React.js 中传递项目数组

javascript - PushRef.set() 不是函数,Firebase 查询

reactjs - 如何在redux中过滤和排序相同的对象状态数组?

reactjs - 如何为Picker提供默认的 "Please select..."选项?

javascript - 防止 React 表在更新时滚动到顶部

javascript - 子组件如何在不监听生命周期方法的情况下从父组件接收 props?