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.users[0] = newValue// 改變引用依然會觸發視圖響應this.users = newArray}};3 去除多余的樣式
隨著項目越來越大,書寫的不注意,不自然的就會產生一些多余的css,小項目還好,一旦項目大了以后,多余的css會越來越多,導致包越來越大,從而影響項目運行性能,所以有必要在正式環境去除掉這些多余的css,這里推薦一個庫purgecss,支持CLI、JavascriptApi、Webpack等多種方式使用,通過這個庫,我們可以很容易的去除掉多余的css。
新聞熱點
疑難解答
圖片精選