Vue Composition API vs React Hooks - paulip114/blog GitHub Wiki
🔁 Vue Composition API vs React Hooks — Feature Equivalents
| Vue API | React Equivalent | Explanation | 
|---|---|---|
| ref() | useRef()oruseState() | ref()in Vue tracks a single primitive or object reactively. In React, use:   -useRef()for non-rerendering mutable values (e.g., DOM refs or timers)   -useState()for reactive state that causes rerenders | 
| reactive() | useState()(with object) | Vue makes an entire object reactive via Proxy. In React, you use useState()and update state immutably:js const [form, setForm] = useState({ name: '', age: 0 })  | 
| computed() | useMemo() | computed()is used for derived values that update reactively. In React, you useuseMemo()to memoize derived values based on dependencies. | 
| watch() | useEffect() | watch()watches reactive values and runs a side effect. In React,useEffect()is used with dependencies to watch for changes.   Vue'swatch(() => state.x, ...)is likeuseEffect(() => {...}, [x]). | 
| onMounted() | useEffect(() => {...}, []) | Vue’s onMounted()runs once after the component is mounted. In React, useEffect with an empty dependency array replicates this behavior. | 
🔍 Code Comparison Examples
ref vs useState / useRef
Vue:
const count = ref(0)
React:
const [count, setCount] = useState(0)
// OR
const countRef = useRef(0) // if you don't want re-renders
computed vs useMemo
Vue:
const double = computed(() => count.value * 2)
React:
const double = useMemo(() => count * 2, [count])
// [count] means only re-run the useMemo function if count changes.
// [] double will always return the value from the first render
watch vs useEffect
Vue:
watch(() => user.value.name, (newVal) => {
  console.log('Name changed:', newVal)
})
React:
useEffect(() => {
  console.log('Name changed:', user.name)
}, [user.name])
// [user.name] means only run this effect when user.name changes
onMounted vs useEffect
Vue:
onMounted(() => {
  console.log('Component mounted')
})
React:
useEffect(() => {
  console.log('Component mounted')
}, [])
// let [] empty means runs once when the component loads
🧠 Summary
| Vue | React | 
|---|---|
| ref() | useRef()/useState() | 
| reactive() | useState()with object | 
| computed() | useMemo() | 
| watch() | useEffect() | 
| onMounted() | useEffect(() => {}, []) |