react的hooks

  1. useState:状态管理---在函数组件中添加响应式状态。

例:

javascript 复制代码
const [count, setCount] = useState(0);
setCount(5)//更新count的值

相当于vue的 ref / reactive:

javascript 复制代码
const count = ref(0)
count.value = 5

2.useEffect:副作用处理---处理副作用(数据获取、订阅、DOM操作等)。

例:

javascript 复制代码
useEffect(()=>{
  //组件挂载或更新时执行
  document.title = `Count:${count}`;
  return()=>{
   //清理函数(组件卸载或依赖变化前执行)
   console.log('清理')
  }
},[count]) //依赖数组

相当于vue的 watch / watchEffect:

javascript 复制代码
watch(count,(newVal)=>{
  document.title = `Count:${newVal}`
  return ()=> console.log('清理');
})

//或者使用watchEffect
watchEffect(()=>{
   document.title = `Count:${count.value}`
})

3.useContext:跨组件数据传递---无需props层层传递,直接获取上下文数据。

javascript 复制代码
const ThemeContent = createContext('light')
const theme = useContext(ThemeContent )

相当于vue的provide / inject:

javascript 复制代码
import {inject} from 'vue'
const theme = inject('theme')

4.useReducer:复杂状态管理---适用于复杂状态逻辑(类似redux)。

javascript 复制代码
const [state,dispatch] = useReducer(reducer,initialState);
dispatch({type:'increment'})

相当于vue的pinia:

javascript 复制代码
const state = reactive({count:0});
function dispatch(action){
  if(action.type === 'increment') state.count++
}

5.useRef:引用/DOM访问

javascript 复制代码
const inputRef = useRef(null);
<input ref={inputRef} />
inputRef.current.focus()//访问dom

相当于vue的ref:

javascript 复制代码
const inputRef = ref(null);
<input ref="inputRef" />
inputRef.value.focus(); // 访问DOM

6.useMemo:记忆化计算---缓存计算结果,优化性能

javascript 复制代码
//computeExpensiveValue是开发者自定义的复杂的计算函数
const expensiveValue = useMemo(()=>{
   return computeExpensiveValue(a,b);
},[a,b])//只有a或者b变化时才重新计算

相当于vue的computed:

javascript 复制代码
const expensiveValue = computed(()=>{
  return computeExpensiveValue(a.value,b.value)
})//computeExpensiveValue是开发者自定义的复杂的计算函数

7.useCallback:记忆化函数---缓存函数引用,避免子组件不必要的重新渲染。

javascript 复制代码
const handleClick = useCallback(()=>{
  console.log(count)
},[count])//依赖变化时才重新创建函数

相当于vue的手动优化,只有一依赖变化时才执行的函数:

javascript 复制代码
const handleClick = ()=>{
   console.log(count.value)
}

8.useLayoutEffect:同步副作用---在DOM更新后、浏览器绘制前同步执行。

javascript 复制代码
useLayoutEffect(()=>{
//DOM更新后同步执行(在浏览器绘制前)
  measureDOM()
},[deps])

相当于vue的nextTick + watch:

javascript 复制代码
// Vue 3(nextTick + watch)
watch(someRef, () => {
  nextTick(() => {
    measureDOM();
  });
});

9.自定义Hooks:逻辑复用

javascript 复制代码
//自定义Hooks
function useLocalStorage(key,initialValue){
  const [value,setValue] = useState(()=>{
    const stored = localStorage.getItem(key)
    return stored ? Json.Parse(stored) : initialValue
  })
   
  useEffect(()=>{
     localStorage.setItem(key.Json.stringify(value));
  },[key,value])

  return [value,setValue]
}

//使用
 const [name,setName] = useLocalStorage('name','默认名')

相当于vue:

javascript 复制代码
//vue3自定义组合函数
function useLocalStorage(key,initialValue)=>{
  const value = ref(initialValue);
  const stored = localStorage.getItem(key);
  if(storde) value.value = Json.parse(stored)

  watch(value,(newVal)=>{
    localStorage.setItem(key,Json.stringfy(newValue))
  })
  
  return {value}
}

//使用
const {value:name} = useLocalStorage('name','默认名')
相关推荐
2401_859049081 分钟前
git submodule update --init --recursive无法拉取解决
前端·chrome·git
这是个栗子19 分钟前
【Vue代码分析】前端动态路由传参与可选参数标记:实现“添加/查看”模式的灵活路由配置
前端·javascript·vue.js
刘一说27 分钟前
Vue 动态路由参数丢失问题详解:为什么 `:id` 拿不到值?
前端·javascript·vue.js
2601_949593651 小时前
基础入门 React Native 鸿蒙跨平台开发:Animated 动画按钮组件 鸿蒙实战
react native·react.js·harmonyos
熊猫钓鱼>_>1 小时前
动态网站发布部署核心问题详解
前端·nginx·容器化·网页开发·云服务器·静态部署
方也_arkling1 小时前
elementPlus按需导入配置
前端·javascript·vue.js
爱吃大芒果1 小时前
Flutter for OpenHarmony 实战: mango_shop 资源文件管理与鸿蒙适配
javascript·flutter·harmonyos
我的xiaodoujiao1 小时前
使用 Python 语言 从 0 到 1 搭建完整 Web UI自动化测试学习系列 44--将自动化测试结果自动推送至钉钉工作群聊
前端·python·测试工具·ui·pytest
沛沛老爹1 小时前
Web开发者转型AI:多模态Agent视频分析技能开发实战
前端·人工智能·音视频
David凉宸1 小时前
vue2与vue3的差异在哪里?
前端·javascript·vue.js