在React中解决道具钻取有2种常见的方法

76 阅读1分钟

在React中解决道具钻取有2种常见的方法:使用ContextAPI/Redux和使用React Composition。

Context 在解决React中道具钻取的缺点:可重用性
例如,你有User 组件深度嵌套,而你想在其他Provider

    App
     |-- Homepage
           |-- User.Provider
                   |-- ... WhateverComponents
                         |---- ProfileComponent => use userData from provider here

如果我们想在其他容器中使用userData 呢?

App
  |-- Homepage
  |        |-- User.Provider
  |            |-- ... WhateverComponents
  |                  | ...
  |
  |-- Cart (what if we want to use userData in here?) userData will be empty here!

Context适合于在1个嵌套的Provider下向许多不同的组件传递props:

                                    App
                                     |
                                     |
                                  Homepage
                                     |
                                     |
                                User.Provider
                                     |
                                     |
                                _____________
                                |           |
                                |           |
                            Component1   Component2
                                |            |
                                |            |------------------------|
                            Component3       |                   Component5
                           (use userData)    |                        | 
                                             |                        |
                                          Component4              Component6
                                                                 (use userData)



有一种方法可以解决道具钻取的问题,那就是Component compose
我们可以用这样的代码重新编写上述结构:

// app.tsx
const App = () => {
    const userData = {...}
    return (
        <Homepage>
            <Component1>
                <Component3 data={userData} />
            </Component1>

            <Component2>
                <Component4 />
                <Component5>
                    <Component6 data={userData} />
                </Component5>
            </Component2>
        </Homepage>
    )
}

userData ,直接从容器中传出,而不需要通过父级组件。这也可以提高性能,因此当userData 改变时,只有使用它的组件会重新渲染。

React Composition的缺点:当你的容器越来越大时,可能会导致大量的深度嵌套组件层。对于这个问题,我们应该考虑把它们分割成更小的组件,并明智地决定每个容器应该需要和持有哪些道具。