精品秘无码一区二区三区老师-精品秘一区二三区免费雷安-精品蜜桃秘一区二区三区-精品蜜桃秘一区二区三区粉嫩-精品蜜桃一区二区三区-精品蜜臀国产aⅴ一区二区三区

LOGO OA教程 ERP教程 模切知識(shí)交流 PMS教程 CRM教程 開(kāi)發(fā)文檔 其他文檔  
 
網(wǎng)站管理員

【W(wǎng)EB開(kāi)發(fā)】用上Vue3,和Vue2的區(qū)別在哪里?

admin
2024年12月17日 14:24 本文熱度 377

前言

Vue3已經(jīng)發(fā)布很長(zhǎng)一段時(shí)間了,雖然早就用上了框架,但是很多人依舊保持著Vue2的思維習(xí)慣,導(dǎo)致大家在實(shí)際開(kāi)發(fā)中并沒(méi)有感覺(jué)到提升,屬實(shí)是新瓶裝舊酒。我們應(yīng)該意識(shí)到這并不僅僅是一個(gè)數(shù)字大版本的迭代,而是一次全新的開(kāi)發(fā)體驗(yàn)。

讓我們一起看看在使用Vue3開(kāi)發(fā)時(shí),應(yīng)該在哪些地方做出改變?

正文

使用<script setup>

如果是從Vue2轉(zhuǎn)到Vue3,我們很熟悉的一種寫(xiě)法是選項(xiàng)式API寫(xiě)法。

