useState原理源码



import React from "react";
import ReactDOM from "react-dom";

let state = []; // 为了可以储存多个值
let setters = []; // 存储改变值的方法
let stateIndex = 0; // 根据这个下标查找对应的值和改变值的方法
function useState(initialState) {
    // 1. 因为useState可以调用多次,单独一个变量无法存储多个值,所以使用数组进行存储
    state[stateIndex] = state[stateIndex] ? state[stateIndex] : initialState; // 每次改变值都会重新渲染,每次渲染都会重新调用useState方法,这个判断是为了组件渲染前是否有存储过值,如果有就取出来,如果没有就取初始传递的值
    // 2. 将改变值的方法存储到数组中
    setters.push(createSetter(stateIndex))
    // 3. 根据下标在存储值的数组查出值,根据下标在存储改变方法的数组查出方法
    let value = state[stateIndex]
    let setter = setters[stateIndex]
    // 4. useState是将值和改变值的方法存储到数组中,所以在组件中每次使用useState方法,就会将值和方法存起来,每次存起来存储的数组下标就会+1
    stateIndex++;
    // 5. useState方法最终返回一个数组,数组有两个参数,一个是值,一个是改变值的方法
    return [value, setter]

}
/*
    这里解释一下为什么要以闭包的形式将改变值的方法存储到数组中;
    闭包有个特性就是当前代码执行完毕,闭包中的参数不会被垃圾回收机制所回收
    所以我们通过闭包这种形式将下标存储到闭包中;
    setters存储改变值的方法,当我们在组件中想要改变值的时候,只需要将新值传到方法中,
    也就是createSetter返回的方法,createSetter这个方法将新值,根据之前闭包保存下来的下标,
    去更新state中对应的值;
*/
function createSetter(index) {
    return function (newState) {
        state[index] = newState;
        render()
    }
}
// 这里的render方法用于重新渲染组件
function render(){
    // 这里将stateIndex重置为0,是为了每次重新渲染下标都要从0开始
    // 如果不清0,那么下标就会一直增加下去,就会出现问题
    stateIndex = 0
    ReactDOM.render(<StateYM/>, document.getElementById('root'))
}
function StateYM (){
    const [count, setCount] = useState(0)

    return (
        <div>
            <div>{count}</div>
            <button onClick={() => setCount(count + 1)}>+1</button>
        </div>
    )
}



export default StateYM;

这里我将我写的useState的代码贴了出来,解释的都很详细,希望可以帮助到大家!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值