国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

Vue.js 的注意事項與技巧

lsxiao / 3200人閱讀

摘要:需要注意的是,同樣的行為也適用于。這意味著我們必須重新綁定每個事件。組件的由調用它的父組件提供,這意味著所有事件都應該與父組件相關聯。

原文鏈接:Vue.js — Considerations and Tricks

Vue.js 是一個很棒的框架。然而,當你開始構建一個大型 JavaScript 項目的時候,你將對 Vue.js 感到一些困惑。這些困惑并不是來自框架本身,相反 Vue.js 團隊會經常調整一些重要設計策略。

相對于 React 和 Angular,Vue.js 面向一些不同水平的開發者。它更加的友好,不管是對初學者還是經驗豐富的老手。它并不隱藏一些 DOM 操作,相反它與 DOM 配合的很好。

這篇文章更像是一個目錄,列舉了我在 Vue.js 的初學路上遇到一些問題和技巧。理解這些關鍵性的設計技巧,有助于我們構建大型的 Web 應用。

寫這篇文章的時候是 2018 年 5 月 18 日,下面這些技巧依然是有效的。但是框架升級,或者瀏覽器底層或者 JS API 發生改變時,他們可能會變得不是那么有用。

譯者注:盡管 Vue.js 3 即將到來,但是下面的技巧大部分是有用的,因為 3 的版本并不會改變一些上層 API ,最大的特性可能是底層數據 Observer 改有 proxy 實現,以及源碼使用 typescript 構建。
1、為什么 Vue.js 不使用 ES Classes 的方式編寫組件

如果你使用過類似于 Angular 的框架或者某些后端 OOP 語言后,那么你的第一個問題可能是:為什么不使用 Class 形式的組件?

Vue.js 的作者在 GitHub issues 中很好的回答了這個問題:
Use standard JS classes instead of custom syntax?

為什么不使用 Class 這里有三個很重要的原因:

ES Classes 不能夠滿足當前 Vue.js 的需求,ES Classes 標準還沒有完全規范化,并且總是朝著錯誤的方向發展。如果 Classes 的私有屬性和裝飾器(當前已進入 Stage 3)穩定后,可能會有一定幫助。

ES Classes 只適合于那些熟悉面向對象語言的人,它對哪些不使用復雜構建工具和編譯器的人不夠友好。

優秀的 UI 組件層次結構一般都是組件的橫向組合,它并不是基于繼承的層次結構。而 Classes 形式顯然更擅長的是后者。

譯者注:But,Vue.js 3.0 將支持基于 Class 的組件寫法,真香。
2、如何構建自己的抽象組件?

如果你想構建自己的抽象組件(比如 transition、keep-alive),這是一個比構建大型 web 應用更加瘋狂地想法,這里有一些關于這個問題的討論,但是并沒有什么進展。

Any plan for docs of abstract components?

譯者注:在 Vue.js 內部組件(transition、keep-alive)中,使用了一個 abstract 屬性,用于聲明抽象組件,這個屬性作者并不打算開放給大家使用,所以文檔也沒有提及。但是如果你要使用也是可以的,那么你必須深入源碼探索該屬性有何作用。

但是不要害怕,如果你可以很好地理解 slots ,你就可以構建自己的抽象組件了。這里有一篇很好的博客介紹了要如何做到這一點。

Writing Abstract Components with Vue.js

譯者注:下面是《在 Vue.js 中構建抽象組件》的簡單翻譯
抽象組件與普通組件一樣,只是它不會在界面上顯示任何 DOM 元素。它們只是為現有組件添加額外的行為。
就像很多你已經熟悉的 Vue.js 的內置組件,比如:``、``、``。

