Mixin在React.js中是有害的
Mixin是來自OO世界概念,而React.js是遵循函數語言程式設計概念,在React程式設計中使用Mixin被認為是有害的。
Facebook官方發表了文章Mixins Considered Harmful | React,文章大意如下:
“如何在幾個元件之間共享程式碼”是人們學習使用React常有的疑問,答案是使用元件組合實現重用,你能定義一個元件然後在其他幾個元件中重複使用它即可。
但是,在實踐中,Facebook發現事情沒有這麼簡單,在實踐中遭遇的問題普遍竟然是由Mixin引起的。雖然Mixin比組合模式更加智慧,類似一種執行時組合的魔術模式。
Mixin有以下問題:
首先,Mixin容易被破壞,但是這不意味著Mixin模式本身不好,很多人已經成功應用它在很多語言和正規化中,包括一些函數語言程式設計,在Facebook廣泛使用類似於Mixin的trait,但是Mixin在React程式碼中是沒有必要和有問題的。
Mixin會引入隱式的依賴,一些元件依賴Mixin中定義的某個方法,比如getClassName(); 有時它是另外一種方式,Mixin呼叫方法像renderHeader(),Javascript是一個動態語言,難以面對這些依賴。
一個元件的render()方法也許引用了一些沒有在類裡面定義的方法,這個元件能夠安全地遷移嗎?我們需要到處尋找Mixin所有成員,開啟每個檔案,尋找在Mixin中被定義的方法。
如果Mixin又依賴其他Mixin,移除它們中一個就會引起連鎖中斷,這時需要一個依賴相簿,但是不像元件,Mixin不會形成一個層次,它們被扁平化並在同一個名稱空間中執行。
其次,Mixin會引起名稱衝突,如果在FluxListenerMixin中定義了handleChange() , WindowSizeMixin定義了handleChange(),你就不能一起使用它們。
如果你完全控制你的程式碼這不是一個問題,可以更名方法名稱,但是如果Mixin來自第三方包,你就無法更名了。
再者,Mixin會引起滾雪球式的複雜性。Mixin開始很簡單,但是會日益複雜。
那麼如何從Mixin中遷移出來呢?Facebook針對不同情形程式碼提出了不同的解決方案。
這些方法總體來說比較複雜,對程式設計師要求水平極高,不是普通Javscript前端程式設計師就能完全掌握,看來React.js用起來也如Java/Scala一樣非常能有深度。
相關文章
- 為什麼Java中繼承是有害的Java中繼繼承
- scss null在@mixin傳參中的應用CSSNull
- 為什麼Java中繼承多數是有害的Java中繼繼承
- Lombok是有害的 · Gregor RieglerLombokGo
- Vue中mixin的理解Vue
- 如何更高效、方便的在React.js中操作StateReactJS
- Sass中的mixin,function,extendFunction
- 【譯】Dart | 什麼是MixinDart
- vue.js中mixin的使用。Vue.js
- 【譯】function.caller 被認為是有害的Function
- 在 Vue.js 中使用MixinVue.js
- React.js 小書 Lesson21 – ref 和 React.js 中的 DOM 操作ReactJS
- vue3中mixin的使用方法Vue
- React.js 中的元件通訊問題ReactJS元件
- 閉包概念是掌握React.JS的關鍵 - NitsanReactJS
- SCSS @mixinCSS
- [譯]Flutter - Dart的MixinFlutterDart
- React Mixin 的前世今生React
- [譯] 使用 `-force` 被認為是有害的;瞭解 Git 的 `-force-with-lease` 命令Git
- React.js中實現下拉重新整理ReactJS
- React.js中JSX的原理與關鍵實現ReactJS
- Vue Mixin混入Vue
- paluch.biz - Lombok的資料類是有害的!為什麼我不再使用Lombok?Lombok
- 程式設計是一種對你的身體健康十分有害的工作程式設計
- C 指標有害健康指標
- WFH對健康有害嗎?
- 在 Laravel 中是用 GraphqlLaravel
- 【譯】Arc 在 Rust 中是如何工作的Rust
- 為什麼Vue.mixin中的定義的data全域性可用Vue
- sass的mixin,extend,placeholder,functionFunction
- SCSS @mixin傳參CSS
- Python mixin模式Python模式
- JavaScript的模組載入可能有害JavaScript
- 在 css 中什麼是好的註釋?CSS
- hypernetwork在SD中是怎麼工作的
- 大模型對AI研究有害?大模型AI
- Python Mixin混入的使用方法Python
- react.js測試ReactJS