vue3中defineComponent?的作用詳解
vue3中,新增了 defineComponent ,它并沒有實現(xiàn)任何的邏輯,只是把接收的 Object 直接返回,它的存在是完全讓傳入的整個對象獲得對應(yīng)的類型,它的存在就是完全為了服務(wù) TypeScript 而存在的。
我都知道普通的組件就是一個普通的對象,既然是一個普通的對象,那自然就不會獲得自動的提示,
import { defineComponent } from 'vue' const component = { name: 'Home', props:{ data: String, }, setup // 沒有該有的提示,這非常的不友好 } export default component
但是當(dāng)我們加上 defineComponent() 之后,就完全不一樣了,可以獲得自動提示,vue2、vue3的自動提示都有
import { defineComponent } from 'vue' const component = { name: 'Home', props:{ data: String, }, setup(){ // setup 可接受兩個參數(shù),一個props,和 context } } export default component
接下來看看 setup 中的兩個參數(shù) props 與 context ,
props指組件傳遞來的參數(shù),并且ts可以推論出props的類型.props也就是 vue2 中組件中的 props
context 有三個屬性 attrs slots emit 分別對應(yīng)vue2中的attrs屬性、slots插槽、$emit發(fā)送事件
import { defineComponent } from 'vue' const component = { name: 'Home', props:{ data: String, }, setup(props, context){ // props.data // context.attrs context.slots context.emit } } export default component
擴(kuò)展知識:
vue3之組件結(jié)構(gòu)(defineComponent,setup函數(shù))
在vue3中,對組件整體結(jié)構(gòu)做一些調(diào)整,先看一個組件案例:
import {ref, reactive, defineComponent, Ref, onMounted} from "vue"; import {settingsStore} from "/@/store/module/settings"; import {IRoleList} from "/@/interface/role/list.interface"; import {IHttpResult} from "/@/interface/common.interface"; import { ILogListParams } from "/@/interface/settings/log.interface"; export default defineComponent({ name: "LogList", setup() { const logList: Ref<IRoleList[]> = ref([]); const columns = [ ... ]; const pagination = ref({ "show-quick-jumper": true, total: 100, current: 1, "show-size-changer": true, "show-total": (total: number, range: number[]) => `${range[0]}-${range[1]} 共 ${total} 條`, "pageSize": 10 }); const columnsList = ref(columns); const params: ILogListParams = reactive({ page: 1, pageSize: 10 }); onMounted(() => { findLogList(); }); /*查詢?nèi)罩玖斜?/ const findLogList = () => { settingsStore.findLogList(params).then((res: IHttpResult) => { const data = res.data; pagination.value.total = data.total; logList.value = data.list; }); }; /*修改狀態(tài)*/ const onChange = (pagination: {current: number, pageSize: number}) => { params.page = pagination.current; params.pageSize = pagination.pageSize; }; /*刪除*/ const onDelete = (id: number) => { alert(id); }; return { columnsList, logList, onDelete, onChange, pagination }; } });
從上面組件代碼中,可以看出在vue3中沒有this對象, 所有的邏輯代碼都寫在setup方法里面.
若是要在HTML模板頁面中使用變量或者方法, 需要在setup方法return出去.
setup是Vue3 的一大特性函數(shù), 它有幾個特性:
1、setup函數(shù)是處于 生命周期函數(shù) beforeCreate 和 Created 兩個鉤子函數(shù)之間的函數(shù)
2、setup函數(shù)是 Composition API(組合API)的入口
3、在setup函數(shù)中定義的變量和方法最后都是需要 return 出去的 不然無法再模板中使用
setup函數(shù)的注意點(diǎn):
vue3雖然支持vue2.x版本的寫法,但也有一些要注意的地方
1、由于在執(zhí)行 setup函數(shù)的時候,還沒有執(zhí)行 Created 生命周期方法,所以在 setup 函數(shù)中,無法使用 data 和 methods 的變量和方法
2、由于我們不能在 setup函數(shù)中使用 data 和 methods,所以 Vue 為了避免我們錯誤的使用,直接將 setup函數(shù)中的this修改成了 undefined
3、setup函數(shù)只能是同步的不能是異步的
- 上面的組件中用defineComponent包裹了組件;
- defineComponent函數(shù),只是對setup函數(shù)進(jìn)行封裝,返回options的對象;
- defineComponent最重要的是:在TypeScript下,給予了組件 正確的參數(shù)類型推斷 。
- defineComponent可以給組件的setup方法準(zhǔn)確的參數(shù)類型定義.
- defineComponent 可以接受顯式的自定義 props 接口或從屬性驗證對象中自動推斷
- defineComponent 可以正確適配無 props、數(shù)組 props 等形式
- 引入 defineComponent() 以正確推斷 setup() 組件的參數(shù)類型
到此這篇關(guān)于vue3中defineComponent 的作用的文章就介紹到這了,更多相關(guān)vue3 defineComponent 內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Vue為什么要謹(jǐn)慎使用$attrs與$listeners
這篇文章主要介紹了Vue為什么要謹(jǐn)慎使用$attrs與$listeners,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-08-08使用electron-builder將項目打包成桌面程序的詳細(xì)教程
這篇文章主要介紹了使用electron-builder把web端的項目打包生成桌面程序,并可安裝程序,文中通過代碼示例和圖文結(jié)合的方式給大家介紹的非常詳細(xì),具有一定的參考價值,需要的朋友可以參考下2024-08-08vue3.0?移動端二次封裝van-uploader實現(xiàn)上傳圖片(vant組件庫)
這篇文章主要介紹了vue3.0?移動端二次封裝van-uploader上傳圖片組件,此功能最多上傳6張圖片,并可以實現(xiàn)本地預(yù)覽,實現(xiàn)代碼簡單易懂,需要的朋友可以參考下2022-05-05vue項目 npm run build 打包項目防止瀏覽器緩存的操作方法
這篇文章主要介紹了vue項目 npm run build 打包項目防止瀏覽器緩存的操作方法,本文給大家推薦兩種方法,每種方法通過實例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下2022-08-08vue和better-scroll實現(xiàn)列表左右聯(lián)動效果詳解
這篇文章主要介紹了vue和better-scroll實現(xiàn)列表左右聯(lián)動效果,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-04-04