現在展示一個案例,如何跟蹤一個 DOM 已經進入了可視區域 ,讓我們使用 IntersectionObserver API 來實現一個解決這個問題的抽象組件。
(完整代碼在這里:[vue-intersect](https://github.com/heavyy/vue-intersect))

// IntersectionObserver.vue
export default {
  // 在 Vue 中啟用抽象組件
  // 此屬性不在官方文檔中, 可能隨時發生更改,但是我們的組件必須使用它
  abstract: true,
  // 重新實現一個 render 函數
  render() {
    // 我們不需要任何包裹的元素,只需要返回子組件即可
    try {
      return this.$slots.default[0];
    } catch (e) {
      throw new Error("IntersectionObserver.vue can only render one, and exactly one child component.");
    }

    return null;
  },
  mounted () {
    // 創建一個 IntersectionObserver 實例
    this.observer = new IntersectionObserver((entries) => {
      this.$emit(entries[0].isIntersecting ? "intersect-enter" : "intersect-leave", [entries[0]]);
    });

    // 需要等待下一個事件隊列,保證子元素已經渲染
    this.$nextTick(() => {
      this.observer.observe(this.$slots.default[0].elm);
    });
  },
  destroyed() {
    // 確保組件移除時,IntersectionObserver 實例也會停止監聽
    this.observer.disconnect();
  }
}
讓我們看看如何使用它?

  

但是在這樣做之前,請你三思。我們一般依賴 mixins 和一些純函數來解決一些特殊場景的問題,你可以將 mixins 直接看做一個抽象組件。

How do I extend another VueJS component in a single-file component? (ES6 vue-loader)

3、我不太喜歡 Vue.js 的單文件組件,我更希望 HTML、CSS 和 JavaScript 分離。

沒有人阻止你這樣做,如果你是個注重分離的哲學家,喜歡把不同的東西放在不同文件,或者討厭編輯器對 .vue 文件的不穩定行為,那么你這么做也是可以的。你要做的很簡單:





這么做,就會出現下一個問題:我的組件總是需要 4 個文件(vue + html + css + js)嗎?我能不能擺脫 .vue 文件? 答案是肯定的,你可以使用 vue-template-loader

我的同事還為此寫了一篇很棒的教程:

Using vue-template-loader with Vue.js to Compile HTML Templates

4、 函數式組件

感謝 React.js 讓函數式組件很流行,這是因為他們無狀態、易于測試。然而它們也存在一些問題。

譯者注:不了解 Vue.js 函數式組件的可以先在官方文檔查看:官方文檔
4.1 為什么我不能對功能組件使用基于 Class 的 @Component 裝飾器?

再次回到 Classes,它只是一種用于保存本地狀態的數據結構。如果函數式組件是無狀態的,那么使用 @Component 裝飾器就是無意義的。

這里有關于這個的討論:

How to create functional component in @Component?

4.2 外部類和樣式不應用于函數式組件

函數式組件不能像普通組件那樣,綁定具體的類和樣式,必須在 render 函數中手動應用這些綁定。

DOM class attribute not rendered properly with functional components

class attribute ignored on functional components

4.3 函數式組件總是會重復渲染?
TLDR:在函數式組件中使用有狀態組件時務必要小心

Functional components are re-rendered when props are unchanged.

函數式組件相當于直接調用組件的 Render 函數,這意味著你應該:

避免在 render 函數中直接使用有狀態組件,因為這會在每次調用 render 函數時創建不同的組件實例。

如果函數式組件是葉子組件,會更好地利用它們。 需要注意的是,同樣的行為也適用于 React.js。

4.4 如何在Vue.js 函數式組件中觸發一個事件?

在從函數式組件中觸發一個事件并不簡單。不幸的是,文檔中也沒有提到這一點。函數式組件中不可用 $emit 方法。stack overflow 上有人討論過這個問題:

How to emit an event from Vue.js Functional component?

5、Vue.js 的透明包裹組件

組件包裹一些DOM元素,并且公開了這些DOM元素的事件,而不是根DOM的節點實例。

例如:


這里我們真正感興趣的是 input 節點,而不是 div 根節點,因為它主要是為了樣式和修飾而添加的。用戶可能對這個組件的幾個輸入事件感興趣,比如 blurfocusclickhover等等。這意味著我們必須重新綁定每個事件。我們的組件如下所示。


實際上這是完全沒必要的。簡單的解決方案是使用 Vue 實例上的屬性 vm.$listeners 將事件重新綁定到所需DOM 元素上:




6、為什么你不能在 slot 上綁定和觸發事件

我經常看到有些開發人員,在 slot 上進行事件的監聽和分發,這是不可能的。

組件的 slot 由調用它的父組件提供,這意味著所有事件都應該與父組件相關聯。嘗試去傾聽這些變化意味著你的父子組件是緊密耦合的,不過有另一種方法可以做到這一點,Evan You解釋得很好:

Is it possible to emit event from component inside slot #4332

Suggestion: v-on on slots

7、slot 中的 slot(訪問孫輩slot)

在某些時候,可能會遇到這種情況。假設有一個組件,比如 A ,它接受一些 slot 。遵循組合的原則,使用組件 A 構建另一個組件 B 。然后你把 B 用在 C 中。

那么現在問題來了: 如何將 slot 從 C 組件傳遞到 A 組件?

要回答這個問題,首先取決你使用何種方式構建組件? 如果你是用 render 函數,那就很簡單。你只需要在組件 B 的 render 函數中進行如下操作:

// Render function for component B
function render(h) {
    return h("component-a", {
        // Passing slots as they are to component A
        scopedSlot: this.$scopedSlots
    }
}

但是,如果你使用的是基于模板的方式,那么就有些糟糕了。幸運的是,在這個問題上有了進展:

feat(core): support passing down scopedSlots with v-bind

希望這篇文章讓你對 Vue.js 的設計思路有了更深入的了解,并為你提供了一些在高級場景中的技巧。

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/109263.html

相關文章

  • 學習實踐 - 收藏集 - 掘金

    摘要:官網地址聊天機器人插件開發實例教程一創建插件在系統技巧使你的更加專業前端掘金一個幫你提升技巧的收藏集。我會簡單基于的簡潔視頻播放器組件前端掘金使用和實現購物車場景前端掘金本文是上篇文章的序章,一直想有機會再次實踐下。 2道面試題:輸入URL按回車&HTTP2 - 掘金通過幾輪面試,我發現真正那種問答的技術面,寫一堆項目真不如去刷技術文章作用大,因此刷了一段時間的博客和掘金,整理下曾經被...

    mikyou 評論0 收藏0
  • 關于Vue2一些值得推薦文章 -- 五、六月份

    摘要:五六月份推薦集合查看最新的請點擊集前端最近很火的框架資源定時更新,歡迎一下。蘇幕遮燎沈香宋周邦彥燎沈香,消溽暑。鳥雀呼晴,侵曉窺檐語。葉上初陽乾宿雨,水面清圓,一一風荷舉。家住吳門,久作長安旅。五月漁郎相憶否。小楫輕舟,夢入芙蓉浦。 五、六月份推薦集合 查看github最新的Vue weekly;請::點擊::集web前端最近很火的vue2框架資源;定時更新,歡迎 Star 一下。 蘇...

    sutaking 評論0 收藏0
  • 關于Vue2一些值得推薦文章 -- 五、六月份

    摘要:五六月份推薦集合查看最新的請點擊集前端最近很火的框架資源定時更新,歡迎一下。蘇幕遮燎沈香宋周邦彥燎沈香,消溽暑。鳥雀呼晴,侵曉窺檐語。葉上初陽乾宿雨,水面清圓,一一風荷舉。家住吳門,久作長安旅。五月漁郎相憶否。小楫輕舟,夢入芙蓉浦。 五、六月份推薦集合 查看github最新的Vue weekly;請::點擊::集web前端最近很火的vue2框架資源;定時更新,歡迎 Star 一下。 蘇...

    khs1994 評論0 收藏0
  • 前端資源系列(4)-前端學習資源分享&前端面試資源匯總

    摘要:特意對前端學習資源做一個匯總,方便自己學習查閱參考,和好友們共同進步。 特意對前端學習資源做一個匯總,方便自己學習查閱參考,和好友們共同進步。 本以為自己收藏的站點多,可以很快搞定,沒想到一入匯總深似海。還有很多不足&遺漏的地方,歡迎補充。有錯誤的地方,還請斧正... 托管: welcome to git,歡迎交流,感謝star 有好友反應和斧正,會及時更新,平時業務工作時也會不定期更...

    princekin 評論0 收藏0

發表評論

0條評論

lsxiao

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<