主頁 > 軟體設計 > 25個 Vue 技巧,開發了5年了,有些竟然還是第一次見!

25個 Vue 技巧,開發了5年了,有些竟然還是第一次見!

2021-07-30 08:14:10 軟體設計

作者:Michael Thiessen
譯者:前端小智
來源:dev

有夢想,有干貨,微信搜索 【大遷世界】 關注這個在凌晨還在刷碗的刷碗智,

本文 GitHub https://github.com/qq449245884/xiaozhi 已收錄,有一線大廠面試完整考點、資料以及我的系列文章,

學習成為一個更好的Vue開發者并不總是關于那些需要花時間和精力才能掌握的大概念,掌握一些技巧和竅門,可以讓我們的編程生活變得更容易–沒有大量重復的作業,

在用 Vue 開發的這幾年里,我學到了很多有用的技巧,有些很取巧,有些幾乎每天都在用,有些則更高級–但它們都很有用,

1. 將一個 prop 限制在一個型別的串列中

使用 prop 定義中的 validator 選項,可以將一個 prop 型別限制在一組特定的值中,

export default {
  name: 'Image',
  props: {
    src: {
      type: String,
    },
    style: {
      type: String,
      validator: s => ['square', 'rounded'].includes(s)
    }
  }
};

這個驗證函式接受一個prop,如果prop有效或無效,則回傳truefalse

當單單傳入的 true 或 false 來控制某些條件不能滿足需求時,我通常使用這個方法來做,

按鈕型別或警告型別(資訊、成功、危險、警告)是最常見的用法、、,顏色也是一個很好的用途,

2. 默認內容和擴展點

Vue中的槽可以有默認的內容,這使我們可以制作出更容易使用的組件,

<button class="button" @click="$emit('click')">
  <slot>
    <!-- Used if no slot is provided -->
    Click me
  </slot>
</button>

我最喜歡使用默認槽,就是用它們來創建擴展點,

我們可以取組件的任何部分,將其封裝在一個插槽中,在外面我們可以用想要的任何內容覆寫組件的該部分,默認情況下,它仍然會按照原來的方式作業,但這樣做會有了更多的選項

<template>
  <button class="button" @click="$emit('click')">
    <slot>
      <div class="formatting">
        {{ text }}
      </div>
    </slot>
  </button>
</template>

現在我們可以用許多不同的方式使用這個組件,簡單的、默認的方式,或者自定義的方式,

<!-- Uses default functionality of the component -->
<ButtonWithExtensionPoint text="Formatted text" />

<ButtonWithExtensionPoint>
  <div class="different-formatting">
    Do something a little different here
  </div>
</ButtonWithExtensionPoint>

3. 使用引號來監聽嵌套屬性

你可能不知道這一點,我們可以通過使用引號輕松地直接監聽嵌套值:

watch {
  '$route.query.id'() {
    // ...
  }
}

4. 知道何時使用v-if(以及何時避免使用)

與其使用v-if,有時使用v-show來代替,會有更高的性能,

<ComplicatedChart v-show="chartEnabled" />

v-if被打開或關閉時,它將創建并完全銷毀該元素,相反,v-show將創建該元素并將其留在那里,通過設定其樣式為display: none來隱藏它,

如果你要切換的組件的渲染成本很高,那么這樣做會更有效率,

反過來說,如果不需要立即執行昂貴的組件件,可以使用v-if,這樣它就會跳過渲染它,而使頁面的加載速度更快一些,

5. 單個作用域插槽的簡寫(不需要 template 標簽)

限定范圍的插槽非常有趣,但為了使用它們,您還必須使用許多模板標記,

幸運的是,有一個簡寫可以讓我們擺脫它,但只有在我們使用單個作用域槽的情況下,

普通寫法:

<DataTable>
  <template #header="tableAttributes">
    <TableHeader v-bind="tableAttributes" />
  </template>
</DataTable>

不使用 template:

<DataTable #header="tableAttributes">
  <TableHeader v-bind="tableAttributes" />
</DataTable>

簡單、直截了當,令人贊嘆不已,

6. 有條件地渲染插槽

我們先來看如何做,然后在討論為什么想隱藏插槽,

每個Vue組件都有一個特殊的$slots物件,里面有你所有的插槽,默認槽的鍵是default,任何被命名的槽都使用其名稱作為鍵,

const $slots = {
  default: <default slot>,
  icon: <icon slot>,
  button: <button slot>,
};

但這個$slots物件只有適用于該組件的插槽,而不是每一個定義的插槽,

