Reactjs中如何从子组件调用父容器函数

How to call Parent containers function from child component in Reactjs

我的应用程序由用户呈现动态图块,需要根据外部配置重新排列图块,StyleWrapper 需要是一个通用的容器组件,也可以在其他项目中使用。以下是我们的 UI 组件结构:

<StyleWrapper>
 <Header />
 <Content>
  <PortletTiles />
 </Content>
</StyleWrapper>

鉴于上述结构,我在 StyleWrapper.tsx 中有一个名为 arrangeTiles() 的函数,它根据外部配置排列图块。

我的问题是如何从子组件调用 arrangeTiles() 函数 PortletTiles.tsx

StyleWrapper.tsx --> Parent Wrapper Container 组件

function StyleWrapper(props:any) {
  let arrangeTiles= () => {  
    // Arrange Tile logic
  };
  return (
    <div id="cnplStyleWrapper">
        {props.children}
    </div>
  );
}

export default StyleWrapper;

PortletTiles.tsx --> 子组件

function PortletTiles(props:any) {
  let addNewTile= () => {  
    // Some logic to render tile here.. then 
    // How to call parent container's arrangeTiles function?
  };
  return (
    <div>
        <button onClick={addNewTile}>Add Tile</button>
    </div>
  );
}
export default PortletTiles;

您可以创建一个 context 并将函数或任何其他道具作为 value 传递。 useContext 可用于使用提供者传递的 value

type ContextValue = {
  arrangeTiles: () => void;
};

const Context = createContext<ContextValue>({
  arrangeTiles: () => {}
});

const StyleWrapper: FC = (props) => {
  let arrangeTiles = () => {
    // Arrange Tile logic
    alert("Tiles have been arranged!");
  };
  return (
    <Context.Provider value={{ arrangeTiles }}>
      <div id="cnplStyleWrapper">{props.children}</div>
    </Context.Provider>
  );
};

const PortletTiles: FC = (props) => {
  const { arrangeTiles } = useContext(Context);

  let addNewTile = () => {
    arrangeTiles();
  };
  return (
    <div>
      <button onClick={addNewTile}>Add Tile</button>
    </div>
  );
};

export default function App() {
  return (
    <StyleWrapper>
      <PortletTiles />
    </StyleWrapper>
  );
}


如果您的应用已经使用了 redux,那么您可以将 arrangeTiles 移动到 reducer 并从组件中调度操作。

最简单的方法是使用上下文 API。这使您能够拥有可以跨不同组件引用和操作的状态。您可以参考上下文文档 API here.

import { createContext } from "react";

const AppContext = createContext();

const AppProvider = (props) => {
  

  const arrangeTiles = () => {
    // place function code here
  };

  return (
    <AppContext.Provider value={{arrangetiles}}>
      {props.children}
    </SiteContext.Provider>
  );
};

const AppConsumer = AppContext.Consumer;

export { AppContext, AppConsumer };

export default AppProvider;

在 AppProvider 中包装您的应用程序组件

在子组件中,需要引入rearrangeTiles函数才能使用:

import { useContext } from "react";

const { rearrangeTiles } = useContext(AppContext);