美文网首页
react hook 通信

react hook 通信

作者: 折叠幸福 | 来源:发表于2021-03-05 14:15 被阅读0次

react需要通信的情况,可以简单归类为:
1.父子之间
2.跨组件
3.跨react框架

1.一步到位的解决办法:events
events 在vue react angular甚至JQ里都能用到,
原理就是提交事件,监听事件.
维护的话,现在的IDE软件搜索事件名反应很快

安装:

npm install events --save

在项目入口或者utils建一个events.js

import { EventEmitter } from 'events';
 
export default new EventEmitter();

发送事件
比如子组件

import emitter from '@/utils/event.js';

const TopTitle = ({ count }) => {
 
  const handleMenuChange = useCallback((list, obj) => {
    emitter.emit('bindSelectChange', objParams);
  }, []);

  return (
    <SectionHead>
      <div className="left_wrap">
        <div className="left_title">XXX</div>
        <div className="left_num">{count}</div>
      </div>
      <div className="right_wrap">
        <div onChange={handleMenuChange} ></div>
      </div>
    </SectionHead>
  );
};

接收事件

 useEffect(() => {
    emitter.addListener('bindSelectChange', (data) => {
      //console.log(data);
      setBidParams(data);
    });
  },]);

2.父子通信
这个基本大家都会哈,大概思路是父组件传递一个函数给子组件,子组件在需要的时候调用这个父组件

父组件

const TendAndBid = ({ data, countNumber,onSelectChange }) => {
  return (
    <BidWrapper>
      <TopTitle count={countNumber} onSelect={onSelectChange}></TopTitle>
      <DownList item={data} ></DownList>
    </BidWrapper>
  );
};

子组件

const [objParams, setObjParams] = useState(null);
const handleMenuChange = useCallback((list, obj) => {
    setObjParams(() => {
      return obj_params;
    });
  }, []);

//子到父组件通信
  useEffect(() => {
    if (objParams) {
      onSelect(objParams)
    }
  }, [objParams]);

return (
    <SectionHead>
      <div className="left_wrap">
        <div className="left_title">XXX</div>
        <div className="left_num">{count}</div>
      </div>
      <div className="right_wrap">
        <Menu menuConfig={menuConfig} onChange={handleMenuChange} />
      </div>
    </SectionHead>
  );

3.跨父子通信
react hook 推荐的是useContext
比如爷孙组件通信,使用流程大致是
a.在爷爷组件创建一个context标签并初始化值,暴露出去

const ThemeContext = React.createContext(themes.light);

b.父组件引用爷爷组件,然后用标签包裹住要通信的组件的入口

function App() {
  return (
    <ThemeContext.Provider value={themes.dark}>
      <Toolbar />
    </ThemeContext.Provider>
  );
}

c.孙子组件通过useContext拿到该值

import { ThemeContext} from xxx
const theme = useContext(ThemeContext);

总的来说context必须通过createContext先造,提供给下层,下层才能通过useContext拿到
附上官网完整例子

const themes = {
  light: {
    foreground: "#000000",
    background: "#eeeeee"
  },
  dark: {
    foreground: "#ffffff",
    background: "#222222"
  }
};

const ThemeContext = React.createContext(themes.light);

function App() {
  return (
    <ThemeContext.Provider value={themes.dark}>
      <Toolbar />
    </ThemeContext.Provider>
  );
}

function Toolbar(props) {
  return (
    <div>
      <ThemedButton />
    </div>
  );
}

function ThemedButton() {
  const theme = useContext(ThemeContext);
  return (
    <button style={{ background: theme.background, color: theme.foreground }}>
      I am styled by theme context!
    </button>
  );
}

相关文章

  • react hook 通信

    react需要通信的情况,可以简单归类为:1.父子之间2.跨组件3.跨react框架 1.一步到位的解决办法:ev...

  • React Hook 组件通信

    React Hook 组件通信 与 以前版本思路一致,不多介绍,直接贴代码!!todoList为例子, 代码里还包...

  • React hook 10种 Hook

    React hook 10种 Hook (详细介绍及使用) React Hook是什么?React官网是这么介绍的...

  • 学习react hook的总结

    react16推出了react hook,react hook使得functional组件拥有了class组件的一...

  • react-hook-form使用

    官网地址:https://react-hook-form.com/[https://react-hook-form...

  • react hook介绍

    react hook是什么 react hook是react中引入新特性,它可以让react函数组件也拥有状态;通...

  • React Hook介绍与使用心得

    关于React Hook React Hook 对于React来说无疑是一个伟大的特性,它将React从类组件推向...

  • React Hook

    Through 4 questions introduce React Hook What is Hook? In...

  • react-hook

    react-hook

  • react hook入门

    一、react hook介绍 Hook 是 React 16.8 的新增特性。它可以让你在不编写 class 的情...

网友评论

      本文标题:react hook 通信

      本文链接:https://www.haomeiwen.com/subject/yjvrqltx.html