当前位置:   article > 正文

react组件通信方式

react组件通信方式

1. 父组件向子组件通信

  1. // ParentComponent.js
  2. import React from 'react';
  3. import ChildComponent from './ChildComponent';
  4. function ParentComponent() {
  5. const message = 'Hello from parent!';
  6. return (
  7. <div>
  8. <ChildComponent message={message} />
  9. </div>
  10. );
  11. }
  12. export default ParentComponent;
  13. // ChildComponent.js
  14. import React from 'react';
  15. function ChildComponent(props) {
  16. return (
  17. <div>
  18. <p>{props.message}</p>
  19. </div>
  20. );
  21. }
  22. export default ChildComponent;

2. 子组件向父组件通信

  1. // ParentComponent.js
  2. import React, { useState } from 'react';
  3. import ChildComponent from './ChildComponent';
  4. function ParentComponent() {
  5. const [message, setMessage] = useState('');
  6. const handleMessage = (msg) => {
  7. setMessage(msg);
  8. };
  9. return (
  10. <div>
  11. <ChildComponent onMessage={handleMessage} />
  12. <p>Message from child: {message}</p>
  13. </div>
  14. );
  15. }
  16. export default ParentComponent;
  17. // ChildComponent.js
  18. import React from 'react';
  19. function ChildComponent(props) {
  20. const sendMessage = () => {
  21. props.onMessage('Hello from child!');
  22. };
  23. return (
  24. <button onClick={sendMessage}>Send Message</button>
  25. );
  26. }
  27. export default ChildComponent;

3. 跨级组件通信

  1. // App.js
  2. import React, { createContext, useContext } from 'react';
  3. import GrandParentComponent from './GrandParentComponent';
  4. const MessageContext = createContext();
  5. function App() {
  6. return (
  7. <MessageContext.Provider value={'Hello from App!'}>
  8. <GrandParentComponent />
  9. </MessageContext.Provider>
  10. );
  11. }
  12. export default App;
  13. // GrandParentComponent.js
  14. import React from 'react';
  15. import ParentComponent from './ParentComponent';
  16. function GrandParentComponent() {
  17. return (
  18. <div>
  19. <ParentComponent />
  20. </div>
  21. );
  22. }
  23. export default GrandParentComponent;
  24. // ParentComponent.js
  25. import React from 'react';
  26. import ChildComponent from './ChildComponent';
  27. import { MessageContext } from '../App';
  28. function ParentComponent() {
  29. const message = useContext(MessageContext);
  30. return (
  31. <div>
  32. <ChildComponent message={message} />
  33. </div>
  34. );
  35. }
  36. export default ParentComponent;
  37. // ChildComponent.js
  38. import React from 'react';
  39. function ChildComponent(props) {
  40. return (
  41. <div>
  42. <p>{props.message}</p>
  43. </div>
  44. );
  45. }
  46. export default ChildComponent;

4. 使用 Redux 进行全局状态管理

  1. // store.js
  2. import { createStore } from 'redux';
  3. const initialState = {
  4. message: '',
  5. };
  6. function rootReducer(state = initialState, action) {
  7. switch (action.type) {
  8. case 'SET_MESSAGE':
  9. return { ...state, message: action.payload };
  10. default:
  11. return state;
  12. }
  13. }
  14. const store = createStore(rootReducer);
  15. export default store;
  16. // App.js
  17. import React from 'react';
  18. import { Provider } from 'react-redux';
  19. import store from './store';
  20. import ComponentA from './ComponentA';
  21. function App() {
  22. return (
  23. <Provider store={store}>
  24. <ComponentA />
  25. </Provider>
  26. );
  27. }
  28. export default App;
  29. // ComponentA.js
  30. import React, { useEffect } from 'react';
  31. import { useSelector, useDispatch } from 'react-redux';
  32. function ComponentA() {
  33. const message = useSelector(state => state.message);
  34. const dispatch = useDispatch();
  35. useEffect(() => {
  36. dispatch({ type: 'SET_MESSAGE', payload: 'Hello from ComponentA!' });
  37. }, []);
  38. return (
  39. <div>
  40. <p>{message}</p>
  41. </div>
  42. );
  43. }
  44. export default ComponentA;
  45. // ComponentB.js
  46. import React, { useEffect } from 'react';
  47. import { useSelector, useDispatch } from 'react-redux';
  48. function ComponentB() {
  49. const message = useSelector(state => state.message);
  50. return (
  51. <div>
  52. <p>{message}</p>
  53. </div>
  54. );
  55. }
  56. export default ComponentB;

5. 使用 Refs 进行组件间通信

  1. // ParentComponent.js
  2. import React, { useRef } from 'react';
  3. import ChildComponent from './ChildComponent';
  4. function ParentComponent() {
  5. const childRef = useRef(null);
  6. const triggerMethod = () => {
  7. childRef.current.childMethod();
  8. };
  9. return (
  10. <div>
  11. <button onClick={triggerMethod}>Trigger Child Method</button>
  12. <ChildComponent ref={childRef} />
  13. </div>
  14. );
  15. }
  16. export default ParentComponent;
  17. // ChildComponent.js
  18. import React from 'react';
  19. class ChildComponent extends React.Component {
  20. childMethod = () => {
  21. console.log('Called from ParentComponent');
  22. };
  23. render() {
  24. return <div>Child Component</div>;
  25. }
  26. }
  27. export default ChildComponent;

6. 使用 Event Emitters 进行组件间通信

  1. // EventEmitter.js
  2. import Emitter from 'tiny-emitter/instance';
  3. const eventEmitter = new Emitter();
  4. export default eventEmitter;
  5. // ComponentC.js
  6. import React, { useEffect } from 'react';
  7. import eventEmitter from './EventEmitter';
  8. function ComponentC() {
  9. useEffect(() => {
  10. const handleEvent = (data) => {
  11. console.log('Received data:', data);
  12. };
  13. eventEmitter.on('my-event', handleEvent);
  14. return () => {
  15. eventEmitter.off('my-event', handleEvent);
  16. };
  17. }, []);
  18. return <div>Component C</div>;
  19. }
  20. export default ComponentC;
  21. // ComponentD.js
  22. import React, { useEffect } from 'react';
  23. import eventEmitter from './EventEmitter';
  24. function ComponentD() {
  25. useEffect(() => {
  26. eventEmitter.emit('my-event', 'Hello from ComponentD!');
  27. }, []);
  28. return <div>Component D</div>;
  29. }
  30. export default ComponentD;

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/笔触狂放9/article/detail/896362
推荐阅读
相关标签
  

闽ICP备14008679号