Windows开机自动全屏打开指定网页?一个快捷方式参数就搞定(Chrome/Edge/Firefox教程)
2026/5/25 20:13:42
@[toc]
如果你写 RN 写到后面,开始出现下面这些情况:
那问题往往不在 React Native,而在Hooks 的设计方式本身已经失控了。
这篇文章不讲“Hook 是什么”,而是讲:
在真实 RN 项目里,Hooks 应该怎么设计,哪些写法一定会把项目带沟里。
先说一个现实结论:
Hook 是“状态和行为的放大器”,不是解药。
很多项目里的 Hook,最后都会长成这样:
functionusePageLogic(){// 请求// 权限判断// 数据转换// 埋点// 页面跳转}写的时候很爽,
三个月后——没人敢改。
useEffect(()=>{doSomething(a,b,c)},[a,b])Hook 如果没设计好,很容易:
在进入规范前,先给你一个判断标准。
一个“设计良好”的 Hook,应该满足:
如果一个 Hook 做不到这四点,迟早要拆。
错误示例:
functionuseUserPermission(user){if(user.role==='admin'){// ...}}正确做法:
// domain/user.tsexportfunctioncanEdit(user:User){returnuser.role==='admin'}// hooks/useUserPermission.tsexportfunctionuseUserPermission(user:User){returncanEdit(user)}判断规则属于 domain,不属于 hook。
反例(很常见):
functionusePage(){const[list,setList]=useState([])const[loading,setLoading]=useState(false)const[selected,setSelected]=useState(null)}正确拆法:
useListData()useLoadingState()useSelection()Hook 是组合单位,不是容器。
危险写法:
functionuseInit(){useEffect(()=>{store.setState(...)},[])}问题是:
更好的方式是:
functionuseInit(){return()=>{store.setState(...)}}副作用必须显式触发。
错误示例:
useEffect(()=>{fetchData().then(setData)},[])改进版本:
useEffect(()=>{letmounted=truefetchData().then(res=>{if(mounted)setData(res)})return()=>{mounted=false}},[])这是 RN 项目里非常真实的坑。
不要这样:
const[a,b,c]=useSomething()推荐这样:
const{data,loading,refresh}=useSomething()Hook 是接口,不是数组谜题。
一句话总结:
能不用 useEffect,就不用。
错误:
useEffect(()=>{setTotal(price*count)},[price,count])正确:
consttotal=price*countconstfilteredList=useMemo(()=>{returnlist.filter(...)},[list])其他情况,大概率是设计问题。
usePageLogic()// 400 行症状:
useEffect(()=>{setB(calcA(a))},[a])这基本等同于:
navigation.navigate(...)页面不知道:
useScrollPosition(ref)ref 来自页面,生命周期复杂,极易出问题。
functionuseProfilePage(){const[user,setUser]=useState(null)const[loading,setLoading]=useState(false)useEffect(()=>{setLoading(true)fetchUser().then(res=>{setUser(res)setLoading(false)})},[])return{user,loading}}functionuseUserData(){const[user,setUser]=useState(null)useEffect(()=>{fetchUser().then(setUser)},[])returnuser}functionuseLoading(initial=false){const[loading,setLoading]=useState(initial)return{loading,setLoading}}页面组合:
constuser=useUserData()const{loading}=useLoading()逻辑更清晰,也更容易复用。
在一个中大型 RN 项目中,重构 Hooks 后:
如果你记住这三点就够了:
Hook 写得好,RN 项目会非常优雅;
Hook 写得乱,TS、Redux、架构都救不了你。