?<template>  <div :class="$style.container">    <div class="title">{{ title }}</div>    <CompA />  </div></template><script>import CompA from './CompA.vue'export default {  components: { CompA },  setup (props, context) {    return {}  },  methods: {    doSomething () {      // do something    },  },}</script><style lang="scss" module></style>

通過(guò)export default導(dǎo)出一個(gè)對(duì)象,內(nèi)部的datamethods,watch都可以使用,this依然可以保留,并指向vue,setup中如果想用props、emit等,通過(guò)參數(shù)傳遞。在setup中可以直接使用新寫(xiě)法,組件通過(guò)components進(jìn)行引入??梢詷O大的還原Vue2的用法,如果團(tuán)隊(duì)的組件庫(kù)是使用Vue2寫(xiě)的,可以用很小的成本就改造完成。

為了更好的類(lèi)型推導(dǎo),vue還提供了defineComponent方法。

export default defineComponent({  components: { CompA },  setup (props, context) {     // do something  },})

但其實(shí)官方并不推薦這種寫(xiě)法,這種寫(xiě)法僅僅是為了兼容舊代碼,這也是你感覺(jué)Vue3沒(méi)有提升的很大一方面因素。就像是iPhone更新,當(dāng)外觀有變化時(shí)你才會(huì)覺(jué)得是大更新,系統(tǒng)升級(jí)個(gè)IOS18,你覺(jué)得卵用沒(méi)用。所以更好的方式應(yīng)該是<script setup>標(biāo)簽對(duì)的寫(xiě)法。

<script setup lang="ts">import { onMounted, ref } from 'vue'const title = ref<string>('')onMounted(() => {  title.value = 'Demo'})</script>
<template>  <div :class="$style.container">{{ title }}</div></template>
<style lang="scss" module></style>

你會(huì)發(fā)現(xiàn)有很多核心的變化,首先不再需要export導(dǎo)出了,標(biāo)簽對(duì)內(nèi)直接就是一個(gè)setup環(huán)境。ref可以直接寫(xiě),也沒(méi)有了methods,你寫(xiě)一個(gè)就是一個(gè)方法,直接就可以綁定。為什么呢?官方不是說(shuō)所有的值都需要return出去嗎?放心,@vue/compiler-sfc幫你解決了這些煩惱。

其次這種寫(xiě)法是去this化的,比如以往我們調(diào)用router都是this.$router這么使用,而現(xiàn)在你需要引入useRouter,可以更好的分辨來(lái)源。對(duì)ts也更友好。

import { useRouter } from 'vue-router'const router = useRouter()

組件使用也更方便,直接引入即可。

<script setup lang="ts">import CompA from './CompA.vue'</script><template>  <div :class="$style.container">    <CompA />  </div></template>

同名簡(jiǎn)寫(xiě)

以往我們綁定一個(gè)值需要這樣:

<template>  <div :id="id">    <Comp :title="title" />  </div></template><script>export default {  data () {    return {      id: 'container',      title: '標(biāo)題',    }  },}</script>

而現(xiàn)在變得極其簡(jiǎn)單,尤其是Vue升級(jí)到v3.4.x以上之后,因?yàn)樗黾恿送?jiǎn)寫(xiě)。

<script setup lang="ts">const id = ref('container')const title = ref('標(biāo)題')</script><template>  <div :id>    <CompA :title />  </div></template>

怎么樣,有沒(méi)有覺(jué)得非常優(yōu)雅,不過(guò)比較可惜的是這個(gè)寫(xiě)法esLint目前還不支持,會(huì)報(bào)異常,需要在.eslintrc中忽略一下。

"rules": {   "vue/valid-v-bind": "off"}

拒絕mixins

我們之前Vue2的模版中有很多的mixins,而且不乏有全局引入的mixins,在遷移模板時(shí),也需要一起處理,我看到官方也有案例,有mixins的,還有extends的。

const mixin = {   created() { console.log(1) } }createApp({   created() { console.log(2) },   mixins: [mixin] })

但是均都對(duì)組合式API不友好,因?yàn)?code style="-webkit-tap-highlight-color: transparent; margin: 0px 2px; padding: 2px 4px; outline: 0px; max-width: 100%; box-sizing: border-box !important; overflow-wrap: break-word !important; border-radius: 4px; background-color: rgba(27, 31, 35, 0.05); font-family: "Operator Mono", Consolas, Monaco, Menlo, monospace; word-break: break-all;">mixin內(nèi)部有不少調(diào)用this內(nèi)部環(huán)境的地方,很難在<script setup>中使用,而且mixins最大的問(wèn)題就是,你無(wú)法溯源,別人在某個(gè)犄角旮旯引入一個(gè)全局mixins,你根本找不到,而且也對(duì)類(lèi)型推導(dǎo)極其不友好。所以建議使用組合式函數(shù)代替。比如我們之前有一個(gè)NavBarmixins,里面處理了很多邏輯,就可以用組合式函數(shù)進(jìn)行封裝。

import { onMounted, ref } from 'vue'
const commonProps = {}const useNavbar = () => {  const navbarProps = ref<any>({})  const setNavbar = (newProps?: any) => {    navbarProps.value = {      ...navbarProps.value,      ...newProps || {},      ...commonProps,    }    if (navbarProps.value.title && typeof document !== 'undefined') {      document.title = navbarProps.value.title    }  }  onMounted(() => {    //  init  })  return {    navbarProps,    setNavbar,  }}export default useNavbar

在使用時(shí)引用進(jìn)來(lái)即可,而且只要你調(diào)用了useNavbar,內(nèi)部的onMounted也會(huì)執(zhí)行,非常方便。

import useNavbar from './useNavbar'const { navbarProps, setNavbar} = useNavbar()

減少全局變量

之前在Vue2時(shí),我們經(jīng)常會(huì)將一些常用屬性掛載在Vue.prototype原型上,方便內(nèi)部用this.xxx使用。比如我們會(huì)把Request掛載上去,Vue.prototype.$request = Request。我們發(fā)送請(qǐng)求時(shí)直接this.$request即可,很方便。其實(shí)很多Vue2的依賴(lài)庫(kù)都是這么寫(xiě)的,比如vue-router,就是在install中將$router寫(xiě)為了全局變量,在我們使用Vue.use(Router)后,方便我們使用。

vue-router源碼

而在Vue3中也有替代方案,app.config.globalProperties.$request = Request。但是在使用時(shí)就比較麻煩了,因?yàn)闆](méi)有this環(huán)境,需要從實(shí)例上取。

import { getCurrentInstance } from 'vue'const $this = getCurrentInstance()?.appContext.config.globalProperties$this?.$request.post('/url', {})

很深的API,既然這么深,我想我封裝一下吧。

// vueThis.tsimport { getCurrentInstance } from 'vue'export default getCurrentInstance()?.appContext.config.globalProperties
// 使用時(shí)import vueThis from './vueThis'vueThis.$request.post('/url',{})

但是你說(shuō)氣人不,getCurrentInstance還要識(shí)別調(diào)用的時(shí)機(jī),你直接賦值,相當(dāng)于引入時(shí)就運(yùn)行了,這個(gè)時(shí)候還沒(méi)實(shí)例,你還得閉包包一下,調(diào)用也不好看。

// vueThis.tsexport default () => {  return getCurrentInstance()?.appContext.config.globalProperties}
// 使用時(shí)import vueThis from './vueThis'const $this = vueThis()$this.$request.post('/url',{})

而且不光如此,你掛載全局變量,想要有類(lèi)型推導(dǎo),你還要在vue-runtime-core.d.ts把類(lèi)型告訴人家,才好用。特別不優(yōu)雅。

import request from '@host/request'declare module '@vue/runtime-core' {  interface ComponentCustomProperties {    $request: typeof request  }}

所以依舊建議使用組合式函數(shù)進(jìn)行封裝,清晰又明了。

// useRequest.tsexport default () => {  const get = async (uri: string, params: any = {}) => {    return await Request.get(uri, params)  }  const post = async (uri: string, params: any = {}) => {    return await Request.post(uri, params)  }  return {    get,    post,  }}
// 使用時(shí)import useRequest from './useRequest'const { post } = useRequest()post('/url',{})

一個(gè)use只辦一件事

Vue2始終是以頁(yè)面為單位進(jìn)行思考的,即一個(gè)vue只辦一件事,至于提供的mixin也好,props也好,emit也好,都是為了服務(wù)這個(gè)vue本身的,所有也是為什么簡(jiǎn)單頁(yè)面vue最好用。

但是伴隨著一個(gè)vue的功能越來(lái)越多,代碼也就越來(lái)越復(fù)雜,就變成了左圖Options API的樣子,再加上全局屬性的亂加,mixins的亂用,組件的亂引,整體也變得越來(lái)越冗余,最終變成了大家吐槽的對(duì)象。

Vue3推出的組合式函數(shù)的概念,借鑒了React Hooks的寫(xiě)法,將原本一個(gè)vue一件事抽象成一個(gè)vue幾件事,再用函數(shù)進(jìn)行打包。最終就是Composition API的樣子。所以我們開(kāi)發(fā)時(shí)就應(yīng)該順應(yīng)Vue3的思維:「一個(gè)use只辦一件事」。

舉幾個(gè)案例:


  • useRequest --> 這個(gè)use只管請(qǐng)求,配置也好,初始化也好,都在內(nèi)。
  • useNavbar -->  這個(gè)函數(shù)只管navBar
  • useDevice -->  這個(gè)函數(shù)只管設(shè)備相關(guān)的內(nèi)容
  • useLoad  -->    這個(gè)函數(shù)只管加載

拋棄index命名

Vue2常規(guī)的項(xiàng)目路徑是這樣的:

- pages    - home        - img        - components            - CompA.vue            - CompB.vue        - index.vue    - rule        - index.vue

已經(jīng)很整潔了,但是我建議改成這樣:

- pages    - home        - img        - components            - CompA.vue            - CompB.vue        - Home.vue    - rule        - Rule.vue

為什么呢?因?yàn)閂ue3有個(gè)特性,在<script setup>模式下,無(wú)法指定組件名稱(chēng),也就意味著路由名稱(chēng)也無(wú)法指定,所以文件名就是組件名,就是路由名稱(chēng),所以建議全部使用語(yǔ)義化文件名。

如果用index,他的路由名稱(chēng)就會(huì)是index,非常不友好。比如你在區(qū)分哪些需要使用KeepAlive時(shí),你就無(wú)法識(shí)別。

<router-view v-slot="{ Component }">  <!-- 如果使用的是index.vue,在這里無(wú)法通過(guò)include判斷 -->  <keep-alive :include="['Home']">    <component :is="Component" />  </keep-alive></router-view>

總結(jié)

這是我最近遷移模板總結(jié)的一些經(jīng)驗(yàn),怎么樣,有讓大家對(duì)Vue3有一些改觀嗎?


該文章在 2024/12/18 10:48:12 編輯過(guò)
關(guān)鍵字查詢(xún)
相關(guān)文章
正在查詢(xún)...
點(diǎn)晴ERP是一款針對(duì)中小制造業(yè)的專(zhuān)業(yè)生產(chǎn)管理軟件系統(tǒng),系統(tǒng)成熟度和易用性得到了國(guó)內(nèi)大量中小企業(yè)的青睞。
點(diǎn)晴PMS碼頭管理系統(tǒng)主要針對(duì)港口碼頭集裝箱與散貨日常運(yùn)作、調(diào)度、堆場(chǎng)、車(chē)隊(duì)、財(cái)務(wù)費(fèi)用、相關(guān)報(bào)表等業(yè)務(wù)管理,結(jié)合碼頭的業(yè)務(wù)特點(diǎn),圍繞調(diào)度、堆場(chǎng)作業(yè)而開(kāi)發(fā)的。集技術(shù)的先進(jìn)性、管理的有效性于一體,是物流碼頭及其他港口類(lèi)企業(yè)的高效ERP管理信息系統(tǒng)。
點(diǎn)晴WMS倉(cāng)儲(chǔ)管理系統(tǒng)提供了貨物產(chǎn)品管理,銷(xiāo)售管理,采購(gòu)管理,倉(cāng)儲(chǔ)管理,倉(cāng)庫(kù)管理,保質(zhì)期管理,貨位管理,庫(kù)位管理,生產(chǎn)管理,WMS管理系統(tǒng),標(biāo)簽打印,條形碼,二維碼管理,批號(hào)管理軟件。
點(diǎn)晴免費(fèi)OA是一款軟件和通用服務(wù)都免費(fèi),不限功能、不限時(shí)間、不限用戶的免費(fèi)OA協(xié)同辦公管理系統(tǒng)。
Copyright 2010-2025 ClickSun All Rights Reserved

主站蜘蛛池模板: 国产精品99久久99久久久动漫 | 伊人久久国产免费观看视频 | 日韩欧美国产成人片在线观看 | 亚洲91精品麻豆国产系列在线 | 国产成人永久免费av在线 | 国产成人精品日本亚洲专区61 | 婷婷综合另类色区 | 国产一级无码免费不卡 | 91精品欧美综合在线观看 | 字幕亚洲视频综合网 | 性欧美午夜 | 一区二区在线视频无码人妻在线二区 | 国产区视频在线观看 | 91午夜福利国产在线观看 | 亚洲一区二区中文字幕 | 亚洲国产日韩欧美一区二区中文字 | 丁香五月综合缴情电影 | 亚洲国产毛片aaaaa无费看 | 少妇特黄a片一区二区三区蜜桃 | 人妻少妇一区二区老女人 | 久久久精品午夜免费不卡 | 亚洲男人av香蕉爽爽爽爽 | 亚洲国产私拍在线视频 | 无码专区视频超清 | 国产传媒18精品A片熟女 | 亚洲人成无码网站在线观看 | 国产成人精品日本无码动漫 | 亚洲av无码成人精品 | 成人精品一区二区三区中文字幕 | 午夜肉体艺术 | 岛国视频在线无码 | 综合国产精品私拍国产在线 | 亚洲午夜无码视频在线播放 | 午夜久久免费视频 | 亚洲丰满爆乳熟女在线观看 | 午夜性色一区二区三区 | 亚洲va久久久噜噜噜久久男同 | 国产美女做爰免费视频 | 人妻少妇一区二区三区 | 亚洲欧美日韩成人高清在线一区 | 国产普通话对白视频二区 |