在使用 React、Vue 这些框架的时,最大特点就是 data 驱动 UI,数据的改变视图的改变。明确了这一点,就可以讲一下这个特点需要哪些要素,核心内容是以下三个
- 初始化 state
- 获取和使用 state
- 改变 state
一、Vue 中的 state
在 Vue 中使用方式超级简单,仅仅专注 state 即可
- 在实例上的 data 函数(data 对象)中初始化 state
- 从实例上拿到 state 并使用
- 在实例上直接改变 state
<template>
<div @click="onClick">{{n}}</div>
</template>
<script>
const vueModel = new Vue({
data(){
n: initialN
},
onClick(){
console.log(this.n)
this.n = newN
}
})
</script>
二、React 的 class 组件
在 React 的 class 组件是这样用的,需要专注 state 和 setState
- 在实例上的 state 中初始化 state
- 从实例上拿到 state 并使用
- 在实例上通过 setState 改变 state
class ReactModel extends Component{
constructor(){
this.state = {
n: initialN
}
}
onClick(){
console.log(this.state.n)
this.setState({n:newN})
}
render(){
return <div onClick={this.onClick.bind(this)}>{this.state.n}</div>
}
}
三、React 的 function 组件
在 React 的 function 组件是这样用的,需要专注 useState、state、setState
- 使用 useState 函数初始化 state
- 在 useState 的返回值中拿到 state 并使用
- 在 useState 的返回值中拿到 setState 改变 state
const ReactModel = ()=>{
const [n,setN] = useState(initialN)
const onClick = ()=>{
console.log(n)
setN(newN)
}
return <div onClick={onClick}>{n}</div>
}
四、React 的 function 组件 + reducer
在 React 的 function 组件使用 reducer 时是这样用的,需要专注 useReducer、state、dispatch、reducer
- 使用 useReducer 函数初始化 state
- 在 useReducer 的返回值中拿到 state 并使用
- 在 userReducer 的返回值中拿到 dispatch 配合 reducer 改变 state
const reducer = (state,action){
switch(action.type){
case 'setN': {
return {
...state,
n: action.n
}
}
}
}
const ReactModel = ()=>{
const [state,dispatch] = useReducer(reducer,{n:initialN})
const onClick = ()=>{
console.log(state.n)
dispatch({type:'setN',n:newN})
}
}
五、说一说 React 的 function 组件
useState/useReducer:n 每次变
useMemo/useCallback:[m]变的时候 fn 变
useRef:永远不变
- React.memo 可以让组件减少不必要的渲染
- useMemo 可以减少不必要的函数或变量声明
「@浪里淘沙的小法师」