当前位置: 首页 > news >正文

【React】基于自定义Hook提取公共逻辑

目录

  • 自定义Hook
    • 自定义Hook 1
    • 自定义Hook 2
    • 使用
  • 注意事项

在这里插入图片描述

自定义Hook

作用:提取封装一些公共的处理逻辑
玩法:创建一个函数,名字需要是 useXxx ,后期就可以在组件中调用这个方法!

自定义Hook 1

页面加载的时候修改浏览器标签的名字。

const useDidMount = function useDidMount(title) {
    if (!title) title = 'React';
    // 基于React内置的Hook函数,实现需求即可
    useEffect(() => {
        document.title = title;
    }, []);
};

自定义Hook 2

由于useState 返回的 set修改状态方法只能“修改单一的数据”,可能会对其他数据造成影响,所以我们这里自定义一个Hook,在修改单一数据的同时,不对其他数据造成影响。

useA 是一个自定义 Hook,它的功能是管理一个对象类型的状态,并提供一个更新该状态的函数 setA。参数:

  • val:这是 useA 接受的初始值,通常是一个对象,代表状态的初始值。

  • useState(val):它初始化状态 a,并返回一个数组,数组的第一个元素是当前的状态,第二个元素是更新该状态的函数(seta)。

  • setA(partialState):这个函数用来更新状态。它 接收一个部分状态(partialState),然后将其与当前状态合并 。这里使用了 ES6 的 … 扩展运算符,将当前状态 a 和部分更新的状态合并起来,确保只更新其中的某些字段,而不影响其他字段。

  • 返回值:返回一个数组:第一个元素是当前的状态 a,第二个元素是更新该状态的函数 setA。

const useA = function (val) {
    const [a, seta] = useState(val);
    const setA = function setA(partialState) {
        seta({
            ...a,
            ...partialState
        })
    }
    return [a, setA]
}

使用

const Demo = function Demo() {
    let [state, setA] = useA({
        supNum: 10,
        oppNum: 5
    });

    const handle = (type) => {
        if (type === 'sup') {
            setA({
                supNum: state.supNum + 1
            });
            return;
        }
        setA({
            oppNum: state.oppNum + 1
        });
    };
    useDidMount('哈哈哈哈哈');
    return <div className="vote-box">
        <div className="main">
            <p>支持人数:{state.supNum}</p>
            <p>反对人数:{state.oppNum}</p>
        </div>
        <div className="footer">
            <Button type="primary" onClick={handle.bind(null, 'sup')}>支持</Button>
            <Button type="primary" danger onClick={handle.bind(null, 'opp')}>反对</Button>
        </div>
    </div>;
};

注意事项

下面写法就会报错,因为命名使用use开头,React会进行检验Hook函数的规则。

const Demo = function Demo() {
 if(1==1){
    useDidMount('哈哈哈哈哈');
 }
}

如果不使用use开头,就不会报错,但是我们一般封装自定义Hook,要遵守Hook函数的规则

const Demo = function Demo() {

    AAA ('哈哈哈哈哈');

}

相关文章:

  • MySQL:float,decimal(1)
  • Python学习第二十一天
  • 风暴潮、潮汐潮流模拟:ROMS模型如何精准预测海洋现象?
  • 云盘搭建笔记
  • 《Python实战进阶》No42: 多线程与多进程编程详解(下)
  • 四种事件类型
  • 自适应柔顺性策略:扩散引导控制中学习近似的柔顺
  • Python中的null是什么?
  • 【C++进阶】深入探索类型转换
  • (electron 报错)TypeError: Cannot read property ‘upgrade‘ of undefined
  • Linux驱动开发-①中断②阻塞、非阻塞IO和异步通知
  • VLAN:逻辑隔离冲突网络的详细讲解
  • Android第四次面试(Java基础篇)
  • Unity动画片段丢失(AnimationClip),如何进行重新绑定
  • OpenCV旋转估计(5)图像拼接的一个函数waveCorrect()
  • 【云上CPU玩转AIGC】——腾讯云高性能应用服务HAI已支持DeepSeek-R1模型预装环境和CPU算力
  • 基于Spring Boot的本科生交流培养管理平台的设计与实现(LW+源码+讲解)
  • c++ XML库用法
  • 【机器学习-模型评估】
  • 【人工智能】如何理解transformer中的token?
  • 大外交|巴西总统卢拉第六次访华签署20项协议,“双方都视对方为机遇”
  • 足球少年郎7月试锋芒,明日之星冠军杯构建顶级青少年赛事
  • 中国-拉共体论坛第四届部长级会议北京宣言
  • 第四届长三角国际应急博览会开幕,超3000件前沿装备技术亮相
  • 董军同法国国防部长举行会谈
  • 对话郑永年:我们谈判也是为世界争公义