You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在按钮点击时调用React父组件的showMessage函数?

问题

我希望点击子组件的按钮时调用父组件的showMessage函数,从而显示“Message”文本,但不知道怎么实现。相关代码如下:

父组件(Message.js)

export default function Message({ component }) {
  const [state, setState] = useState(false);

  const showMessage = () => {
    setState(true);
  };

  return (
    <div>
      {component}
      {state ? <div>Message</div> : null}
    </div>
  );
}

使用父组件的代码(App.js)

import Message from "./message";

const EmbendComp = () => {
  const onClick = () => {
    alert("oooo");
  };
  return (
    <div className="App">
      <h1>Component</h1>
      <button onClick={onClick}>show Message</button>
    </div>
  );
};

export default function App() {
  return (
    <>
      <Message component={<EmbendComp />} />
    </>
  );
}
解决方案

当前核心问题是子组件EmbendComp无法获取父组件Message的showMessage函数,因为仅把EmbendComp作为属性传入,未传递回调逻辑。以下两种方法可以解决:

方法一:用React.cloneElement注入props

修改父组件Message,通过cloneElement克隆传入的组件,将showMessage作为props传递给子组件:

import { useState, cloneElement } from 'react';

export default function Message({ component }) {
  const [state, setState] = useState(false);

  const showMessage = () => {
    setState(true);
  };

  // 克隆组件并注入showMessage属性
  const injectedComponent = cloneElement(component, { showMessage });

  return (
    <div>
      {injectedComponent}
      {state ? <div>Message</div> : null}
    </div>
  );
}

接着修改EmbendComp,接收showMessage并在按钮点击时调用:

const EmbendComp = ({ showMessage }) => {
  const onClick = () => {
    showMessage();
  };
  return (
    <div className="App">
      <h1>Component</h1>
      <button onClick={onClick}>show Message</button>
    </div>
  );
};

方法二:通过children传递回调

调整Message组件的结构,让它接收一个函数类型的children,直接传递showMessage:

// Message.js
import { useState } from 'react';

export default function Message({ children }) {
  const [state, setState] = useState(false);

  const showMessage = () => {
    setState(true);
  };

  return (
    <div>
      {children(showMessage)}
      {state ? <div>Message</div> : null}
    </div>
  );
}

然后修改App组件的使用方式,将showMessage传递给EmbendComp:

// App.js
import Message from "./message";

const EmbendComp = ({ showMessage }) => {
  const onClick = () => {
    showMessage();
  };
  return (
    <div className="App">
      <h1>Component</h1>
      <button onClick={onClick}>show Message</button>
    </div>
  );
};

export default function App() {
  return (
    <>
      <Message>
        {(showMessage) => <EmbendComp showMessage={showMessage} />}
      </Message>
    </>
  );
}

完成以上修改后,点击按钮即可调用父组件的showMessage函数,显示“Message”文本。

内容的提问来源于stack exchange,提问作者user5711656

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 16:07:36