拿這個定義了幾個插槽的組件來說,包括幾個命名的插槽,

<!-- Slots.vue -->
<template>
  <div>
    <h2>Here are some slots</h2>
    <slot />
    <slot name="second" />
    <slot name="third" />
  </div>
</template>

如果我們只對組件應用一個插槽,那么只有那個插槽會顯示在我們的$slots物件中,

<template>
  <Slots>
    <template #second>
      This will be applied to the second slot.
    </template>
  </Slots>
</template>
$slots = { second: <vnode> }

我們可以在我們的組件中使用這一點來檢測哪些插槽已經被應用到組件中,例如,通過隱藏插槽的包裝元素,

<template>
  <div>
    <h2>A wrapped slot</h2>
    <div v-if="$slots.default" class="styles">
      <slot />
    </div>
  </div>
</template>

現在,應用樣式的包裝器div只有在我們用某些東西填充這個插槽時才會被渲染,

如果不使用v-if,那么如果沒有插槽,就會得到一個空的不必要的div,根據div的樣式,這可能會打亂我們的布局,讓界面看起來很奇怪,

那么,為什么我們希望能夠有條件地渲染插槽呢?

使用條件插槽的主要原因有三個:

  • 當使用封裝的div來添加默認樣式時
  • 插槽是空的
  • 如果我們將默認內容與嵌套槽相結合

例如,當我們在添加默認樣式時,我們在插槽周圍添加一個div:

<template>
  <div>
    <h2>This is a pretty great component, amirite?</h2>
    <div class="default-styling">
      <slot >
    </div>
    <button @click="$emit('click')">Click me!</button>
  </div>
</template>

然而,如果父組件沒有將內容應用到該插槽中,我們最侄訓在頁面上渲染出一個空的div

<div>
  <h2>This is a pretty great component, amirite?</h2>
  <div class="default-styling">
    <!-- 槽中沒有內容,但這個div 仍然被渲染,糟糕 -->
  </div>
  <button @click="$emit('click')">Click me!</button>
</div>

解決方法就是像上面講的一樣,多個條件判斷,就行啦,

7. 如何監聽一個插槽的變化

有時我們需要知道插槽內的內容何時發生了變化,

<!-- 可惜這個事件不存在 -->
<slot @change="update" />

不幸的是,Vue沒有內置的方法讓我們檢測這一點,

然而,我的朋友Austin想出了一個非常干凈的方法,使用MutationObserver來做這件事,

MutationObserver介面提供了監視對DOM樹所做更改的能力,它被設計為舊的Mutation Events功能的替代品,該功能是DOM3 Events規范的一部分,

export default {
  mounted() {
    // 當有變化時呼叫`update`
    const observer = new MutationObserver(this.update);

    // 監聽此組件的變化
    observer.observe(this.$el, {
      childList: true,
      subtree: true
    });
  }
};

這個涉及的內容還是很多的,后面會單獨出一篇文章來講,記得關注刷碗智的公眾號 <大遷世界> 哦

8. 將區域和全域的 style混合在一起

通常情況下,在處理樣式時,我們希望它們能被劃分到一個單獨的組件中,

<style scoped>
  .component {
    background: green;
  }
</style>

不過,如果需要的話,也可以添加一個非作用域樣式塊來添加全域樣式

<style>
  /* 全域 */
  .component p {
    margin-bottom: 16px;
  }
</style>

<style scoped>
  /* 在該組件內有效 */
  .component {
    background: green;
  }
</style>

但要小心,全域樣式是危險的,難以追蹤,但有時,它們是一個完美的逃生艙口,正是你所需要的,

9. 重寫子組件的樣式–正確的方法

Scoped CSS在保持內容整潔方面非常棒,而且不會將樣式引入應用的其他組件中,

但有時你需要覆寫一個子組件的樣式,并跳出這個作用域,

Vue有一個 deep 選擇器:

<style scoped>
.my-component >>> .child-component {
  font-size: 24px;
}
</style>

注意:如果你使用像SCSS這樣的CSS前處理器,你可能需要使用/deep/來代替,

10. 用背景關系感知組件創造魔法

**背景關系感知組件(context-aware)**是“魔法的”,它們自動適應周圍發生的事情,處理邊緣情況、狀態共享等等,

有3種主要的 context-aware ,但 Configuration 是我最感興趣的一種,

1.狀態共享

當你把一個大的組件分解成多個小的組件時,它們往往仍然需要共享狀態,

