Loading...
Loading...
Compare original and translation side by side
// WRONG - return before hooks
if (!isAuthenticated) {
return <Login />; // ❌ Hook call below is unreachable sometimes
}
const user = useUser(); // VIOLATION
// RIGHT - hooks always execute
const user = useUser();
if (!isAuthenticated) {
return <Login />;
}// 错误写法 - 在Hook调用前返回
if (!isAuthenticated) {
return <Login />; // ❌ 下方的Hook调用有时会无法执行
}
const user = useUser(); // 违规
// 正确写法 - Hook始终会执行
const user = useUser();
if (!isAuthenticated) {
return <Login />;
}// WRONG - missing dependency
const context = useContext(MyContext);
useEffect(() => {
doSomething(context);
}, []); // ❌ Missing `context`
// RIGHT - include all dependencies
useEffect(() => {
doSomething(context);
}, [context]);// 错误写法 - 缺失依赖项
const context = useContext(MyContext);
useEffect(() => {
doSomething(context);
}, []); // ❌ 缺失`context`
// 正确写法 - 包含所有依赖项
useEffect(() => {
doSomething(context);
}, [context]);// WRONG - context object changes on every render
const Provider = ({ children }) => {
const value = { user: currentUser }; // New object every render
return (
<MyContext.Provider value={value}> // ❌ Causes infinite loop
{children}
</MyContext.Provider>
);
};
// RIGHT - memoize context value
const Provider = ({ children }) => {
const value = useMemo(() => ({ user: currentUser }), [currentUser]);
return (
<MyContext.Provider value={value}>
{children}
</MyContext.Provider>
);
};// 错误写法 - Context对象在每次渲染时都会变更
const Provider = ({ children }) => {
const value = { user: currentUser }; // 每次渲染都会创建新对象
return (
<MyContext.Provider value={value}> // ❌ 导致无限循环
{children}
</MyContext.Provider>
);
};
// 正确写法 - 对Context值进行记忆化处理
const Provider = ({ children }) => {
const value = useMemo(() => ({ user: currentUser }), [currentUser]);
return (
<MyContext.Provider value={value}>
{children}
</MyContext.Provider>
);
};./scripts/log-skill.sh react-hooks./scripts/log-skill.sh react-hooks