Lastor
coding 最近一直在思考 Vue3 的模塊拆分方式,因為經常看到 <script> 下面一大包的情況
https://imgs.plurk.com/QD4/N4B/ScrnPZ7UaFmM1OhZMtkQF2ZzEIF_lg.png
Lastor
如果這裡面的功能塊沒有要在其他地方共用的話,特地拆出去又覺得有點怪
Lastor
我之前在 React 遇上這種情況,是蠻常直接在 FC 下面另外寫 function,包成小 group 的感覺
Lastor
反正就是在同一個 file 裡面拆 hooks 引用
Lastor
比照 Vue 的話,是可以這樣寫
https://imgs.plurk.com/QD4/xzs/wkqQF3PyLtoVzqoEwNJKSomGrrp_lg.png
Lastor
但實際這樣去做,其實會碰到不少細節守法的問題,怎麼寫都覺得不夠漂亮
Lastor
例如說,這些功能塊可能都會依賴各種 state,如果希望不要引用外部變數,有可能會變成要塞一堆 params,這寫起來其實會非常麻煩
https://imgs.plurk.com/QD4/bLP/uRFR4hNQayPkHBzIaW8JyiVfS4n_lg.png
Lastor
如果希望 state 在 setup 裡面顯示宣告,在下面設參數的時候 type 又拉不到,得另外手動再定義一次......
https://imgs.plurk.com/QD4/sJO/1hzOSz45urRsqV9ytyNWZDXpUiD_lg.png
Lastor
type 如果很單純倒是還好,如果是比較大包的 object,要手動再寫一次,就不符合工程師的懶人至上原則
Lastor
目前想到比較好的方式,可能只有這樣了,把要共用變數寫在外面
https://imgs.plurk.com/QD4/3yq/KV5Th2WzyFsn1h3TRiqNr48eV4r_lg.png
Lastor
這樣先分裝好,也有個好處,如果引用的父層有需要控制該組件的 state,例如 isShow 之類,那就可以直接 export 給其他組件共用
https://imgs.plurk.com/QD4/Puo/QQZA5HFTDFo03EDh1fpvCmyheCV_lg.png
Lastor
這樣就不用把 isShow 宣在父層,透過 props 扔進去,然後再寫一堆 props, emits 有的沒的,可以少很多 code
Lastor
不過這樣處理,雖然可以做到分裝 group 的效果,但為了讓 hooks 能更方便的引用組件全局的 state,最終還是得把大多 state 都一起寫在下面
Lastor
會有點不太直觀......
Lastor
而且我總覺得這種作法可能有點太潮了,接受的人可能不太多
Lastor
=========
話說,ref 這些寫在 setup 外面,我不知道是不是框架合法的做法,以前意外發現這些東西寫在外面,完全可以 work
Lastor
甚至還可以跨組件共用,直接當作迷你 store,就很扯
Lastor
這大概就是 React 跟 Vue 的底層不太一樣的地方,我記的 React 的 useState 是不能寫在 FC 外面的
Lastor
但 Vue 的 setup 其實跟 <script> 的其他地方是同一個 scope
Lastor
就算不是宣告在 setup 裡面,最後只要有放到 setup 裡面 expose 出去,那宣在外面還是裡面,是一樣的
l• ܫ•) Davyキュルッ
我會直接用 //#region 包起來
就不用思考你上面說的那堆什麼要擺哪裡的問題了
l• ܫ•) Davyキュルッ
至於想要讓父層取用東西的話
通常是不太常這麼做
但標準做法其實是 defineExpose https://vuejs.org/...
所以綜合我上面的做法就完全可以滿足你想要的東西XD
l• ܫ•) Davyキュルッ
但如果你真的真的真的很大一坨 code 的話
還是建議拆出來直接做一個 composable 啦
反正共不共用已經不是目的了 而是易讀性
Lastor
l• ܫ•) Davyキュルッ : region 只是收合啊,這應該跟要 shared 變數該放在哪沒有直接關聯?
Lastor
defineExpose 要讓父層拿到,會跟以前 optional API 一樣,要打 refs 去拿 instance,這不是我想要的
Lastor
我想讓他可以用 hooks 的方式,直接拿到可以控制該組件的 method or state。記得是在 React 的 Antd 看過類似的設計,我蠻喜歡的
Lastor
前面說的不夠精確,煩的那種不大又不小的玩意,拆也不是,不拆也不是,所以才想說用這種在同個 file 拆塊的方式
l• ܫ•) Davyキュルッ
喔我想說放在 region 就大家都一起 share 了XDDDD
l• ܫ•) Davyキュルッ
但我覺得這種用法可能沒有這麼 Vue 就是了
但也是有趣的用法
Lastor
l• ܫ•) Davyキュルッ : 啊啊,我懂你意思了,你是說我就不要去分兩塊 <script> 寫了,就全寫在 <script setup> 裡面,靠 region 收合去隱藏細節的 code
Lastor
畢竟我這樣拆的訴求,只是希望把細節放到下面藏起來,用這方式一樣能實現,我也不用去煩作用域的問題
l• ܫ•) Davyキュルッ
沒錯 XD
apmk@住在「劏房」的
如果是routing換了頁也要persist的那種global state,是建議用pinia這些state manager,不然的話後面換SSR會不work
apmk@住在「劏房」的
不想variable A,B,C的話那傳一整個class/object?
載入新的回覆