7個有用的Vue開發技巧

2021-02-19 前端熱點分析


1 狀態共享

隨著組件的細化,就會遇到多組件狀態共享的情況, Vuex當然可以解決這類問題,不過就像 Vuex官方文檔所說的,如果應用不夠大,為避免代碼繁瑣冗餘,最好不要使用它。

今天我們介紹的是 vue.js 2.6 新增加的 Observable API ,通過使用這個 api 我們可以應對一些簡單的跨組件數據狀態共享的情況。

如下這個例子,我們將在組件外創建一個 store,然後在 App.vue組件裡面使用 store.js 提供的 store和 mutation方法,同理其它組件也可以這樣使用,從而實現多個組件共享數據狀態。

首先創建一個 store.js,包含一個 store和一個 mutations,分別用來指向數據和處理方法。

import Vue from "vue";

export const store = Vue.observable({ count: 0 });

export const mutations = {

setCount(count) {

store.count = count;

}

};

然後在 App.vue裡面引入這個 store.js,在組件裡面使用引入的數據和方法

<template>

<div id="app">

<img width="25%" src="./assets/logo.png">

<p>count:{{count}}</p>

<button @click="setCount(count+1)">+1</button>

<button @click="setCount(count-1)">-1</button>

</div>

</template>

<script>

import { store, mutations } from "./store";

export default {

name: "App",

computed: {

count() {

return store.count;

}

},

methods: {

setCount: mutations.setCount

}

};

</script>

<style>

你可以點擊 在線DEMO 查看最終效果

2 長列表性能優化

我們應該都知道 vue會通過 object.defineProperty對數據進行劫持,來實現視圖響應數據的變化。

然而有些時候我們的組件就是純粹的數據展示,不會有任何改變,我們就不需要 vue來劫持我們的數據。

在大量數據展示的情況下,這能夠很明顯的減少組件初始化的時間,那如何禁止 vue劫持我們的數據呢?

可以通過 object.freeze方法來凍結一個對象,一旦被凍結的對象就再也不能被修改了。

export default {

data: () => ({

users: {}

}),

async created() {

const users = await axios.get("/api/users");

this.users = Object.freeze(users);

}

};

另外需要說明的是,這裡只是凍結了 users的值,引用不會被凍結。

當我們需要 reactive數據的時候,我們可以重新給 users賦值。

export default {

data: () => ({

users: {}

}),

async created() {

const users = await axios.get("/api/users");

this.users = Object.freeze(users);

},

methods:{

// 改變值不會觸發視圖響應

this.data.users[0] = newValue

// 改變引用依然會觸發視圖響應

this.data.users = newArray

}

};

3 去除多餘的樣式

隨著項目越來越大,書寫的不注意,不自然的就會產生一些多餘的 css,小項目還好。

一旦項目大了以後,多餘的 css 會越來越多,導致包越來越大,從而影響項目運行性能。

所以有必要在正式環境去除掉這些多餘的css,這裡推薦一個庫purgecss,支持 CLI、JavascriptApi、Webpack 等多種方式使用,通過這個庫,我們可以很容易的去除掉多餘的 css。

我做了一個測試,在線DEMO

<h1>Hello Vanilla!</h1>

<div>

We use Parcel to bundle this sandbox, you can find more info about Parcel

<a href="https://parceljs.org" target="_blank" rel="noopener noreferrer">here</a>.

</div>

body {

font-family: sans-serif;

}

a {

color: red;

}

ul {

li {

list-style: none;

}

}

import Purgecss from "purgecss";

const purgecss = new Purgecss({

content: ["**/*.html"],

css: ["**/*.css"]

});

const purgecssResult = purgecss.purge();

最終產生的 purgecssResult結果如下,可以看到多餘的 a和 ul標籤的樣式都沒了

evernotecid://15DE25B8-A8A2-48DA-BEA3-2B892B3566BA/appyinxiangcom/22977527/ENResource/p232

4 作用域插槽

利用好作用域插槽可以做一些很有意思的事情,比如定義一個基礎布局組件A,只負責布局,不管數據邏輯。

然後另外定義一個組件B 負責數據處理,布局組件A 需要數據的時候就去 B 裡面去取。

