在日常过程中可能会遇到需要自己去实现的状态钩子函数
今天跟大家一起简单实现一下use State,主要思路为闭包。
const myReact = (() => {
const states = []; // 状态保存映射
const stateSetters = []; // 修改函数映射
let stateIndex = 0;
// 创建状态
function createState(initialState, stataeIndex) {
return states[stateIndex] != undefined ? states[stateIndex] : initialState
}
// 创建对应的设置函数
function createStateStter(stateIndex) {
return function (newState) {
if (typeof newState === 'function') {
states[stateIndex] = newState(state[stateIndex])
} else {
console.log('重新设置', newState)
states[stateIndex] = newState
console.log(states[stateIndex])
}
render()
}
}
// 抛出的useState函数
function useState(initialState) {
states[stateIndex] = createState(initialState, stateIndex)
if (!stateSetters[stateIndex]) {
stateSetters.push(createStateStter(stateIndex))
}
const _state = states[stateIndex]
const _setState = stateSetters[stateIndex]
stateIndex++ // 每次递增一下 useState函数会多次被使用
return [_state, _setState]
}
function render() {
stateIndex = 0
alert('模拟渲染')
}
return {
useState
}
})()
function App() {
const [text, steText] = myReact.useState('React useState')
const [name, steName] = myReact.useState('I is useState')
setTimeout(() => {
steText('Reset Text')
}, 3000)
return `<div>${text}--${name}</div>`
}
document.querySelector('.root').innerHTML = App()
render函数简易实现了一下,源码本身会更复杂,有更好的逻辑思路可以一起探讨下。