gpt4 book ai didi

reactjs - useState hook中setStateVariable函数的实现细节

转载 作者:行者123 更新时间:2023-12-04 08:27:52 28 4
gpt4 key购买 nike

我们知道useState是FC中的一个hook,返回一个由两个元素组成的数组。第一个是状态变量,第二个是更新状态变量的函数。

const initialStateVariableValue = 0; // any primitive value
const [StateVariable, setStateVariable] = useState(initialStateVariableValue);

这里我想知道setStateVariable函数的实现细节是什么?它是如何更新状态变量的?

最佳答案

如果您检查 React github 上的实现你注意到 useState 只是用一个基本的 reducer 调用 useReducer:

export function useState<S>(
initialState: (() => S) | S,
): [S, Dispatch<BasicStateAction<S>>] {
return useReducer(
basicStateReducer,
(initialState: any),
);
}

所以寻找 useReducer 实现,我们看到 setter 函数是 dispatch 函数,它根据我们当前所处的生命周期而变化

export function useReducer<S, I, A>(
reducer: (S, A) => S,
initialArg: I,
init?: I => S,
): [S, Dispatch<A>] {
...
// dispatch depends on lifecycle
return [..., dispatch];
}
}

您可以看到完整的 useReducer 实现 here .

详细实现,你应该试试Build your own React这最终将导致这个钩子(Hook)的简化版本:

function useState(initial) {
const oldHook =
wipFiber.alternate &&
wipFiber.alternate.hooks &&
wipFiber.alternate.hooks[hookIndex];
const hook = {
state: oldHook ? oldHook.state : initial,
queue: []
};

const actions = oldHook ? oldHook.queue : [];
actions.forEach(action => {
hook.state = action(hook.state);
});

const setState = action => {
hook.queue.push(action);
wipRoot = {
dom: currentRoot.dom,
props: currentRoot.props,
alternate: currentRoot
};
nextUnitOfWork = wipRoot;
deletions = [];
};

wipFiber.hooks.push(hook);
hookIndex++;
return [hook.state, setState];
}

简单来说:每个钩子(Hook)都保存在“React hooks 数组”中(这就是调用顺序必不可少的原因,因为钩子(Hook)保存在数组的索引中 - 请参阅钩子(Hook)规则),并且根据钩子(Hook)的索引,无论何时调用它都会改变与当前组件关联的状态对象。

关于reactjs - useState hook中setStateVariable函数的实现细节,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65179265/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com