Vue最佳實踐和實用技巧
1.props限制和透傳
props: { size: { // 自定義驗證函式 validator: (val) => { return ["small", "medium", "large"].includes(val); }, }}複製程式碼
<!-- 此元件為二次封裝的中間元件 --><template> <MyComponent v-bind="$attrs"/></template><script> export default { // $attrs 中的所有屬性不自動繼承到元件的根元素上 inheritAttrs: false, }</script>複製程式碼
const attrs = useAttrs();const filteredAttrs = computed(() => { return { ...attrs, style: undefined };});複製程式碼
<MyComponent v-bind="$attrs" v->
<About> <template #about> <slot name="about" /> </template></About>複製程式碼
<template #[slotName] v-for="(slot, slotName) in $slots" > <slot :name="slotName"/></template>複製程式碼
<template #[slotName]="slotProps" v-for="(slot, slotName) in $slots" > <slot :name="slotName" v-bind="slotProps"/></template><!-- Vue2則需要將v-for裡面迴圈的$slots改成$scopedSlots -->複製程式碼
2.require.context()和import.meta.glob()批次引入檔案
const path = require("path");// 引數一:說明需要檢索的目錄,引數二:是否檢索子目錄,引數三::指定匹配檔名的正規表示式const files = require.context("./components", false, /\.vue$/);const modules = {};files.keys().forEach((key) => { const name = path.basename(key, ".vue"); modules[name] = files(key).default || files(key);});複製程式碼
const modules = import.meta.glob('./src/*.js');// vite 轉譯上面後生成的程式碼const modules = { './src/foo.js': () => import('./src/foo.js'), './src/bar.js': () => import('./src/bar.js')}複製程式碼
3.有條件的渲染slot
const $slots = { "default": [{...}], "slotA": [{...}], "slotB": [{...}]}複製程式碼
<template> <div> <div v-if="$slots.default"> <slot /> </div> <div v-if="$slots.slotA"> <slot name="slotA"/> </div> </div></template>複製程式碼
4.檢測點選是否發生在元素內部
window.addEventListener('mousedown', e => { // 獲取被點選的元素 const clickedEl = e.target; // `targetEl` 為檢測的元素 if (targetEl.contains(clickedEl)) { // 在"targetEl"內部點選 } else { // 在"targetEl"之外點選 }});複製程式碼
5.動態元件和遞迴元件
<transition> <keep-alive> <!-- :is值必須是全域性或者區域性註冊過的元件 --> <component :is="currentTab"></component> </keep-alive></transition>複製程式碼
<div v-if="item.children"> {{ tree.label }} <!-- 遞迴呼叫自身 --> <tree v-for="(item, index) in tree.children" :tree="item" :key="index"></tree></div><script> export default { // 定義name,以使元件內部遞迴呼叫 name: 'tree', // 接收外部傳入的值 props: { tree: { type:Array, default: () => [] } } }</script>複製程式碼
6.nextTick
mounted(){ this.$nextTick(() => { this.$refs.inputs.focus(); //透過 $refs 獲取dom 並繫結 focus 方法 })}複製程式碼
7.簡化 :class 和 v-if 與邏輯
<div :class=" $route.name === 'Home' || $route.name === 'Gallery' || $route.name === 'Profile' ? 'classOnlyOnThesePages' : '' " ></div>複製程式碼
<div :class="{ classOnlyOnThesePages: ['Home', 'Gallery', 'Profile'].includes( $route.name ), }" ></div>複製程式碼
8.全域性重用方法
class Utils { // 複製一段文字到剪下板 copyToClipboard(text) { let copyText = document.createElement("input"); document.body.appendChild(copyText); copyText.value = text; copyText.select(); document.execCommand("copy"); document.body.removeChild(copyText); }}export default new Utils();複製程式碼
import Utils from "./utils/utils.js";// 設定全域性方法Vue.prototype.$utils = Utils;複製程式碼
import Utils from "./utils/utils.js"; const app = createApp(App);// 設定全域性方法app.config.globalProperties.$utils = Utils; app.mount("#app");複製程式碼接下來任何地方都能愉快的訪問啦this.$utils.copyToClipboard(text);// Vue3 setupconst { proxy } = getCurrentInstance();proxy.$utils.copyToClipboard(text);複製程式碼
9.區域性元件重新整理
<template> <div id="app"> <router-view v-if="isActive" /> </div></template><script>export default { name: "App", // provider給下層元件重刷的方法 provide() { return { reload: this.reload, }; }, data: { isActive: true, }, method: { reload() { this.isActive = false; this.$nextTick(() => { this.isActive = true; }); }, },};</script>複製程式碼
<script>export default { inject: ["reload"], methods: { refresh() { this.reload(); }, },};</script>複製程式碼
<template> <div v-if="isShow"></div></template><script>export default { data() { return { isShow: true, }; }, method: { refresh() { this.isShow = false; this.$nextTick(() => { this.isShow = true; }); }, },};</script>複製程式碼
<template> <div :key="keyValue"></div></template><script>export default { data() { return { keyValue: 0, }; }, method: { refresh() { this.keyValue++; }, },};</script>複製程式碼
10.元件封裝原則
11.錯誤(警告)處理
// Vue 3const app = createApp(App);app.config.errorHandler = (err) => { console.error(err);};// Vue 2Vue.config.errorHandler = (err) => { console.error(err);};複製程式碼
12.使用template標籤分組
<template> <div class="card"> <h3> {{ title }} </h3> <h4 v-if="isShow" class="card-desc"> {{ description }} </h4> <div v-if="isShow"> <slot /> </div> <Home v-if="isShow" /> </div></template>複製程式碼
<template> <div class="card"> <h3> {{ title }} </h3> <template v-if="isShow"> <h4 class="card-desc"> {{ description }} </h4> <div> <slot /> </div> <Home /> </template> </div></template>複製程式碼
13.在 v-for 中解構
<div v-for="{ id, user } in [ { id: 1, user: 'yun' }, { id: 2, user: 'mu' }, ]" :key="id" > {{ user }}</div>複製程式碼
14.全域性和區域性style混合及樣式穿透
<style> /* 全域性有效 */ .content p { font-size: 12px; }</style> <style scoped> /* 只在該元件內有效 */ .content { background: green; }</style>複製程式碼
<style scoped>:deep(.ant-card-head-title){ background: green; }</style>複製程式碼
[data-v-e44d851a] .ant-card-head-title { background: green;}複製程式碼
<Card :type="Mytype" :color="Mycolor">複製程式碼
import Card from './Card.vue';export default { components: { Card }, props: { Mytype: { type: String, required: true, }, Mycolor: { type: String, default: "green", } },};複製程式碼
import Card from './Card.vue';const cardProps = {};Object.entries(Card.props).forEach(([key, value]) => { cardProps[`My${key}`] = value;});export default { components: { Card }, props: { ...cardProps },};
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/70021881/viewspace-2917235/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Laravel 5.7 最佳實踐和開發技巧分享Laravel
- 用 Python 優雅地玩轉 Elasticsearch:實用技巧與最佳實踐PythonElasticsearch
- vue 實踐技巧合集Vue
- 45個有用的JavaScript技巧,竅門和最佳實踐JavaScript
- Vue 工程化最佳實踐Vue
- Vue工程化最佳實踐Vue
- 深入Vue-router最佳實踐Vue
- vue專案實踐004~~~一籃子的實踐技巧Vue
- Selenium 自動化最佳實踐技巧 (中)
- ?vue元件釋出npm最佳實踐Vue元件NPM
- DevOps最佳實踐之應用開發和部署dev
- 測試用例最佳實踐
- Kubernetes YAML最佳實踐和策略YAML
- ABAP system landscape和vue專案webpack構建的最佳實踐VueWeb
- Vue 3 元件通訊與 ViewDesign 最佳實踐Vue元件View
- MVVM 最佳解讀和實踐MVVM
- Vue 在大型專案中的架構設計和最佳實踐Vue架構
- 軟體開發中的10個最佳實踐技巧!
- 深入理解單元測試:技巧與最佳實踐
- AutoMapper 最佳實踐APP
- 《.NET最佳實踐》
- Django 最佳實踐Django
- metaq最佳實踐
- springDataJpa 最佳實踐Spring
- KeyPath 最佳實踐
- Pika最佳實踐
- JavaScript 最佳實踐JavaScript
- SnapKit 最佳實踐APK
- JDBC 最佳實踐JDBC
- Kafka最佳實踐Kafka
- Iptables 最佳實踐 !
- Serilog 最佳實踐
- Flutter 最佳實踐Flutter
- Java最佳實踐Java
- MongoDB 最佳實踐MongoDB
- Gradle最佳實踐Gradle
- Vue3組合式函式最佳實踐(一)Vue函式
- Kubernetes 部署 Laravel 應用的最佳實踐Laravel