【整活】👉被玩坏的React hook组件通信👈

简介: 【整活】👉被玩坏的React hook组件通信👈

大家好,我是「萌萌哒草头将军」,感兴趣的小伙伴可以关注我公众号「萌萌哒草头将军」,近期有抽奖哦~

今天给大家表演个杂技,有赞的捧个赞场,没赞的捧个人场,可怜可怜我吧!!!

👉useImperativeHandle杂技

语法:useImperativeHandle(ref, createHandle, dependencies?)

用法:

🎉 向父组件暴露一个自定义的 ref 句柄

🎉 暴露你自己的命令式方法

我们采用自定义命令方法的方式进行表演,如下

🎁 父组件改变子组件的值

import { useRef } from 'react';
import Child from './Child.js';
export default function Form() {
  const ref = useRef(null);
  function handleClick() {
    ref.current.buy('apple');
  }
  return (
    <form>
      <Child label="Enter your name:" ref={ref} />
      <button type="button" onClick={handleClick}>
        Edit
      </button>
    </form>
  );
}
import { forwardRef, useImperativeHandle, useState } from 'react';
const Child = forwardRef(function MyInput(props, ref) {
  const [goods, setGoods] = useState(null)
  useImperativeHandle(ref, () => {
    return {
      buy (goods) {
        setGoods(goods)
      },
    };
  }, []);
  return <div>{goods}</div>;
});
export default Child;

👉使用设计模式杂技

在线Demo看这里

这里需要借助之前提到的中介者模式

import { useEffect, useState } from "react";
import { mediator } from "./index";
// 事件订阅器
export const useGetEvent = (topic) => {
    const sub = mediator.install({});
    const [data, setData] = useState(0);
    sub.subscribe(topic, setData);
    return data;
};
// 事件发布器
export const useSetEvent = (topic, value) => {
    const sub = mediator.install({});
    useEffect(() => sub.publish(topic, value), [value]);
    return [];
};
// app
import React, { useState } from "react";
import { Child } from "./child";
import { useSetEvent } from "./useEvent";
const App = () => {
    const [count, setCount] = useState(0);
    useSetEvent("count", count);
    return (
        <div>
            {count}
            <br />
            <button onClick={() => setCount((curr) => curr + 1)}>add +</button>
            <Child />
        </div>
    );
};
// child
import { useEffect } from "react";
import { useGetEvent } from "./useEvent";
export const Child = () => {
    const sub = useGetEvent("count");
    useEffect(() => console.log(sub), [sub]);
    return <div></div>;
};

事实上不止子组件,全局组件可以实现

好了,今天就表演到这了,感谢大家的捧场

相关文章
|
6月前
|
资源调度 前端开发 JavaScript
React 的antd-mobile 组件库,嵌套路由
React 的antd-mobile 组件库,嵌套路由
122 0
|
2月前
|
消息中间件 前端开发
React技术栈-组件间通信的2种方式
本文介绍了React技术栈中组件间通信的两种方式:通过props传递数据和使用消息发布(publish)-订阅(subscribe)机制,并通过实例代码展示了如何使用PubSubJS库实现跨组件通信。
55 11
React技术栈-组件间通信的2种方式
|
3月前
|
前端开发
React 中的 Hook 概念
【8月更文挑战第31天】
34 0
|
4月前
|
前端开发
React useImperativeHandle Hook
【7月更文挑战第1天】React useImperativeHandle Hook
28 3
|
4月前
|
前端开发 JavaScript 数据格式
react18【系列实用教程】Hooks (useState,useReducer,useRef,useEffect,useContext,useMemo,useCallback,自定义 Hook )
react18【系列实用教程】Hooks (useState,useReducer,useRef,useEffect,useContext,useMemo,useCallback,自定义 Hook )
94 1
|
5月前
|
存储 前端开发 JavaScript
在React中有效地管理组件之间的通信和数据流
在React中有效地管理组件之间的通信和数据流
|
4月前
|
前端开发
Vue3 【仿 react 的 hook】封装 useTitle
Vue3 【仿 react 的 hook】封装 useTitle
50 0
|
4月前
|
前端开发 API
Vue3 【仿 react 的 hook】封装 useLocation
Vue3 【仿 react 的 hook】封装 useLocation
40 0
|
6月前
|
前端开发 JavaScript
【边做边学】React Hooks (二)——useEffect Hook
【边做边学】React Hooks (二)——useEffect Hook
|
6月前
|
存储 前端开发 中间件
React组件间的通信
React组件间的通信
52 1