React组件复用:自定义Hook减少80%重复代码(react的组件)

一、3个高频场景实战:从重复代码到Hook封装

场景1:数据请求逻辑复用(useFetch)

问题:多个组件重复编写“加载中/错误处理/数据缓存”的API请求逻辑。

重复代码示例

javascript

// 组件A:获取用户数据

function UserProfile() {

const [user, setUser] = useState(null);

const [loading, setLoading] = useState(true);

const [error, setError] = useState(null);

useEffect(() => {

fetch('/api/user')

.then(res => res.json())

.then(data => { setUser(data); setLoading(false); })

.catch(err => { setError(err); setLoading(false); });

}, []);

// ...渲染UI

}

// 组件B:获取商品列表(重复相同逻辑)

function ProductList() {

const [products, setProducts] = useState(null);

const [loading, setLoading] = useState(true);

const [error, setError] = useState(null);

useEffect(() => {

fetch('/api/products')

.then(res => res.json())

.then(data => { setProducts(data); setLoading(false); })

.catch(err => { setError(err); setLoading(false); });

}, []);

// ...渲染UI

}

自定义Hook封装(useFetch)

javascript

// hooks/useFetch.js

function useFetch(url) {

const [data, setData] = useState(null);

const [loading, setLoading] = useState(true);

const [error, setError] = useState(null);

useEffect(() => {

const fetchData = async () => {

try {

const res = await fetch(url);

const result = await res.json();

setData(result);

} catch (err) {

setError(err);

} finally {

setLoading(false);

}

};

fetchData();

}, [url]);

return { data, loading, error }; // 返回状态供组件使用

}

组件使用Hook后

javascript

// 组件A:获取用户数据(一行调用)

function UserProfile() {

const { data: user, loading, error } = useFetch('/api/user');

// ...渲染UI

}

// 组件B:获取商品列表(一行调用)

function ProductList() {

const { data: products, loading, error } = useFetch('/api/products');

// ...渲染UI

}

---

场景2:表单处理逻辑复用(useForm)

问题:多个表单组件重复处理“输入值绑定、表单提交、重置”逻辑。

自定义Hook封装(useForm)

javascript

// hooks/useForm.js

function useForm(initialValues) {

const [values, setValues] = useState(initialValues);

// 处理输入变化

const handleChange = (e) => {

const { name, value } = e.target;

setValues({ ...values, [name]: value });

};

// 重置表单

const resetForm = () => setValues(initialValues);

return { values, handleChange, resetForm };

}

组件使用

javascript

function LoginForm() {

const { values, handleChange, resetForm } = useForm({

username: '',

password: ''

});

const handleSubmit = (e) => {

e.preventDefault();

console.log('提交数据:', values);

};

return (

<form onSubmit={handleSubmit}>

<input

name="username"

value={values.username}

onChange={handleChange}

placeholder="用户名"

/>

<input

name="password"

type="password"

value={values.password}

onChange={handleChange}

placeholder="密码"

/>

<button type="submit">登录</button>

<button type="button" onClick={resetForm}>重置</button>

</form>

);

}

---

场景3:窗口大小监听复用(useWindowSize)

问题:多个组件需要监听窗口大小变化(如响应式布局),重复编写useEffect+事件监听。

自定义Hook封装(useWindowSize)

javascript

// hooks/useWindowSize.js

function useWindowSize() {

const [size, setSize] = useState({

width: window.innerWidth,

height: window.innerHeight

});

useEffect(() => {

const handleResize = () => {

setSize({

width: window.innerWidth,

height: window.innerHeight

});

};

window.addEventListener('resize', handleResize);

return () => window.removeEventListener('resize', handleResize); // 清理

}, []);

return size;

}

组件使用

javascript

function ResponsiveComponent() {

const { width, height } = useWindowSize();

return (

<div>

窗口大小:{width}x{height}

{width < 768 ? <MobileUI /> : <DesktopUI />}

</div>

);

}

---

二、自定义Hook核心原则

  1. 命名规范:必须以use开头(如useFetch),确保React能识别Hook规则。
  2. 单一职责:一个Hook只封装一个逻辑(如useFetch只处理数据请求,不掺杂表单逻辑)。
  3. 依赖清晰:Hook内部使用useEffect等时,需正确声明依赖数组(如[url]),避免无限循环。

---

三、对比传统复用方案(HOC/Render Props)

今日霍州(www.jrhz.info)©️

特别声明:[React组件复用:自定义Hook减少80%重复代码(react的组件)] 该文观点仅代表作者本人,今日霍州系信息发布平台,霍州网仅提供信息存储空间服务。

猜你喜欢

演员卢靖姗首次晒出与韩庚的一双儿女,三人在海边度假(卢靖姗牺牲最大的一场戏)

2018年2月9日,韩庚在『社交平台』公开了两人的恋情,他发布的消息简洁而真诚,卢靖姗也在第一时间转发并回应。 二胎出生后,卢靖姗进入了产后恢复阶段,韩庚也始终陪伴在她身边,尽全力支持她的恢复与育儿工作。他…

演员卢靖姗首次晒出与韩庚的一双儿女,三人在海边度假(卢靖姗牺牲最大的一场戏)

三月飞雪凝成一颗剔透的真心——《嘘,国王在冬眠》(三月飞雪妒阳春什么意思)

诚然,有人觉得男女主的感情进展过于迅猛,然而站在他们二人的视角来看,早在第一次于雪场正式碰面之前,彼此心中便已然萌动了丝丝悸动,宛如一颗心动的种子悄然种下。当卫枝回到南城,坐在世家聚餐那觥筹交错的餐桌前,被迫…

三月飞雪凝成一颗剔透的真心——《<strong>嘘,国王在冬眠</strong>》(三月飞雪妒阳春什么意思)

『娱乐圈』️「最美小三」复出,又翻红了(『娱乐圈』️最美厨娘)

但随之而来的,是关于她的校园霸凌指控,以及对她身材的各种质疑——被说成是韩国卡戴珊。 她性格火爆、行事冲动,是美善在这残酷世界里唯一的依靠。 尤其是当美善被客人骚扰时,道静毫不犹豫地抄起酒瓶,把那人脑袋砸开…

『娱乐圈』️「最美小三」复出,又翻红了(『娱乐圈』️最美厨娘)

聚伟电子:源头厂家猝死预警手表守护员工健康(聚维电子厂怎么样啊)

为员工配备专业的猝死预警设备,守护员工心脏健康,成为越来越多企业的共识。 如果你是企业采购负责人,希望为员工采购一款极致的、针对性强的猝死风险预警设备,让员工获得更直接的专业级心脏监护,同时兼顾性价比、品质与…

聚伟电子:源头厂家猝死预警手表守护员工健康(聚维电子厂怎么样啊)

陈奕迅与黄泽林恋情曝光,女方陈康堤现身赛事支持男友,双方父母亲支持,引发热议。(『黄宗泽』和陈奕迅唱歌的节目叫什么)

2025年10月31日:陈康堤官宣与日本混血模特男友Shou Honda分手(此前恋爱约两年)2026年1月:陈康堤现身&quot;中银香港网球公开赛&quot;观众席为黄泽林加油 2026年2月:陈康堤再次现身&q

陈奕迅与黄泽林恋情曝光,女方陈康堤现身赛事支持男友,双方父母亲支持,引发热议。(『黄宗泽』和陈奕迅唱歌的节目叫什么)