假設,某一天我們的布局變了,我們只需要去修改組件A 就行,而不用去修改組件B。

從而就能充分復用組件B 的數據處理邏輯,關於這塊我之前寫過一篇實際案例,可以點擊這裡查看。

這裡涉及到的一個最重要的點就是父組件要去獲取子組件裡面的數據,之前是利用 slot-scope。

自 vue 2.6.0 起,提供了更好的支持 slot 和 slot-scope 特性的 API 替代方案。

比如,我們定一個名為 current-user的組件:

<span>

<slot>{{ user.lastName }}</slot>

</span>

父組件引用 current-user的組件,但想用名替代姓(老外名字第一個單詞是名,後一個單詞是姓):

<current-user>

{{ user.firstName }}

</current-user>

這種方式不會生效,因為 user對象是子組件的數據,在父組件裡面我們獲取不到,這個時候我們就可以通過 v-slot來實現。

首先在子組件裡面,將 user作為一個 <slot>元素的特性綁定上去:

<span>

<slot v-bind:user="user">

{{ user.lastName }}

</slot>

</span>

之後,我們就可以在父組件引用的時候,給 v-slot帶一個值來定義我們提供的插槽 prop 的名字:

<current-user>

<template v-slot:default="slotProps">

{{ slotProps.user.firstName }}

</template>

</current-user>

這種方式還有縮寫語法,可以查看獨佔默認插槽的縮寫語法,最終我們引用的方式如下:

<current-user v-slot="slotProps">

{{ slotProps.user.firstName }}

</current-user>

相比之前 slot-scope代碼更清晰,更好理解。

5 屬性事件傳遞

寫過高階組件的童鞋可能都會碰到過將加工過的屬性向下傳遞的情況,如果碰到屬性較多時,需要一個個去傳遞,非常不友好並且費時。

有沒有一次性傳遞的呢(比如react裡面的 {...this.props})?答案就是 v-bind和 v-on。

舉個例子,假如有一個基礎組件 BaseList,只有基礎的列表展示功能,現在我們想在這基礎上增加排序功能,這個時候我們就可以創建一個高階組件 SortList。

<!-- SortList -->

<template>

<BaseList v-bind="$props" v-on="$listeners"> <!-- ... --> </BaseList>

</template>

<script>

import BaseList from "./BaseList";

// 包含了基礎的屬性定義

import BaseListMixin from "./BaseListMixin";

// 封裝了排序的邏輯

import sort from "./sort.js";

export default {

props: BaseListMixin.props,

components: {

BaseList

}

};

</script>

可以看到傳遞屬性和事件的方便性,而不用一個個去傳遞

6 函數式組件

函數式組件,即無狀態,無法實例化,內部沒有任何生命周期處理方法,非常輕量,因而渲染性能高,特別適合用來只依賴外部數據傳遞而變化的組件。

寫法如下:

在 template標籤裡面標明 functional

只接受 props值

不需要 script標籤

<!-- App.vue -->

<template>

<div id="app">

<List

:items="['Wonderwoman', 'Ironman']"

:item-click="item => (clicked = item)"

/>

<p>Clicked hero: {{ clicked }}</p>

</div>

</template>

<script>

import List from "./List";

export default {

name: "App",

data: () => ({ clicked: "" }),

components: { List }

};

</script>

<!-- List.vue 函數式組件 -->

<template functional>

<div>

<p v-for="item in props.items" @click="props.itemClick(item);">

{{ item }}

</p>

</div>

</template>

7 監聽組件的生命周期

比如有父組件 Parent和子組件 Child,如果父組件監聽到子組件掛載 mounted就做一些邏輯處理,常規的寫法可能如下:

// Parent.vue

<Child @mounted="doSomething"/>

// Child.vue

mounted() {

this.$emit("mounted");

}

這裡提供一種特別簡單的方式,子組件不需要任何處理,只需要在父組件引用的時候通過 @hook來監聽即可,代碼重寫如下:

<Child @hook:mounted="doSomething"/>

當然這裡不僅僅是可以監聽 mounted,其它的生命周期事件,例如: created, updated等都可以,是不是特別方便~

作者:skinnerl 

 https://juejin.im/post/5ce3b519f265da1bb31c0d5f

設置星標不迷路

