作者回复: 你好,船长,我看过了你的demo和源码,非常棒!这是到目前为止专栏留言区里最完整的思考题答案了,感谢你的积极和认真。 确实像你说的,目前这个项目相对简单,还不需要使用更加复杂的文件目录结构。你这样的设计恰到好处,尤其是components和pages目录的分工明确,对后续扩展和维护会有很大帮助。 看到你的代码使用了TailwindCSS,是很棒的样式技术。 另外我对Finder首页代码有个小建议: https://github.com/TanGuangZhi/ReactLearn/blob/main/src/pages/YeahMyKanBan/FinderSimulate/index.tsx#L18-L25 的 getColumnData 函数可以声明在 useUpdateEffect 回调函数的内部,这样做代码逻辑上并没有什么区别,但可以避免每次组件重新渲染时都创建一个新函数出来,算是一个小优化。
作者回复: 你好,船长,很棒的答案,“Finder 项目的 左上角最大最小化按钮”确实是个很典型的例子。
作者回复: 你好,船长,你的第一种写法相当于在组件内动态定义了一个组件,而函数组件每次渲染都会执行整个函数,意味着每次都会新定义一个SearchForm组件,然后加入到渲染中。 React在重新渲染时会根据组件类型确定有哪个虚拟DOM(FiberNode)是可以复用的,然而每次渲染都定义新组件会导致React每次都新建虚拟DOM,最终销毁并新建真实DOM,导致失去焦点。 我从你的codesandbox fork了一份,把SearchForm组件定义在主组件外面就好了: https://codesandbox.io/s/affectionate-water-jdrhfz?file=/App.tsx