7個有用的Vue開發技巧

1 狀態共享

隨著組件的細化,就會遇到多組件狀態共享的情況,Vuex當然可以解決這類問題,不過就像Vuex官方文檔所說的,如果應用不夠大,為避免代碼繁瑣冗余,最好不要使用它,今天我們介紹的是vue.js 2.6新增加的Observable API ,通過使用這個api我們可以應對一些簡單的跨組件數據狀態共享的情況。

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

首先創建一個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.users[0] = newValue// 改變引用依然會觸發視圖響應this.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結果如下,可以看到多余的aul標簽的樣式都沒了

4 作用域插槽

利用好作用域插槽可以做一些很有意思的事情,比如定義一個基礎布局組件A,只負責布局,不管數據邏輯,然后另外定義一個組件B負責數據處理,布局組件A需要數據的時候就去B里面去取。假設,某一天我們的布局變了,我們只需要去修改組件A就行,而不用去修改組件B,從而就能充分復用組件B的數據處理邏輯,關于這塊我之前寫過一篇實際案例,可以點擊這里查看。

這里涉及到的一個最重要的點就是父組件要去獲取子組件里面的數據,之前是利用slot-scope,自vue 2.6.0起,提供了更好的支持 slotslot-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-bindv-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 函數式組件

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

寫法如下:

  1. template標簽里面標明functional
  2. 只接受props
  3. 不需要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,其它的生命周期事件,例如:createdupdated等都可以,是不是特別方便~

參考鏈接:

  • vueTips
  • vuePost

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/536445.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/536445.shtml
英文地址,請注明出處:http://en.pswp.cn/news/536445.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Kewail-郵件短信接口的基礎教程

短信接口接入流程開始接入手機短信接口接入操作流程&#xff1a;申請短信簽名 → 申請短信模板 → 生成AccessKey → 下載DEMO/攢寫接口調用文檔 → 免費測試發送 → 購買發信量正式使用。一、申請短信簽名接入API接口&#xff0c;通過1069通道發送驗證碼等短信&#xff0c;必須…

傳百度無人車計劃分拆,百度回復:不實信息,目前未有分拆計劃

據《財經》報道&#xff0c;百度無人車項目正在籌備分拆(spin off)當中&#xff0c;且正在尋找外部投資機構融資。一位接近百度無人車項目人士對《財經》表明&#xff0c;分拆就是時間問題。對于無人車項目分拆一事&#xff0c;百度對 36 氪表示&#xff0c;媒體報道不實。目前…

又見回文

又見回文 Time Limit: 1000 ms Memory Limit: 65536 KiB Submit Statistic Discuss Problem Description “回文串”是一個正讀和反讀都一樣的字符串&#xff0c;比如“level”或者“noon”等等就是回文串。現在呢&#xff0c;就是讓你判斷輸入的字符串是否是回文串。 Inpu…

Fighting_小銀考呀考不過四級【遞推】

Fighting_小銀考呀考不過四級 Time Limit: 1000 ms Memory Limit: 65536 KiB Submit Statistic Discuss Problem Description 四級考試已經過去好幾個星期了&#xff0c;但是小銀還是對自己的英語水平擔心不已。 小銀打算好好學習英語&#xff0c;爭取下次四級考試和小學弟小…

從xml中返回的對象,和new 返回的對象時不同的。

public BigDecimal getTax() {return tax null ? BigDecimal.ZERO : tax;} 這是自定義的一個類 對null 做出了處理。 但是如果是直接從xml 查詢返回的該對象&#xff0c; tax() 字段還是會產生null <resultMap id"twoToNine" type"" ><result …

三國佚事——巴蜀之危【遞推】

三國佚事——巴蜀之危 Time Limit: 1000 ms Memory Limit: 65536 KiB Submit Statistic Discuss Problem Description 話說天下大勢&#xff0c;分久必合&#xff0c;合久必分。。。卻道那魏蜀吳三國鼎力之時&#xff0c;多少英雄豪杰以熱血譜寫那千古之絕唱。古人誠不我欺…

HTTP Authentication(HTTP認證)(轉)

HTTP協議規范中有兩種認證方式&#xff0c;一種是Basic認證&#xff0c;另外一種是Digest認證&#xff0c;這兩種方式都屬于無狀態認證方式&#xff0c;所謂無狀態即服務端都不會在會話中記錄相關信息&#xff0c;客戶端每次訪問都需要將用戶名和密碼放置報文一同發送給服務端&…

們--加強斐波那契【遞推】

們--加強斐波那契 Time Limit: 1000 ms Memory Limit: 65536 KiB Submit Statistic Discuss Problem Description 對于斐波那契數列想必各位已經見過了。這里給出一個加強版。 F[i] i (i < 3); F[i] F[i-1] F[i-2] F[i-3](i > 4); Input 多組輸入。每組輸入一…