有你想看的精彩

GitHub推出「打賞」功能,最活躍的開源平臺將迎來更多開源工作?

前端路由原理解析和實現


感謝您的閱讀,如果你覺得我的公眾號還不錯,請多幫我推薦給你的朋友,多謝了。

前端大牛愛好者:每天一篇前端技術文章,不定時前端乾貨發送

歡迎長按(掃描)二維碼關注:前端大牛愛好者

   

福利:公眾號回復「開課吧」,將免費領取前端大牛主講的【CSS3、HTML5、vue.js及實戰項目】Web全棧架構師正式課程部分視頻,價值3980元。

相關焦點

  • 7個有用的 Vue開發技巧
    會通過 object.defineProperty對數據進行劫持,來實現視圖響應數據的變化,然而有些時候我們的組件就是純粹的數據展示,不會有任何改變,我們就不需要 vue來劫持我們的數據,在大量數據展示的情況下,這能夠很明顯的減少組件初始化的時間,那如何禁止 vue劫持我們的數據呢?
  • Vue 開發必須知道的 36 個技巧
    前言Vue基本用法很容易上手,但是有很多優化的寫法你就不一定知道了,本文從列舉了 36 個 vue 開發技巧;後續 Vue 3.x 出來後持續更新.// 設置那麼House在組件模板內就可以遞歸使用了,不過需要注意的是,// 必須給一個條件來限制數量,否則會拋出錯誤: max stack size exceeded// 組件遞歸用來開發一些具體有未知層級關係的獨立組件。
  • 什麼是vue?在項目開發中為什麼要用vue?
    在近兩年的web及項目開發中,vue技術的使用越來越普遍,其各種資料、介紹以及使用攻略內容資料非常多,那麼vue到底什麼?在項目開發中,vue起到什麼作用?它與傳統的html+css+js+lamp開發網站項目又有什麼區別呢?
  • 2020年 16 個很有用的 Vue UI庫
    Vuetify有超過100個組件元素,帶有響應式網格系統,完全支持事件處理。通過每周的補丁和持續的更新,Vuetify 很可能在未來幾年內仍然是很受歡迎的Vue庫之一。Vue Material (⭐️ 8587)網站: https://vuematerial.io/github: https://github.com/vuematerial/vue-materialVue Material 是一個輕量級的框架, 建立在谷歌的 Material Design 基礎上。
  • 「Vue.js開發連載一」Vue.js簡介
    二、Vue能做什麼vue是一個js框架,幫你把DOM操作都綁定到數據操作上,省去了開發者寫操作DOM的代碼,同時給了你一套規範,讓你的代碼更容易維護,可復用性更高,讓開發體驗更好,可以輕鬆做出APP體驗的頁面。
  • 如何用 Vue + Vuetify 快速建站?
    懂點基礎,學點套路,輕鬆用 Vue 寫個網站(微信顯示代碼真是捉急,直接點擊閱讀原文到簡書看吧,用電腦可以去我的博客
  • vue高級進階系列——用typescript玩轉vue和vuex
    本文轉載自【微信公眾號:趣談前端,ID:beautifulFront】經微信公眾號授權轉載,如需轉載與原文作者聯繫用過vue的朋友大概對vuex也不陌生,vuex的官方解釋是專為 Vue.js 應用程式開發的狀態管理模式。它採用集中式存儲管理應用的所有組件的狀態,並以相應的規則保證狀態以一種可預測的方式發生變化。
  • 前端技術:開發一個vue中央事件總線插件vue-bus
    首先,我們使用vue-cli創建一個項目vue-bus, 在src目錄下,新建vue-bus.js文件,vue-bus插件像vue-router 和 Vuex一樣,給Vue對象添加一個屬性$bus,並代理$emit、$on、$off三個方法。
  • Vue CLI 3.0 正式發布,Vue.js 開發標準化工具
    因此,Vue CLI 3 對具備以下特點的項目都支持開箱即用:預配置的 webpack 功能,如模塊熱替換、代碼分割、 搖樹優化(tree-shaking)、高效持久化緩存、錯誤覆蓋等;通過 Babel 7 + preset-env 對 ES2017 進行轉換和基於使用情況的 polyfill 注入支持 PostCSS(默認啟用 autoprefixer
  • Vue.js 作者回應『Angular有哪些地方比Vue更優秀?』
    Vue 的單測不僅僅支持 Karam + Jasmine - 事實上社區有廣泛的單測反饋,對於 Jest, Ava 都有實踐,我們正在開發中的官方的單測工具庫 vue-test-utils (由社區最流行的單測庫 avoriaz 的開發者開發)會進一步簡化常見的組件單測斷言需求,並且還會有和所有主流 test runner 的整合指南。
  • Vue.js 2.5 發布,而這個會玩的團隊已經自研出用 Vue 開發小程序的...
    為了提高開發效率,增強開發體驗,我們造了個用 Vue 開發小程序的輪子小程序開發特點微信小程序推薦簡潔的開發方式,通過多頁面聚合完成輕量的產品功能。小程序以離線包方式下載到本地,通過微信客戶端載入和啟動,開發規範簡潔,技術封裝徹底,自成開發體系,有 Native 和 H5 的影子,但又絕不雷同。
  • 這10 個技巧讓你成為一個更好的 Vue 開發者
    這 10 個技巧讓你成為一個更好的 Vue 開發者 我比較喜歡使用 Vue 來開發,所以有時會深入研究其功能和特性。通過這篇文章,向你們介紹十個很酷的竅門和技巧,以幫助大家成為更好的 Vue 開發者。
  • Vue最重要的知識點:組件化開發
    再學一下vue中的組件化開發,包括全局、局部組件以及父子組件之間的通信。最後關於組件框架,後續在項目中遇到具體的需求再做說明。三、組件化開發組件的使用,比如說網易雲音樂就是一個典型的例子,多個頁面共用一個頭部導航欄,所以需要在不同的組件中共享導航欄組件。這就叫做組件化開發。
  • Vue Element+Node.js開發企業通用管理後臺系統
    課程對 Vue 和 Node 有較為深入的應用,不僅會教大家如何實現功能,更會講解技術背後的原理,幫助大家做到舉一反三。6-1 vuex實現原理講解6-2 vue-router實現原理講解6-3 vue-router路由守衛6-4 vue-router路由元信息6-5 vue-router API的使用第7章 前端開發框架搭建集成 Github 4.3w+ Star的明星項目 vue-element-admin,本節將基於該項目完成前端框架搭建。
  • thinkphp如何使用vue進行web開發
    終於我有機會,在一個公司內部的管理系統中成功將兩者融合。整個項目的系統後臺使用php的thinkphp框架,前端使用vue的element ui框架,前後臺交互使用axios庫。這就是整個架構了。我要介紹的重點也就是大家關心的thinkphp,如何與vue交互。
  • 「不容錯過」34條 Vue 高質量實戰技巧
    希望讀完這3篇文章,你能對 Vue 有個更深入的認識。7種組件通信方式隨你選組件通信是 Vue 的核心知識,掌握這幾個知識點,面試開發一點問題都沒有。props/@on+$emit用於實現父子組件間通信。
  • 揭密vue.js的神秘之處,小程序跟vue有什麼關係
    微容用的微信小程序平臺採用開發思路是前後端分離,前端採用vue.js+h5+jq開發,後端採用MVE的思路,用php開發,用vue.js構建來微信小程序可視化前端之後,微容給大家介紹下vue的來源和特徵。
  • Vue 3全新的Web開發構建工具——Vite介紹
    Vite是Vue的作者尤雨溪開發的Web開發構建工具,它是一個基於瀏覽器原生ES模塊導入的開發伺服器,在開發環境下,利用瀏覽器去解析import,在伺服器端按需編譯返回,完全跳過了打包這個概念,伺服器隨啟隨用。
  • 12 種使用 Vue 的優秀做法
    在本文中,主要分享在平時開發中一些有用資源和技巧,廢話少說,我們開始吧。不要在同個元素上同時使用`v-if`和`v-for`指令為了過濾數組中的元素,我們很容易將v-if與v-for在同個元素同時使用。
  • Vue-使用vue-video-player組件
    在實際開發過程中會有添加視頻的需求在vue項目中添加視頻可以使用vue-video-player組件來實現實現步驟:1.安裝在控制臺輸入: npm install vue-video-player –s