Vue 3.0 setup 語法糖嘗試
阿新 • • 發佈:2021-06-29
Vue3.0 簡介
Vue3.0 正式版已經發布一段時間了,除了擁抱函數語言程式設計,還帶來了新的語法糖,用以替代原本需要大量 return 的寫法
基礎用法
想要使用 setup 模式只要在 script
標籤上面加個 setup
屬性就可以了。這個模式下不需要 return 和 export 就可以在模板中使用。
<template> <el-button @click="handleClick">按鈕</el-button> </template> <script lang="ts" setup> import { ElButton } from 'element-plus' function handleClick() { alert('點選了按鈕!') } </script>
使用 props、emit
<template> <input :value="msg" @change="changeValue" /> </template> <script lang="ts" setup> import { defineProps, defineEmits } from 'vue' const props = defineProps({ msg: { type: String, required: true } }) const emit = defineEmits(['update:msg']) function changeValue(e: InputEvent) { emit('update:msg', e.target.value) } </script>
使用生命週期鉤子
<script lang="ts" setup>
import { onMounted, onUnmounted } from 'vue'
onMounted(() => {
console.log('mounted')
})
onUnmounted(() => {
console.log('unmounted')
})
</script>
setup 語法糖的缺陷
-
這個語法糖暫時還不支援單檔案匯出內容,如果使用 export 匯出模組會導致編譯報錯。
-
不支援設定元件名,傳統的 options 寫法有個 name 屬性可以設定元件名,這個在編寫遞迴元件的時候很有用
-
不支援 jsx,不過如果需要使用 jsx 的話,個人還是建議直接使用傳統方式,setup 函式可以直接 return 一個 jsx 函式。而且 Vue 3.0 已經預設支援 css module 了,jsx 的體驗會比之前更好。
<script lang="tsx">
import { defineComponent, ref, useCssModule } from 'vue'
export default defineComponent({
setup() {
const msg = ref('Hello World')
const style = useCssModule()
return () => (
<div class={style.parent}>
<p class={style.text}>
{{ msg.value }}
</p>
</div>
)
}
})
</script>
<style module>
.parent {
background: #1890ff;
}
.text {
color: red;
}
</style>
寫在最後
這個特性其實還是實驗性質的,可能會有不少我暫時還沒遇到的奇怪 bug,所以不建議在生產環境使用。不過他確實可以精簡不少的程式碼,特別是哪種內容比較豐富的頁面,儘管可以拆成多個子元件和 hooks,但是在拆分的比較多的情況下,引入模組也不可避免地要寫一堆的模板程式碼,相信這樣的編碼方式以後會成為 Vue 的標準正規化。