声明式 + 响应式编程 + 可变数据 Vue的核心心智模型是:你修改数据,UI自动更新
// Vue的编程方式
const state = reactive({ count: 0 })
state.count++ // 直接修改,UI自动响应
// 你关注的是:修改数据这个动作
// 框架帮你处理:数据变了 -> 重新渲染哪些部分精准订阅 (代理 + 响应追踪)
声明式 + 函数式编程 + 不可变数据 React的核心心智模型是:UI = f(state),即UI是状态的纯函数输出。
// React的编程方式
const [count, setCount] = useState(0)
setCount(count + 1) // 你告诉React:新状态是什么
// React内部做的是:
// 旧状态 -> 新状态 -> 重新执行整个组件函数 -> 生成新UI重新执行整个组件函数
在 React 中,多个 setState 默认情况下不会导致每个都触发一次组件函数重新执行,而是会合并成一次重新执行
React 在合成事件中批量更新(一次渲染),在异步代码中老版本会多次渲染,React 18 后基本都能批量
合成事件是 React 自己实现的一套跨浏览器的原生事件包装层。它并不是直接绑定到具体的 DOM 元素上,而是统一绑定在根容器上,采用事件代理机制
待学习
让你从一个普通函数(组件函数)内部,“伸出一个钩子”去钩住React的核心功能(状态、副作用、上下文等),然后把这些功能“拉”到你的组件里使用
function MyComponent() {
// 用 useState 这个“钩子”,钩住 React 内部的状态管理
const [count, setCount] = useState(0)
// 用 useEffect 这个“钩子”,钩住 React 的渲染生命周期
useEffect(() => {
document.title = `点击了${count}次`
}, [count])
return <button onClick={() => setCount(count+1)}>点我</button>
}| React Hook | 作用 | Vue 3 对应 |
|---|---|---|
useState | 声明响应式状态 | ref / reactive |
useEffect | 处理副作用(DOM操作、请求、定时器) | watchEffect / watch |
useContext | 获取跨层级数据 | inject |
useRef | 保存一个不触发重新渲染的值 / DOM引用 | ref (同名的,注意区分) |
useMemo | 缓存计算结果 | computed |
useCallback | 缓存函数引用 | 没有直接对应,但Vue不需要(因为函数不会无故重新创建) |
useReducer | 复杂状态逻辑(类似Redux) | 通常用 reactive + 方法 |
