摘要

本文总结几种常见的 react 组件通讯方式,帮助新手玩家快速完成开发任务。

父子组件通信

父组件传递数据给子组件:

// ParentComponent.jsx
import React from 'react';
import ChildComponent from './ChildComponent';

function ParentComponent() {
  const message = "Hello from Parent";

  return (
    <div>
      <h1>Parent Component</h1>
      <ChildComponent message={message} />
    </div>
  );
}

export default ParentComponent;

// ChildComponent.jsx
import React from 'react';

function ChildComponent({ message }) {
  return (
    <div>
      <h2>Child Component</h2>
      <p>{message}</p>
    </div>
  );
}

export default ChildComponent;

子组件向父组件传递数据:

// ParentComponent.jsx
import React, { useState } from 'react';
import ChildComponent from './ChildComponent';

function ParentComponent() {
  const [message, setMessage] = useState("");

  const handleMessage = (msg) => {
    setMessage(msg);
  };

  return (
    <div>
      <h1>Parent Component</h1>
      <p>Message from Child: {message}</p>
      <ChildComponent onMessage={handleMessage} />
    </div>
  );
}

export default ParentComponent;

// ChildComponent.jsx
import React from 'react';

function ChildComponent({ onMessage }) {
  const sendMessage = () => {
    onMessage("Hello from Child");
  };

  return (
    <div>
      <h2>Child Component</h2>
      <button onClick={sendMessage}>Send Message to Parent</button>
    </div>
  );
}

export default ChildComponent;

兄弟组件通信

兄弟组件之间的通信通常通过提升状态到共同的父组件来实现。

// ParentComponent.jsx
import React, { useState } from 'react';
import FirstChild from './FirstChild';
import SecondChild from './SecondChild';

function ParentComponent() {
  const [message, setMessage] = useState("");

  return (
    <div>
      <h1>Parent Component</h1>
      <FirstChild setMessage={setMessage} />
      <SecondChild message={message} />
    </div>
  );
}

export default ParentComponent;

// FirstChild.jsx
import React from 'react';

function FirstChild({ setMessage }) {
  const sendMessage = () => {
    setMessage("Hello from First Child");
  };

  return (
    <div>
      <h2>First Child</h2>
      <button onClick={sendMessage}>Send Message</button>
    </div>
  );
}

export default FirstChild;

// SecondChild.jsx
import React from 'react';

function SecondChild({ message }) {
  return (
    <div>
      <h2>Second Child</h2>
      <p>Message: {message}</p>
    </div>
  );
}

export default SecondChild;

使用 Context API 进行跨层级组件通信

// MessageContext.js
import React, { createContext, useState } from "react";

export const MessageContext = createContext();

export const MessageProvider = ({ children }) => {
  const [message, setMessage] = useState("Default Message");

  return (
    <MessageContext.Provider value={{ message, setMessage }}>
      {children}
    </MessageContext.Provider>
  );
};
// ParentComponent.jsx
import React from "react";
import { MessageProvider } from "./MessageContext";
import FirstChild from "./FirstChild";
import SecondChild from "./SecondChild";

function ParentComponent() {
  return (
    <MessageProvider>
      <div>
        <h1>Parent Component</h1>
        <FirstChild />
        <SecondChild />
      </div>
    </MessageProvider>
  );
}

export default ParentComponent;
// FirstChild.jsx
import React, { useContext } from "react";
import { MessageContext } from "./MessageContext";

function FirstChild() {
  const { setMessage } = useContext(MessageContext);

  const sendMessage = () => {
    setMessage("Hello from First Child via Context");
  };

  return (
    <div>
      <h2>First Child</h2>
      <button onClick={sendMessage}>Send Message</button>
    </div>
  );
}

export default FirstChild;
// SecondChild.jsx
import React, { useContext } from "react";
import { MessageContext } from "./MessageContext";

function SecondChild() {
  const { message } = useContext(MessageContext);

  return (
    <div>
      <h2>Second Child</h2>
      <p>Message: {message}</p>
    </div>
  );
}

export default SecondChild;

插槽(使用 props.children

// ParentComponent.jsx
import React from 'react';
import SlotComponent from './SlotComponent';

function ParentComponent() {
  return (
    <div>
      <h1>Parent Component</h1>
      <SlotComponent>
        <p>This is a slot content from Parent</p>
      </SlotComponent>
    </div>
  );
}

export default ParentComponent;

// SlotComponent.jsx
import React from 'react';

function SlotComponent({ children }) {
  return (
    <div>
      <h2>Slot Component</h2>
      <div>{children}</div>
    </div>
  );
}

export default SlotComponent;