hooks避坑指南

使用usestate() 定义的变量是全局可用的
1.问题来源
普通的组件
<Input
style={style}
value={item.itemSpuTitle}
onChange={(e) => reSetRightList({ itemSpuTitle: e.target.value }, index)}
/>
编辑器组件
<Weditor
height={300}
id={‘weditor’ + index}
value={item.desc}
onChange={(desc) => {
reSetRightList({ desc }, index);
}}
/>
// 设置 reset
1.1. 出现问题
const reSetRightList=(obj,index)=>{
rightList[index] = { …rightList[index], …obj };
return […rightList];
}
1.2. 解决办法
const reSetRightList =useCallback((obj,index)=> {
return setRightList(rightList => {
rightList[index] = { …rightList[index], …obj };
return […rightList];
});
},[])

// 最终问题突破
const [list, setList]: any = useState([]);

console.log(list, ‘list1’);

// 初始化拖拽
const initSortAble = () => {
    let el = document.getElementById('drap-shop');

// let $state = this.state;
new Sortable(el, {
animation: 150,
ghostClass: ‘blue-background-class’,
onEnd: (/*Event/evt) => {
const { newIndex, oldIndex } = evt;

//const {list } = $state
//console.log(list, ‘list2’);

            setList((list) => {
                if (oldIndex < newIndex) { // 向右移
                    list.splice(newIndex + 1, 0, list[oldIndex]); // 在移动到的位置插入一个元素 ##不要提到判断前##
                    list.splice(oldIndex, 1); // 在旧的位置删除原先的元素
                } else if (oldIndex > newIndex) { // 向左移
                    list.splice(newIndex, 0, list[oldIndex]); // 在移动到的位置插入一个元素
                    list.splice(oldIndex + 1, 1); // 在旧的位置 + 1 的序列删除原先的元素
                } else { // 不发生移动
                    return list;
                }
                setList([...list]);
            })
        },
    })
}

官网api
在这里插入图片描述

2.扩展api
2.1 useLayoutEffect
好像没有使用虚拟dom 一样,只要是在这个方法中执行的事件能影响到 页面渲染的,都一律阻止渲染,方法全部执行完毕,才去挂载到真实的dom 上
https://www.jianshu.com/p/412c874c5add
2.2 useEffect(()=>{
prop,state
(){

}
})
useEffect(()=>{
api
},[])

useEffect(()=>{
(){

}
},[props])

2.3 useContext
{ba:
co:}
const ThemeContext = React.createContext(themes.light);

<ThemeContext.Provider value={themes.dark}>

</ThemeContext.Provider>

const theme = useContext(ThemeContext); return ( <button style={{ background: theme.background, color: theme.foreground }}> I am styled by theme context! );
2.4 useReducer . useState 的升级版,主要用于,多个state 之间相互依赖传值,使用useReducer
const initialState = {count: 0};

function reducer(state, action) {
switch (action.type) {
case ‘increment’:
return {count: state.count + 1};
case ‘decrement’:
return {count: state.count - 1};
default:
throw new Error();
}
}

const [state, dispatch] = useReducer(reducer, initialState);
const [state, dispatch] = useReducer(reducer, initialState,init);

2.5 useMemo 和useCallBack的作用是 shouldComponentUpdate,这个生命周期的作用,一个是返回一个数字,一个是返回一个函数
useMemo(()=>{

},[param])
返回一个值
export default function WithMemo() {
const [count, setCount] = useState(1);
const [val, setValue] = useState(’’);
const expensive = useMemo(() => {
console.log(‘compute’);
let sum = 0;
for (let i = 0; i < count * 100; i++) {
sum += i;
}
return sum;
}, [count]);

const expensive = () => {
console.log(‘compute’);
let sum = 0;
for (let i = 0; i < 10000; i++) {
sum += i;
}
return sum;
}

return <div>
    <h4>{count}-{expensive()}</h4>
    {val}
    <div>
        <button onClick={() => setCount(count + 1)}>+c1</button>
        <input value={val} onChange={event => setValue(event.target.value)}/>
    </div>
</div>;

2.6 fnb= useCallback(fna,[param])

const [num, setNum] = useState([1, 2, 3]);
const [num1, setNum1] = useState([4, 5, 6]);

const mCallback = useCallback(
    () => {
        console.log('callback function');
        return [...num, ...num1]
    }, [num]);
// const mCallback = () => {
//     console.log('callback function');
//     return [...num, ...num1]
// };
// useEffect(() => {
//     mCallback()
// }, [num])

const ChildrenApp = ({ num, num1, callback }) => {
set.add(callback);
console.log(set);
return (


{num} - {num1} - {callback()}

)
};
const renderApp = () => {
return (
<>

<Button onClick={() => setNum([‘q’, ‘w’, ‘e’])} >change num
<Button onClick={() => setNum1([‘a’, ‘b’, ‘c’])} >change num1
</>
)
}
2.7 useRef ();
除了能定义一个组件的dom ,获取到真实的dom 元素,还能保存一个值,触发的时候不会导致浏览器渲染。其实就像是state 中一个不被使用的值一样,只不过更新state ,会导致渲染,他不会

<think>嗯,用户想了解前端开发五年经验总结,包括技术栈和职业规划。首先,我需要整理相关引用内容。引用1提到导师经验,强调核心技能和方向;引用2指出职业规划不能脱离当前工作;引用3有五年经验的分阶段建议;引用4可能涉及行业现状;引用5提到数据结构与算法的重要性。 接下来,用户可能需要具体的五年经验总结,分阶段的技术栈发展和职业规划。引用3中分成了1-3年和4-5年,可以作为结构参考。技术栈方面,引用5提到数据结构、算法,以及核心技术栈如框架、工程化。 职业规划部分需要结合引用1和2,强调实践和持续学习。可能的问题包括技术深度、全栈能力、团队管理等。相关问题的生成要覆盖技术提升、职业方向、面试准备等。 需要确保回答结构清晰,分点列出,并自然插入引用标记。同时检查LaTeX格式是否正确,比如独立公式用$$...$$,行内用$...$。最后生成的相关问题要围绕主题,帮助用户深入思考。</think>### 前端开发五年经验总结与技术栈规划 #### 一、技术栈发展路径 1. **基础阶段(1-2年)** - **核心能力**:掌握$HTML/CSS/JavaScript$三件套,熟悉跨浏览器兼容性与响应式设计[^3] - **工程化入门**:学习$Webpack$、$Babel$等工具链,理解模块化开发与打包原理 - **框架基础**:掌握至少一个主流框架如$Vue/React$,实现组件化开发 2. **进阶阶段(3-5年)** - **性能优化**:深入浏览器渲染机制,解决内存泄漏与加载性能问题 - **全栈能力**:接触$Node.js$与$RESTful API$设计,理解前后端协作模式[^5] - **架构设计**:掌握微前端架构(如$qiankun$)、状态管理方案(如$Redux/Vuex$) $$ \text{技术深度} = \int_{0}^{T} (基础能力 \times 项目复杂度)\,dt $$ #### 二、职业规划建议 1. **定位选择** - **技术专家路线**:深耕框架源码(如$React Fiber$)、浏览器内核原理 - **全栈工程师路线**:拓展后端技术(如$Docker/K8s$)与数据库设计[^2] - **团队管理者路线**:培养项目管理能力(如敏捷开发、OKR制定) 2. **关键成长策略** - 每年制定技术图谱,重点突破2-3个技术领域[^1] - 参与开源项目贡献,建立技术影响力 - 定期输出技术博客(建议周更),构建个人知识体系[^4] #### 三、核心技术栈参考 | 分类 | 关键技术点 | 推荐学习路径 | |------------|----------------------------|----------------------------| | **基础** | TypeScript/Web Components | 《重构:改善既有代码的设计》| | **框架** | React Hooks/Vue3 Composition API | 官方文档+源码解析 | | **工程化** | Monorepo/CI-CD流水线 | 实践Jenkins+GitLab CI | | **算法** | 常见排序/DFS/BFS | LeetCode周赛训练[^5] | #### 四、发展指南 1. 免"API工程师"陷阱,需理解技术背后的设计思想 2. 警惕"技术舒适区",每年至少学习1个新领域(如WebAssembly) 3. 技术规划需与业务场景结合,例如: - 电商场景注重性能优化 - B端系统侧重组件抽象能力 - 可视化项目需掌握$Canvas/WebGL$[^3]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值