我們可以在 "幕后 "做這些作業,而不是把這些作業推給使用者,

我們一般會把 Dropdown 組件分解成 SelectOption 組件,這樣會獲得更多的靈活性,但是為了方便使用,SelectOption組件彼此共享 selected 狀態,

<!-- 為簡單起見,作為一個單一組件使用 -->
<Dropdown v-model="selected" :options="[]" />

<!-- 分多個組件,更靈活 -->
<Select v-model="selected">
  <Option value="mustard">Mustard</Option>
  <Option value="ketchup">Ketchup</Option>
  <div class="relish-wrapper">
    <Option value="relish">Relish</Option>
  </div>
</Select>

2. Configuration

有時,一個組件的行為需要根據應用程式的其他部分的情況來改變,這通常是為了自動處理邊緣情況,否則處理起來會很煩人,

一個 PopupTooltip 應該重新定位,以便它不會溢位頁面,但是,如果該組件是在一個modal 內,它應該重新定位,以便它不會溢位 modal,

如果Tooltip知道它是在一個模態里面,這可以自動完成,

3.樣式

創建了 context-aware的CSS,根據父級或同級元素的情況應用不同的樣式,

.statistic {
  color: black;
  font-size: 24px;
  font-weight: bold;
}

.statistic + .statistic {
  margin-left: 10px;
}

CSS變數讓我們更進一步,允許我們在一個頁面的不同部分設定不同的值,

11. 如何在Vue之外創建一個具有回應性的變數(Vue2和3)

如果你從Vue之外得到一個變數,讓它具有反應性是很好的,

這樣,我們就可以在computed propswatch和其他任何地方使用它,它的作業方式就像Vue中的任何其他狀態一樣,

如果我們使用的選項API,需要的只是將其放在組件的資料部分中:

const externalVariable = getValue();

export default {
  data() {
    return {
      reactiveVariable: externalVariable,
    };
  }
};

如果使用Vue3的組合API,可以直接使用refreactive

import { ref } from 'vue';

// 可以完全在Vue組件之外完成
const externalVariable = getValue();
const reactiveVariable = ref(externalVariable);

console.log(reactiveVariable.value);

使用 reactive 代替:

import { reactive } from 'vue';

//  可以完全在Vue組件之外完成
const externalVariable = getValue();
// reactive 只對物件和陣列起作用
const anotherReactiveVariable = reactive(externalVariable);

// Access directly
console.log(anotherReactiveVariable);

如果你還在使用 Vue2,你可以使用observable而不是reactive來實作完全相同的結果,

12. v-for 中的解構

你知道可以在-vfor中使用解構嗎?

<li
  v-for="{ name, id } in users"
  :key="id"
>
  {{ name }}
</li>

更廣為人知的是,可以通過使用這樣的元組從v-for中取出索引,

<li v-for="(movie, index) in [
  'Lion King',
  'Frozen',
  'The Princess Bride'
]">
  {{ index + 1 }} - {{ movie }}
</li>

當使用一個物件時,可以這樣使用 key

<li v-for="(value, key) in {
  name: 'Lion King',
  released: 2019,
  director: 'Jon Favreau',
}">
  {{ key }}: {{ value }}
</li>

也可以將這兩種方法結合起來,獲取key以及屬性的 index

<li v-for="(value, key, index) in {
  name: 'Lion King',
  released: 2019,
  director: 'Jon Favreau',
}">
  #{{ index + 1 }}. {{ key }}: {{ value }}
</li>

13. 在指定范圍內回圈

v-for指令允許我們遍歷陣列,但它也允許我們遍歷一個范圍

<template>
  <ul>
    <li v-for="n in 5">Item #{{ n }}</li>
  </ul>
</template>

渲染結果:

Item #1
Item #2
Item #3
Item #4
Item #5

當我們使用帶范圍的v-for時,它將從1開始,以我們指定的數字結束,

14. 監聽你的組件中的任何東西

export default {
  computed: {
    someComputedProperty() {
      // Update the computed prop
    },
  },
  watch: {
    someComputedProperty() {
      // Do something when the computed prop is updated
    }
  }
};

我們可以監聽:

  • 計算屬性
  • props
  • 嵌套值

如果你使用組合API,任何值都可以被監視,只要它是一個refreactive物件,

15.竊取 prop 型別

我從一個子組件中復制 prop 型別,只是為了在一個父組件中使用它們,但我發現,偷取這些 prop 型別要比僅僅復制它們好得多,

例如,我們在這個組件中使用了一個Icon組件,