inux CentOS 7 修改內核啟動默認順序

2019獨角獸企業重金招聘Python工程師標準>>> inux CentOS 7 修改內核啟動默認順序 2018年12月07日 09:53:32 XueShengke 閱讀數&#xff1a;781 轉載于&#xff1a;21運維 Linux CentOS 7.X 如何修改內核啟動默認順序 我們知道&#xff0c;centos 6.x是通過/etc/gr…

快速掌握ajax!

ajax是什么&#xff1f;ajax——asynchronous JavaScript and xml&#xff1a;異步的js和xml它能使用js訪問服務器&#xff0c;而且是異步訪問服務器給客戶端的響應一般是整個頁面&#xff0c;一個html完整頁面&#xff01;但在ajax中因為是局部刷新&#xff0c;那么服務器就不…

鎖底層之內存屏障與原語指令

Java內存模型1&#xff0e;工作內存和主內存Java內存模型規定所有的變量都存儲在主內存中&#xff08;JVM內存的一部分&#xff09;&#xff0c;每個線程有自己獨立的工作內存&#xff0c;它保存了被該線程使用的變量的主內存復制。線程對這些變量的操作都在自己的工作內存中進…

微信點擊鏈接,用默認瀏覽器中打開指定網址鏈接!

2019獨角獸企業重金招聘Python工程師標準>>> 最近有客戶咨詢&#xff0c;自己的鏈接在微信種推廣&#xff0c;經常會被無緣無故封殺&#xff0c;有沒有一種功能&#xff0c;用戶在微信中點擊我們推廣的鏈接&#xff0c;可以自動強制跳轉到手機默認瀏覽器中打開指定的…

elasticsearch存儲空間不足導致索引只讀,不能創建

問題描述 1.添加數據時&#xff0c;報錯&#xff0c;原因是&#xff0c;一旦在存儲超過95&#xff05;的磁盤中的節點上分配了一個或多個分片的任何索引&#xff0c; 該索引將被強制進入只讀模式 ClusterBlockException[blocked by: [FORBIDDEN/12/index read-only / allow del…

java版spring cloud+spring boot 社交電子商務平臺:服務消費(基礎)

使用LoadBalancerClientSpring cloud b2b2c電子商務社交平臺源碼請加企鵝求求&#xff1a;一零三八七七四六二六。在Spring Cloud Commons中提供了大量的與服務治理相關的抽象接口&#xff0c;包括DiscoveryClient、這里我們即將介紹的LoadBalancerClient等。對于這些接口的定義…

Monthly Expense【二分】

B - Monthly Expense POJ - 3273 Farmer John is an astounding accounting wizard and has realized he might run out of money to run the farm. He has already calculated and recorded the exact amount of money (1 ≤ moneyi ≤ 10,000) that he will need to spend …

關于HTTP協議,一篇就夠了

原文地址&#xff1a;https://www.cnblogs.com/ranyonsue/p/5984001.html HTTP簡介 HTTP協議是Hyper Text Transfer Protocol&#xff08;超文本傳輸協議&#xff09;的縮寫,是用于從萬維網&#xff08;WWW:World Wide Web &#xff09;服務器傳輸超文本到本地瀏覽器的傳送協議…

Oracle關聯查詢-數據類型不一致問題 ORA-01722: 無效數字

一、存在表A和表B&#xff0c;都包含字段user_no&#xff0c;但數據類型不一致&#xff0c;如下&#xff1a; create table A ( user_id varchar2(20), user_no number(12,0), xxx ); create table B ( user_name varchar2(60), user_no varchar2(20), xxx ); 二、現有某項業務…

1096: 字符逆序

1096: 字符逆序 Time Limit: 1 Sec Memory Limit: 64 MB Submit: 2017 Solved: 1059 [Submit][Status][Web Board] Description 將一個字符串str的內容顛倒過來&#xff0c;并輸出。str的長度不超過100個字符。 Input 輸入包括一行。 第一行輸入的字符串。 Output 輸出…

Ajax_Apache訪問資源文件的權限配置、資源存放路徑配置、配置虛擬主機、動態網站靜態網站區別...

1、配置資源的訪問權限 修改配置文件&#xff1a;httpd.conf 文件 改完之后要重啟 2、切換資源默認存放目錄www 修改配置文件httpd.conf 文件中的存放目錄 3、Apache是否能夠同時支持多個站點 Apache能否支持通過不同的域名訪問不同的站點 可以 做法&#xff1a;配置虛擬主機…

Public Sale【博弈】

Public Sale Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 10573 Accepted Submission(s): 6257 Problem Description 雖然不想&#xff0c;但是現實總歸是現實&#xff0c;Lele始終沒有逃過退學的命運&am…