实用的 useSearchParam 钩子函数

why?

在 React 开发中,在 search 中获取 param 数据,十分常用,但是似乎但是每次都要手动的使用URLSearchParams 构造函数然后获取 params, 这其实不符合 React 的钩子函数的开发范式,可以将 param 的获取封装到自定义 hooks 中每次使用的时候,字节调用钩子函数即可。

封装一个通用的钩子函数需要考虑哪些问题?

以 react-use 为例,需要考虑这些问题

  • 当前环境,因为 react 有服务端渲染,考虑 nodejs 环境
  • 通过 URLSearchParams 获取 search params
  • 同时需要监听路由的变化:popstate/pushstate/replacestate 这些变化

实现

ts 复制代码
import { useEffect, useState } from 'react';
import { isBrowser, off, on } from './misc/util';

const getValue = (search: string, param: string) => new URLSearchParams(search).get(param);

export type UseQueryParam = (param: string) => string | null;

const useSearchParam: UseQueryParam = (param) => {
  const location = window.location;
  const [value, setValue] = useState<string | null>(() => getValue(location.search, param));

  useEffect(() => {
    const onChange = () => {
      setValue(getValue(location.search, param));
    };

    on(window, 'popstate', onChange);
    on(window, 'pushstate', onChange);
    on(window, 'replacestate', onChange);

    return () => {
      off(window, 'popstate', onChange);
      off(window, 'pushstate', onChange);
      off(window, 'replacestate', onChange);
    };
  }, []);

  return value;
};

const useSearchParamServer = () => null;

export default isBrowser ? useSearchParam : useSearchParamServer;
  • 名字需要以 use 开头。
  • getValue 函数封装是需要传入 search 和 需要查找的目标 param 封装在函里面计算目标数据。
  • 定义状态保存目标 param 的状态,和更新 param 的函数。
  • 返回值是 value, 也就是查询的 param 的值。
  • 由于路由可能发生变化, 在 useEffect 中完成对实践的监听,并使用 getValue 重新计算。

小结

写这篇文章目的是在一些通用的,和符合规范的方面,尽量与规范靠齐。同时学会自己封装一个通用的函数,钩子函数。加速自己的开发效率。

相关推荐
酉鬼女又兒28 分钟前
零基础快速入门前端ES6 核心特性详解:Set 数据结构与对象增强写法(可用于备赛蓝桥杯Web应用开发)
开发语言·前端·javascript·职场和发展·蓝桥杯·es6
慧一居士31 分钟前
Vue项目中,子组件调用父组件方法示例,以及如何传值示例,对比使用插槽和不使用插槽区别
前端·vue.js
我是伪码农1 小时前
HTML和CSS复习
前端·css·html
林恒smileZAZ1 小时前
前端实现进度条
前端
前端老石人1 小时前
邂逅前端开发:从基础到实践的全景指南
开发语言·前端·html
阿珊和她的猫1 小时前
以用户为中心的前端性能指标解析
前端·javascript·css
木心术11 小时前
OpenClaw网页前端开发与优化全流程指南
前端·人工智能
Amumu121381 小时前
HTML5的新特性
前端·html·html5
SeSs IZED1 小时前
【Nginx 】Nginx 部署前端 vue 项目
前端·vue.js·nginx
叫我一声阿雷吧1 小时前
JS 入门通关手册(36):变量提升、暂时性死区与块级作用域
javascript·变量提升·暂时性死区·tdz·块级作用域· 前端面试