<template>
  <div>
    <h2>{{ heading }}</h2>
    <Icon
      :type="iconType"
      :size="iconSize"
      :colour="iconColour"
    />
  </div>
</template>

為了讓它作業,我們需要添加正確的 prop 型別,從``Icon`組件復制,

import Icon from './Icon';
export default {
  components: { Icon },
  props: {
    iconType: {
      type: String,
      required: true,
    },
    iconSize: {
      type: String,
      default: 'medium',
      validator: size => [
        'small',
        'medium',
        'large',
        'x-large'
      ].includes(size),
    },
    iconColour: {
      type: String,
      default: 'black',
    },
    heading: {
      type: String,
      required: true,
    },
  },
};

多么痛苦啊,

Icon 組件的 prop型別被更新時,我們肯定會忘記回傳這個組件并更新它們,隨著時間的推移,當該組件的 prop型別開始偏離Icon組件中的 prop 型別時,就會引入錯誤,

因此,這就是為什么我們要竊取組件的 prop 型別:

import Icon from './Icon';
export default {
  components: { Icon },
  props: {
    ...Icon.props,
    heading: {
      type: String,
      required: true,
    },
  },
};

不需要再復雜了,

除了在我們的例子中,我們把 icon 加在每個 prop 名稱的開頭,所以我們必須做一些額外的作業來實作這一點,

import Icon from './Icon';

const iconProps = {};

Object.entries(Icon.props).forEach((key, val) => {
  iconProps[`icon${key.toUpperCase()}`] = val;
});

export default {
  components: { Icon },
  props: {
    ...iconProps,
    heading: {
      type: String,
      required: true,
    },
  },
};

現在,如果Icon組件中的 prop 型別被修改,我們的組件將保持最新狀態,

但是,如果一個 prop 型別從 Icon 組件中被添加或洗掉了呢?為了應對這些情況,我們可以使用v-bind和一個計算的 prop 來保持動態,

16. 檢測元素外部(或內部)的單擊

有時我需要檢測一個點擊是發生在一個特定元素el的內部還是外部,這就是我通常使用的方法,

window.addEventListener('mousedown', e => {
  // 獲取被點擊的元素
  const clickedEl = e.target;
  
  if (el.contains(clickedEl)) {
   //在 "el "里面點擊了
  } else {
   //在 "el "外點擊了
  }
});

17. 遞回插槽

有一次,我決定看看我是否可以只用模板來做一個v-for組件,在這個程序中,我也發現了如何遞回地使用槽,

<!-- VFor.vue -->
<template>
    <div>
        <!--  渲染第一項 -->
    {{ list[0] }}
        <!-- 如果我們有更多的專案,繼續!但是不要使用我們剛剛渲染的項 -->
    <v-for
      v-if="list.length > 1"
            :list="list.slice(1)"
        />
    </div>
</template>

如果你想用作用域插槽來做這件事,只是需要一些調整

<template>
  <div>
    <!-- Pass the item into the slot to be rendered -->
    <slot v-bind:item="list[0]">
      <!-- Default -->
      {{ list[0] }}
    </slot>

    <v-for
      v-if="list.length > 1"
      :list="list.slice(1)"
    >
      <!-- Recursively pass down scoped slot -->
      <template v-slot="{ item }">
        <slot v-bind:item="item" />
      </template>
    </v-for>
  </div>
</template>

下面是這個組件的使用方法,

<template>
  <div>
    <!-- 常規串列 -->
    <v-for :list="list" />

    <!-- 加粗的專案串列 -->
    <v-for :list="list">
      <template v-slot="{ item }">
        <strong>{{ item }}</strong>
      </template>
    </v-for>
  </div>
</template>

18. 組件元資料

并不是添加到一個組件的每一點資訊都是狀態,有時我們需要添加一些元資料,給其他組件提供更多資訊,

例如,如果正在為谷歌 analytics這樣的分析儀表:

3605934229-60fc46222c6ff_fix732.png

如果你想讓布局知道每個小組件應該占多少列,你可以直接在組件上添加元資料,

export default {
  name: 'LiveUsersWidget',
  // 👇 只需將其作為一個額外的屬性添加
  columns: 3,
  props: {
    // ...
  },
  data() {
    return {
      //...
    };
  },
};
export default {
  name: 'LiveUsersWidget',
  // 👇  只需將其作為一個額外的屬性添加
  columns: 3,
  props: {
    // ...
  },
  data() {
    return {
      //...
    };
  },
};

你會發現這個元資料是組件上的一個屬性,

import LiveUsersWidget from './LiveUsersWidget.vue';
const { columns } = LiveUsersWidget;

我們也可以通過特殊的$options屬性從組件內部訪問元資料,

export default {
  name: 'LiveUsersWidget',
  columns: 3,
  created() {
    // 👇 `$options` contains all the metadata for a component
    console.log(`Using ${this.$options.metadata} columns`);
  },
};

只要記住,這個元資料對組件的每個實體都是一樣的,而且不是回應式的,

這方面的其他用途包括(但不限于):

  • 保持單個組件的版本號
  • 用于構建工具的自定義標志,以區別對待組件
  • 在計算屬性、資料、watch 等之外為組件添加自定義功能
  • 其它

19. 多檔案單檔案組件

這是**SFC(單檔案組件)**的一點已知功能,

可以像常規HTML檔案一樣匯入檔案:

<template src="./template.html"></template>
<script src="./script.js"></script>
<style scoped src="./styles.css"></style>

如果你需要分享樣式、檔案或其他任何東西,這可能會非常方便,

20. 可重復使用的組件并不是你所想的那樣

可重復使用的組件不一定是大的或復雜的東西,

我經常讓小的和短的組件可以重復使用,

因為我沒有到處重寫這段代碼,所以更新它變得更加容易,而且我可以確保每個OverflowMenu的外觀和作業方式都完全一樣–因為它們是一樣的!",

<!-- OverflowMenu.vue -->
<template>
  <Menu>
    <!-- 添加一個自定義按鈕來觸發我們的選單   -->
    <template #button v-slot="bind">
      <!-- 使用bind來傳遞click處理程式、a11y 屬性等 -->
      <Button v-bind="bind">
        <template #icon>
          <svg src="./ellipsis.svg" />
        </template>
      </Button>
    </template>
  </Menu>
</template>

在這里,我們采用了一個選單組件,但在觸發它的按鈕上添加了一個 ellipsis 圖示,(省略號)的圖示來觸發它的打開,

這似乎不值得把它做成一個可重復使用的組件,因為它只有幾行,難道我們就不能在每次要使用這樣的選單時添加圖示嗎?

但是這個OverflowMenu將被使用幾十次,現在如果我們想更新圖示或它的行為,我們可以非常容易地做到,而且,使用它也更簡單了,

21. 從組件外部呼叫一個方法

我們可以從一個組件的外部通過給它一個 ref 用來呼叫一個方法,

<!-- Parent.vue -->
<template>
  <ChildComponent ref="child" />
</template>
// Somewhere in Parent.vue
this.$refs.child.method();

再解釋一下這個問題,

有時候,“最佳實踐”并不適用于你正在做的事情,你需要一個像這樣的逃生口,

通常情況下,我們使用 props 和 events 在組件之間進行交流,props 被下發到子組件中,而events 被上發到父組件中,

<template>
  <ChildComponent
    :tell-me-what-to-do="someInstructions"
    @something-happened="hereIWillHelpYouWithThat"
  />
</template>
// Child.vue
export default {
  props: ['trigger'],
  watch: {
    shouldCallMethod(newVal) {
      if (newVal) {
        // Call the method when the trigger is set to `true`
        this.method();
      }
    }
  }
}

這可以正常作業,但只能在第一次呼叫時使用,如果您需要多次觸發此操作,則必須進行清理并重置狀態,邏輯是這樣的

  • 父組件將 true 傳遞給觸發器 prop
  • Watch 被觸發,然后 Child 組件呼叫該方法
  • 子組件發出一個事件,告訴父組件該方法已被成功觸發
  • Parent組件將 trigger 重置為 false,所以我們可以從頭再來一次

相反,如果我們在子組件上設定一個 ref,我們可以直接呼叫該方法:

<!-- Parent.vue -->
<template>
  <ChildComponent ref="child" />
</template>
// Somewhere in Parent.vue
this.$refs.child.method();

是的,我們打破了 “props down, events up"” 的規則,我們打破了封裝,但是這樣做更清晰,更容易理解,所以是值得的

有時,"最好的 "解決方案最侄訓成為最糟糕的解決方案,

22. 監聽陣列和物件

使用 watcher 最棘手的部分是,有時它似乎不能正確觸發,

通常,這是因為我們試圖監聽陣列或物件,但沒有將deep設定為true

export default {
  name: 'ColourChange',
  props: {
    colours: {
      type: Array,
      required: true,
    },
  },
  watch: {
    // 使用物件語法,而不僅僅是方法
    colours: {
      // 這將讓Vue知道要在陣列內部尋找
      deep: true,

      handler()
        console.log('The list of colours has changed!');
      }
    }
  }
}

使用Vue 3的API會是這樣的:

watch(
  colours,
  () => {
    console.log('The list of colours has changed!');
  },
  {
    deep: true,
  }
);

23. 用Vue Router進行深度鏈接

我們可以在URL中存盤(一點)狀態,允許我們直接跳到頁面上的一個特定狀態,

例如,你加載一個已經選擇了日期范圍過濾器的頁面:

someurl.com/edit?date-range=last-week

這對于應用中用戶可能共享大量鏈接的部分來說是非常棒的,對于服務器渲染的應用,或者在兩個獨立的應用之間通信的資訊比普通鏈接通常提供的更多,

我們可以存盤過濾器、搜索值、模態框是打開還是關閉,或者在串列的哪個位置滾動以完美地實作無限分頁,

使用 vue-router 獲取查詢引數是這樣作業的(這也適用于大多數Vue框架,如Nuxt和Vuepress):

const dateRange = this.$route.query.dateRange;

為了改變它,我們使用 RouterLink 組件并更新 query

<RouterLink :to="{
  query: {
    dateRange: newDateRange
  }
}">

24. template 標簽的另一個用途

template 標簽可以在模板中的任何地方使用,以更好地組織代碼,

我喜歡用它來簡化v-if邏輯,有時也用v-for

在這個例子中,我們有幾個元素都使用同一個v-if條件,

<template>
  <div class="card">
    <img src="imgPath" />
    <h3>
      {{ title }}
    </h3>
    <h4 v-if="expanded">
      {{ subheading }}
    </h4>
    <div
      v-if="expanded"
      class="card-content"
    >
      <slot />
    </div>
    <SocialShare v-if="expanded" />
  </div>
</template>

這有點笨拙,而且一開始并不明顯,一堆這樣的元素被顯示和隱藏在一起,在一個更大、更復雜的組件上,這可能是一個更糟糕的情況

但我們能優化它,

我們可以使用 template 標簽來分組這些元素,并將 v-if 提升到模板 template 本身,

<template>
  <div class="card">
    <img src="imgPath" />
    <h3>
      {{ title }}
    </h3>
    <template v-if="expanded">
      <h4>
        {{ subheading }}
      </h4>
      <div class="card-content">
        <slot />
      </div>
      <SocialShare />
    </template>
  </div>
</template>

現在看起來就更容易理解,而且它在做什么,一目了然,

25. 處理錯誤(和警告)的更好方法

我們可以為Vue中的錯誤和警告提供一個自定義處理程式,

// Vue 3
const app = createApp(App);
app.config.errorHandler = (err) => {
  alert(err);
};

// Vue 2
Vue.config.errorHandler = (err) => {
  alert(err);
};

像 Bugsnag 和 Rollbar 這樣的錯誤跟蹤服務,可以鉤住這些處理程式來記錄錯誤,但你也可以用它們來更優雅地處理錯誤,以獲得更好的用戶體驗,

例如,如果一個錯誤未被處理,應用程式不會直接崩潰,你可以顯示一個完整的錯誤螢屏,讓用戶重繪或嘗試其他東西,

在 Vue3 中,錯誤處理程式只能處理 templatewatcher 錯誤,但是 Vue2的錯誤處理程式可以捕獲幾乎所有錯誤,這兩個版本中的警告處理程式只在開發階段有效,

~ 完,我是刷碗智,刷碗,睡覺,打Lol 去,


代碼部署后可能存在的BUG沒法實時知道,事后為了解決這些BUG,花了大量的時間進行log 除錯,這邊順便給大家推薦一個好用的BUG監控工具 Fundebug,

原文:https://dev.to/michaelthiessen/25-vue-tips-you-ned-to-know-2h70

交流

有夢想,有干貨,微信搜索 【大遷世界】 關注這個在凌晨還在刷碗的刷碗智,

本文 GitHub https://github.com/qq449245884/xiaozhi 已收錄,有一線大廠面試完整考點、資料以及我的系列文章,

在這里插入圖片描述

轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/290929.html

標籤:其他

上一篇:【萬字長文】 Vue全家桶從入門到實戰,超詳細筆記整理 ( 一 ) (建議收藏)

下一篇:??三萬字詳解《十大入門演算法》突擊刷掉這幾個題,面試不慌!??(附原始碼,建議收藏)

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 面試突擊第一季,第二季,第三季

    第一季必考 https://www.bilibili.com/video/BV1FE411y79Y?from=search&seid=15921726601957489746 第二季分布式 https://www.bilibili.com/video/BV13f4y127ee/?spm_id_fro ......

    uj5u.com 2020-09-10 05:35:24 more
  • 第三單元作業總結

    1.前言 這應該是本學期最后一次寫作業總結了吧。總體來說,對作業的節奏也差不多掌握了,作業做起來的效率也更高了。雖然和之前的作業一樣,作業中都要用到新的知識,但是相比之前,更加懂得了如何利用工具以及資料。雖然之間卡過殼,但總體而言,這幾次作業還算完成的比較好。 2.作業程序總結 相比前兩個單元,此單 ......

    uj5u.com 2020-09-10 05:35:41 more
  • 北航OO(2020)第四單元博客作業暨課程總結博客

    北航OO(2020)第四單元博客作業暨課程總結博客 本單元作業的架構設計 在本單元中,由于UML圖具有比較清晰的樹形結構,因此我對其中需要進行查詢操作的元素進行了包裝,在樹的父節點中存盤所有孩子的參考。考慮到性能問題,我采用了快取機制,一次查詢后盡可能快取已經遍歷過的資訊,以減少遍歷次數。 本單元我 ......

    uj5u.com 2020-09-10 05:35:48 more
  • BUAA_OO_第四單元

    一、UML決議器設計 ? 先看下題目:第四單元實作一個基于JDK 8帶有效性檢查的UML(Unified Modeling Language)類圖,順序圖,狀態圖分析器 MyUmlInteraction,實際上我們要建立一個有向圖模型,UML中的物件(元素)可能與同級元素連接,也可與低級元素相連形成 ......

    uj5u.com 2020-09-10 05:35:54 more
  • 6.1邏輯運算子

    邏輯運算子 1. && 短路與 運算式1 && 運算式2 01.運算式1為true并且運算式2也為true 整體回傳為true 02.運算式1為false,將不會執行運算式2 整體回傳為false 03.只要有一個運算式為false 整體回傳為false 2. || 短路或 運算式1 || 運算式2 ......

    uj5u.com 2020-09-10 05:35:56 more
  • BUAAOO 第四單元 & 課程總結

    1. 第四單元:StarUml檔案決議 本單元采用了圖模型決議UML。 UML檔案可以抽象為圖、子圖、邊的邏輯結構。 在實作中,圖的節點包括類、介面、屬性,子圖包括狀態圖、順序圖等。 采用了三次遍歷UML元素的方法建圖,第一遍遍歷建點,第二、三次遍歷設定屬性、連邊,實作圖物件的初始化。這里借鑒了一些 ......

    uj5u.com 2020-09-10 05:36:06 more
  • 談談我對C# 多型的理解

    面向物件三要素:封裝、繼承、多型。 封裝和繼承,這兩個比較好理解,但要理解多型的話,可就稍微有點難度了。今天,我們就來講講多型的理解。 我們應該經常會看到面試題目:請談談對多型的理解。 其實呢,多型非常簡單,就一句話:呼叫同一種方法產生了不同的結果。 具體實作方式有三種。 一、多載 多載很簡單。 p ......

    uj5u.com 2020-09-10 05:36:09 more
  • Python 資料驅動工具:DDT

    背景 python 的unittest 沒有自帶資料驅動功能。 所以如果使用unittest,同時又想使用資料驅動,那么就可以使用DDT來完成。 DDT是 “Data-Driven Tests”的縮寫。 資料:http://ddt.readthedocs.io/en/latest/ 使用方法 dd. ......

    uj5u.com 2020-09-10 05:36:13 more
  • Python里面的xlrd模塊詳解

    那我就一下面積個問題對xlrd模塊進行學習一下: 1.什么是xlrd模塊? 2.為什么使用xlrd模塊? 3.怎樣使用xlrd模塊? 1.什么是xlrd模塊? ?python操作excel主要用到xlrd和xlwt這兩個庫,即xlrd是讀excel,xlwt是寫excel的庫。 今天就先來說一下xl ......

    uj5u.com 2020-09-10 05:36:28 more
  • 當我們創建HashMap時,底層到底做了什么?

    jdk1.7中的底層實作程序(底層基于陣列+鏈表) 在我們new HashMap()時,底層創建了默認長度為16的一維陣列Entry[ ] table。當我們呼叫map.put(key1,value1)方法向HashMap里添加資料的時候: 首先,呼叫key1所在類的hashCode()計算key1 ......

    uj5u.com 2020-09-10 05:36:38 more
最新发布
  • 【中介者設計模式詳解】C/Java/JS/Go/Python/TS不同語言實作

    * 中介者模式是一種行為型設計模式,它可以用來減少類之間的直接依賴關系,
    * 將物件之間的通信封裝到一個中介者物件中,從而使得各個物件之間的關系更加松散。
    * 在中介者模式中,物件之間不再直接相互互動,而是通過中介者來中轉訊息。 ......

    uj5u.com 2023-04-20 08:20:47 more
  • 露天煤礦現場調研和交流案例分享

    他們集團的資訊化公司及研究院在一個礦區正在做智能礦山的統一平臺的 試點,專案投資大概1億,包括了礦山的各方面的內容,顯示得我們這次交流有點多余。他們2年前開始做智能礦山的規劃,有很多煤礦行業專家的加持,他們的描述是非常完美,但是去年底應該上線的平臺,現在還沒有看到影子。他們確實有很多場景需求,但是被... ......

    uj5u.com 2023-04-20 08:20:25 more
  • 《社區人員管理》實戰案例設計&個人案例分享

    設計是一個讓人夢想成真程序,開始編碼、測驗、除錯之前進行需求分析和架構設計,才能保證關鍵方面都做正確 ......

    uj5u.com 2023-04-20 08:20:17 more
  • 軟體架構生態化-多角色交付的探索實踐

    作為一個技術架構師,不僅僅要緊跟行業技術趨勢,還要結合研發團隊現狀及痛點,探索新的交付方案。在日常中,你是否遇到如下問題 “ 業務需求排期長研發是瓶頸;非研發角色感受不到研發技改提效的變化;引入ISV 團隊又擔心質量和安全,培訓周期長“等等,基于此我們探索了一種新的技術體系及交付方案來解決如上問題。 ......

    uj5u.com 2023-04-20 08:20:10 more
  • 【中介者設計模式詳解】C/Java/JS/Go/Python/TS不同語言實作

    * 中介者模式是一種行為型設計模式,它可以用來減少類之間的直接依賴關系,
    * 將物件之間的通信封裝到一個中介者物件中,從而使得各個物件之間的關系更加松散。
    * 在中介者模式中,物件之間不再直接相互互動,而是通過中介者來中轉訊息。 ......

    uj5u.com 2023-04-20 08:19:44 more
  • 露天煤礦現場調研和交流案例分享

    他們集團的資訊化公司及研究院在一個礦區正在做智能礦山的統一平臺的 試點,專案投資大概1億,包括了礦山的各方面的內容,顯示得我們這次交流有點多余。他們2年前開始做智能礦山的規劃,有很多煤礦行業專家的加持,他們的描述是非常完美,但是去年底應該上線的平臺,現在還沒有看到影子。他們確實有很多場景需求,但是被... ......

    uj5u.com 2023-04-20 08:19:07 more
  • 《社區人員管理》實戰案例設計&個人案例分享

    設計是一個讓人夢想成真程序,開始編碼、測驗、除錯之前進行需求分析和架構設計,才能保證關鍵方面都做正確 ......

    uj5u.com 2023-04-20 08:18:57 more
  • 軟體架構生態化-多角色交付的探索實踐

    作為一個技術架構師,不僅僅要緊跟行業技術趨勢,還要結合研發團隊現狀及痛點,探索新的交付方案。在日常中,你是否遇到如下問題 “ 業務需求排期長研發是瓶頸;非研發角色感受不到研發技改提效的變化;引入ISV 團隊又擔心質量和安全,培訓周期長“等等,基于此我們探索了一種新的技術體系及交付方案來解決如上問題。 ......

    uj5u.com 2023-04-20 08:18:49 more
  • 05單件模式

    #經典的單件模式 public class Singleton { private static Singleton uniqueInstance; //一個靜態變數持有Singleton類的唯一實體。 // 其他有用的實體變數寫在這里 //構造器宣告為私有,只有Singleton可以實體化這個類! ......

    uj5u.com 2023-04-19 08:42:51 more
  • 【架構與設計】常見微服務分層架構的區別和落地實踐

    軟體工程的方方面面都遵循一個最基本的道理:沒有銀彈,架構分層模型更是如此,每一種都有各自優缺點,所以請根據不同的業務場景,并遵循簡單、可演進這兩個重要的架構原則選擇合適的架構分層模型即可。 ......

    uj5u.com 2023-04-19 08:42:41 more