代码之家  ›  专栏  ›  技术社区  ›  Nick Retallack

当您从基于类的组件切换到基于函数的组件时,公共方法的替代方法是什么?

  •  -2
  • Nick Retallack  · 技术社区  · 4 年前

    使用钩子的React组件不能基于类;它们必须基于功能。我以前在基于类的组件中做过一些事情,但我不确定如何在基于函数的组件中完成:调用子组件上的方法。

    我想到的上下文是那些像地图或photoshop文档一样的组件。它们通常有一种方法可以缩放到特定的区域,同时也允许用户在之后自由地平移。

    我们可以设计这样一个 <Zoomable> 组件以保持有关其缩放到的位置的内部状态,但提供公共方法 zoomTo(place) .

    可以使用如下可缩放组件:

    const ZoomableUI = ({place}) => {
        const zoomable = React.useRef(null)
    
        React.useEffect(() => {
            zoomable.zoomTo(place)
        }, [place])
    
        return (
            <div>
                <Zoomable ref={zoomable} />
                <button onClick={() => zoomable.current.zoomTo(place)}>
                    Re-Center
                </button>
            </div>
        )
    }
    

    place

    当然,如果Zoomable是作为一个基于函数的组件实现的,那么这些都不起作用。您将如何使用基于函数的映射实现这种系统?

    顺便说一句,不要建议我把按钮放在可缩放范围内。它的目的是作为一个行为的例子,可以来自应用程序中的任何地方,而不一定是位于DOM中的某个地方。

    1 回复  |  直到 4 年前
        1
  •  0
  •   Nick Retallack    4 年前

    你可以把可缩放变成一个完全受控的组件。然后父组件将需要管理其缩放级别和位置。

    const ZoomableUI = ({place}) => {
        const [mapState, setMapState] = React.useState(place)
    
        React.useEffect(() => {
            setMapState(place)
        }, [place])
    
        return (
            <div>
                <Zoomable state={mapState} setState={setMapState} />
                <button onClick={() => setMapState(place)}>
                    Re-Center
                </button>
            </div>
        )
    }
    

    我看到的另一种可能性是把这个地方当作道具。可缩放的可能有一个内部 useEffect key 使其刷新状态。

    const ZoomableUI = ({place}) => {
        const [counter, setCounter] = React.useState(0)
        return (
            <div>
                <Zoomable place={place} key={counter} />
                <button onClick={() => setCounter((counter) => counter + 1)}>
                    Re-Center
                </button>
            </div>
        )
    }