這篇文章跟大家分享 Vue3全家桶開發的比較常見問題,讓大家可避坑踩雷,希望能夠給大家幫忙!
最近入門Vue3 並完成3 個項目,遇到問題蠻多的,今天就花點時間整理一下,和大家分享15 個比較常見的問題,基本都貼出對應文檔地址,還請多看文檔~ 已經完成的3 個項目基本上都是使用Vue3 (setup-script 模式)全家桶開發,因此主要分幾個方面總結:
vue影片教學)
#文件地址:https://v3.cn.vuejs.org/guide/composition-api-lifecycle-hooks.htmlVue2.x 和Vue3.x 生命週期方法的變化蠻大的,先看看: 目前Vue3.x 依然支援Vue2.x 的生命週期,但不建議混搭使用,前期可以先使用2.x的生命週期,後面盡量使用3.x 的生命週期開發。 由於我使用都是
script-srtup模式,所以都是直接使用Vue3.x 的生命週期函數:
// A.vue\ <script setup>\ import { ref, onMounted } from "vue";\ let count = ref<number>(0);\ \ onMounted(() => {\ count.value = 1;\ })\ </script>
文件位址:這裡主要介紹父元件如何去取得子組件內部定義的變量,關於父子組件通信,可以看文檔介紹比較詳細:我們可以使用
全域編譯器宏的defineExpose宏,將子元件中需要揭露給父元件所取得的參數,透過
{key: vlaue}方式作為參數即可,父元件透過模版ref 方式取得子元件實例,就能取得對應值:
// 子组件\ <script setup>\ let name = ref("pingan8787")\ defineExpose({ name }); // 显式暴露的数据,父组件才可以获取\ </script>\ \ // 父组件\ <Chlid ref="child"></Chlid>\ <script setup>\ let child = ref(null)\ child.value.name //获取子组件中 name 的值为 pingan8787\ </script>
注意:
可以直接使用;
definedProps 文件:前面介紹script-setup 模式提供的4 個v3.cn.vuejs.org/api/sfc-scr … 文件:v3.cn.vuejs.org/api/sfc-scr…
全域編譯器巨集,還沒有詳細介紹,這一節介紹 defineProps和
withDefaults。使用
defineProps巨集可以用來定義元件的入參,使用如下:
<script setup>\ let props = defineProps<{\ schema: AttrsValueObject;\ modelValue: any;\ }>();\ </script>
props屬性中的
schema和
modelValue兩個屬性的類型,
defineProps 的這種宣告的缺點在於,它沒有提供設定props 預設值的方式。
<script setup>\ let props = withDefaults(\ defineProps<{\ schema: AttrsValueObject;\ modelValue: any;\ }>(),\ {\ schema: [],\ modelValue: ''\ }\ );\ </script>
withDefaults 輔助函數提供了對預設值的型別檢查,並確保傳回的props 的型別刪除了已宣告預設值的屬性的可選標誌。
」文件位址:
在 Vue2.x 中我们可以通过 Vue.prototype
添加全局属性 property。但是在 Vue3.x 中需要将 Vue.prototype
替换为 config.globalProperties
配置:
// Vue2.x\ Vue.prototype.$api = axios;\ Vue.prototype.$eventBus = eventBus;\ \ // Vue3.x\ const app = createApp({})\ app.config.globalProperties.$api = axios;\ app.config.globalProperties.$eventBus = eventBus;
使用时需要先通过 vue 提供的 getCurrentInstance
方法获取实例对象:
当我们在使用 v-model
指令的时候,实际上 v-bind
和 v-on
组合的简写,Vue2.x 和 Vue3.x 又存在差异。
Vue2.x
在子组件中,如果要对某一个属性进行双向数据绑定,只要通过 this.$emit('update:myPropName', newValue)
就能更新其 v-model
绑定的值。
script-setup
模式下就不能使用 this.$emit
去派发更新事件,毕竟没有 this
,这时候需要使用前面有介绍到的 defineProps、defineEmits 两个宏来实现:
父组件使用的时候就很简单:
Vue3.x 对于一些开发过程中的异常,做了更友好的提示警告,比如下面这个提示:
这样能够更清楚的告知异常的出处,可以看出大概是 <elinput>这边的问题,但还不够清楚。这时候就可以添加 Vue3.x 提供的<strong>全局异常处理器</strong>,更清晰的<strong>输出错误内容和调用栈信息,代码如下</strong>:</elinput>
这时候就能看到输出内容如下:
一下子就清楚很多。当然,该配置项也可以用来集成错误追踪服务 Sentry 和 Bugsnag。推荐阅读:Vue3 如何实现全局异常处理?
当我们在控制台输出 ref
声明的变量时。
会看到控制台输出了一个 RefImpl
对象:
看起来很不直观。我们都知道,要获取和修改 ref
声明的变量的值,需要通过 .value
来获取,所以你也可以:
这里还有另一种方式,就是在控制台的设置面板中开启 「Enable custom formatters」选项。
image.png
image.png
这时候你会发现,控制台输出的 ref
的格式发生变化了:
更加清晰直观了。
這個方法是我在《Vue.js 設計與實作》中發現的,但在文件也沒有找到相關介紹,如果有朋友發現了,歡迎告知~
使用webpack 的同學應該都知道,在webpack 中可以透過 require.context
動態匯入檔案:
#在Vite 中,我們可以使用這兩個方法來動態匯入檔案:
#import.meta.glob
此方法匹配到的檔案預設是懶載入,透過動態導入實現,建置時會分離獨立的chunk,是異步導入,回傳的是Promise,需要做非同步操作,使用方式如下:
import.meta.globEager
,返回結果直接透過如果僅使用非同步導入Vue3 元件,也可以直接使用Vue3 defineAsyncComponent API 來載入:for...in循環就可以操作,使用方式如下:
#2. Vite 設定alias 類型別名
文件位址:cn.vitejs.dev/config/#res…
當專案比較複雜的時候,常常需要設定alias 路徑別名來簡化一些程式碼:
#在Vite 中設定也很簡單,只需要在
vite.config.tstsconfig.json中加入
compilerOptions.paths的設定:
當我們需要使用scss 設定的主題變數(如 $primary
)、mixin方法(如 @mixin lines
)等時,如:
#我們可以將scss 主題設定文件,配置在
vite.config.ts 的
css.preprocessorOptions.scss.additionalData
如果要做路由跳轉,就可以用 useRouter
方法的回傳值去跳轉:
當我們解構出store 的變數後,再修改store 上變數的值,視圖沒有更新:
##這時候點選按鈕觸發changeName事件後,檢視上的
name 並沒有改變。這是因為 store 是 reactive 對象,當解構後,就會破壞它的反應性。所以我們不能直接進行解構。這種情況就可以使用Pinia 提供
storeToRefs工具方法,使用起來也很簡單,只需要將需要解構的物件透過
storeToRefs方法包裹,其他邏輯不變:
store.屬性名稱賦值修改單筆資料的狀態;
$patch方法修改多筆資料的狀態;
pinia .vuejs.org/api/interfa…當我們需要同時修改多筆資料的狀態時,如果還是按照上面方法,可能要這麼寫:
上面這麼寫也沒什麼問題,但是Pinia 官網已經說明,使用
$patch的效率會更高,效能更好,所以在修改多筆資料時,更建議使用 $patch
,使用方式也很簡單:
方法修改多筆資料的狀態;
##使用時:
這三種方式都能更新Pinia 中store 的資料狀態。
五、Element Plus
在官方issues 中查閱很久:github.com/element-plu…
嘗試在 vite.config.ts
中設定charset: false,結果也是無效:
最後在官方的issues 中找到處理方法:
2. 中文語言套件設定
我們可以透過引入中文語言包,並加入到ElementPlus 配置中來切換成中文:
這時候就能看到ElementPlus 裡面元件的文字變成中文了。
以上是我最近從入門到實戰Vue3 全家桶的3 個項目後總結避坑經驗,其實很多都是文檔中有介紹的,只是剛開始不熟悉。也希望大夥多看看文檔咯~
Vue3 script-setup 模式確實越寫越香。
本文內容如果有問題,歡迎大家一起留言討論。