主頁 > 企業開發 > vue 3.x 如何高效學成?本文詳解

vue 3.x 如何高效學成?本文詳解

2020-09-18 12:31:35 企業開發

前言

本文所分享的是關于 vue 3.x 在用法上的改變,而不是在代碼實作上的不同,

雖然 vue2 到 vue3 的實作大改,但在用法上變化基本不大,比較明顯的一個變化就是添加了 setup(){} 函式了,幾乎所有的配置變成了以函式的方式進行定義,即使是這樣,但小改動還是很多的,本文主要分享的是 vue 2.x 與 vue 3.x 之間一些常見用法的差異,雖然記錄的不多,但也不算少,本文資料來源:github.com/vuejs/rfcs/…

當然這里默認你已經熟練掌握了 vue 2.x 的使用,下面我們就來看看,

 

 

新增

composition-api

1.邏輯復用和代碼組織

這是 vue 3.0 的一個核心變更了,除了改了我們定義狀態的書寫方式外,也為我們提供體驗更棒的邏輯復用和代碼組織,新的方式可以讓你把同一個業務邏輯的代碼(狀態,計算屬性,方法等)都放到一塊,這聽起來可能有點不明不白,但如果你寫過比較復雜的組件,你就會發現,這個好,舊版本的 created、beforeCreated 鉤子函式已費棄,在 vue 3.0 中用 setup 代替,
另外注意:光理論是不夠的,在此贈送2020最新企業級 Vue3.0/Js/ES6/TS/React/node等實戰視頻教程,想學的可進裙 519293536 免費獲取,小白勿進哦!

2.更好的型別推斷

更好的支持 TypeScript,

可以看這篇文章:github.com/vuejs/rfcs/…

或者閱讀這篇(中文):vue-composition-api-rfc.netlify.app/zh/

完整的 API:vue-composition-api-rfc.netlify.app/zh/api.html

teleport 組件

teleport 組件它只是單純的把定義在其內部的內容轉移到目標元素中,在元素結構上不會產生多余的元素,當然也不會影響到組件樹,它相當于透明的存在,為什么要有這個組件?為了有更好的代碼組織體驗,比如:有時,組件模板的一部分在邏輯上屬于此組件,但從技術角度來看(如:樣式化需求),最好將模板的這一部分移動到 DOM 中的其他位置,

比如:一些 UI 組件庫的 模態窗、對話框、通知,下拉選單等需要通過 z-index 來控制層級關系,如果都只是在不同的組件或者元素層級中,那么 z-index 的層級順序就難以保證,可能你會說很多 UI 庫不是都已經是這樣的實作了的嗎?至于這個 UI 庫是如何實作的,我猜應該是直接操作 DOM,為什么還要提供這個 teleport 組件呢?可能是因為vue 本身的使命使然:盡量不讓開發者直接操作 DOM,這些事都統一由 VUE 來完成,開發者可以把更多的時間放在業務的開發上,

<teleport to="#modals">
  <div>A</div>
</teleport>
<teleport to="#modals">
  <div>B</div>
</teleport>

<!-- result-->
<div id="modals">
  <div>A</div>
  <div>B</div>
</div>
復制代碼

更多細節可看:github.com/vuejs/rfcs/…

Suspense

加載異步組件,在異步組件加載完成成并完全渲染之前 suspense 會先顯示 #fallback 插槽的內容 ,

<Suspense>
  <template>
    <Suspended-component />
  </template>
  <template #fallback>
    Loading...
  </template>
</Suspense>
復制代碼

#fallback 其實是插件 v-solt 的簡寫,而第一個 template 沒有給,則為默認插槽,

變更

插槽 slot 語法

github.com/vuejs/rfcs/…

適用版本:Version: 2.x,Version: 3.x

未來版本的 vue 中可以說合二為一了(slot 和 slot-scope)

<!-- vue 2.x -->
<foo>
  <bar slot="one" slot-scope="one">
    <div slot-scope="bar">
      {{ one }} {{ bar }}
    </div>
  </bar>

  <bar slot="two" slot-scope="two">
    <div slot-scope="bar">
      {{ two }} {{ bar }}
    </div>
  </bar>
</foo>

<!-- vue 3.x -->
<foo>
  <template v-slot:one="one">
    <bar v-slot="bar">
      <div>{{ one }} {{ bar }}</div>
    </bar>
  </template>

  <template v-slot:two="two">
    <bar v-slot="bar">
      <div>{{ two }} {{ bar }}</div>
    </bar>
  </template>
</foo>
復制代碼

我覺得這是好事,合二為一,不會讓人有一點點的困惑,

簡寫

<TestComponent>
  <template #one="{ name }">Hello {{ name }}</template>
</TestComponent>
復制代碼

指令動態引數

適用版本:Version: 2.x,Version: 3.x

<!-- v-bind with dynamic key -->
<div v-bind:[key]="value"></div>

<!-- v-bind shorthand with dynamic key -->
<div :[key]="value"></div>

<!-- v-on with dynamic event -->
<div v-on:[event]="handler"></div>

<!-- v-on shorthand with dynamic event -->
<div @[event]="handler"></div>

<!-- v-slot with dynamic name -->
<foo>
  <template v-slot:[name]>
    Hello
  </template>
</foo>

<!-- v-slot shorthand with dynamic name -->
<!-- pending #3 -->
<foo>
  <template #[name]>
    Default slot
  </template>
</foo>
復制代碼

簡單地說就是指令名,事件名,插槽名,都可以使用變數來定義了,

Tree-shaking

適用版本:Version: 3.x

在 vue 3 中不會把所有的 api 都打包進來,只會 打包你用到的 api

<!-- vue 2.x -->
import Vue from 'vue'

Vue.nextTick(() => {})

const obj = Vue.observable({})

<!-- vue 3.x -->
import Vue, { nextTick, observable } from 'vue'

Vue.nextTick // undefined

nextTick(() => {})

const obj = observable({})
復制代碼

即我們在專案中用什么什么,就只會打包什么,不會像 vue 2.x 那樣全部 api 都打包,

.sync 大變樣

適用版本: vue 3.x

<!-- vue 2.x -->
<MyComponent v-bind:title.sync="title" />

<!-- vue 3.x -->
<MyComponent v-model:title="title" />
復制代碼

也就是說,vue 3.0 又去掉了 .sync ,合并到了 v-model 里,而 v-model 的內部實作也有了小調整

元素

<input v-model="xxx">

<!-- would be shorthand for: -->

<input
  :model-value=https://www.cnblogs.com/chengxuyuanaa/p/"xxx"
  @update:model-value=https://www.cnblogs.com/chengxuyuanaa/p/"newValue =https://www.cnblogs.com/chengxuyuanaa/p/> { xxx = newValue }"
>

復制代碼

組件

<MyComponent v-model:aaa="xxx"/>

<!-- would be shorthand for: -->

<MyComponent
  :aaa="xxx"
  @update:aaa="newValue =https://www.cnblogs.com/chengxuyuanaa/p/> { xxx = newValue }"
/>
復制代碼

不過好像組 alpha 版本的還不支持 v-model:aaa="xxx"

函陣列件

適用版本: vue 3.x

<!-- vue 2.x -->
const FunctionalComp = {
  functional: true,
  render(h) {
    return h('div', `Hello! ${props.name}`)
  }
}
    
<!-- vue 3.x -->
import { h } from 'vue'
const FunctionalComp = (props, { slots, attrs, emit }) => {
  return h('div', `Hello! ${props.name}`)
}
復制代碼

不再需要 functional:true 選項,<template functional> 不再支付

異步組件也必需通過 api 方法創建

import { defineAsyncComponent } from 'vue'
const AsyncComp = defineAsyncComponent(() => import('./Foo.vue'))
復制代碼

全域 api

適用版本: vue 3.x

在 vue 2.x 中

import Vue from 'vue'
import App from './App.vue'

Vue.config.ignoredElements = [/^app-/]
Vue.use(/* ... */)
Vue.mixin(/* ... */)
Vue.component(/* ... */)
Vue.directive(/* ... */)

Vue.prototype.customProperty = () => {}

new Vue({
  render: h => h(App)
}).$mount('#app')
復制代碼

在 vue 3.x 中

import { createApp } from 'vue'
import App from './App.vue'

const app = createApp(App)

app.config.isCustomElement = tag => tag.startsWith('app-')
app.use(/* ... */)
app.mixin(/* ... */)
app.component(/* ... */)
app.directive(/* ... */)

app.config.globalProperties.customProperty = () => {}

app.mount(App, '#app')
復制代碼

可以看到,創建實體的方式也改變了,一些全域的 api 方法也不在全域上了,而是放到了實體上,

更多的改變可以看這里:github.com/vuejs/rfcs/…

v-model

適用版本:Version 3.x

1.原來的方式保留

<input v-model="foo">
復制代碼

2.可系結多個 v-model

<InviteeForm
  v-model:name="inviteeName"
  v-model:email="inviteeEmail"
/>
復制代碼

其實上面這種方式就相當于之前的 .sync ,

3.額外處理

<Comp
   v-model:foo.trim="text"
   v-model:bar.number="number" />
復制代碼

我們可以給這個屬性添加額外的處理

指令的鉤子函式

適用版本:Version 3.x

在 vue 3.x 中 指令的鉤子函式仿照了組件中的鉤子函式命名規則

vue 2.x 時

const MyDirective = {
  bind(el, binding, vnode, prevVnode) {},
  inserted() {},
  update() {},
  componentUpdated() {},
  unbind() {}
}
復制代碼

vue 3.0 中

const MyDirective = {
  beforeMount(el, binding, vnode, prevVnode) {},
  mounted() {},
  beforeUpdate() {},
  updated() {},
  beforeUnmount() {}, // new
  unmounted() {}
}
復制代碼

transition

適用版本:Version 3.x

當 <transition> 作為組件的根元素時,外部切換不會觸發過渡效果

vue 2.x

<!-- modal component -->
<template>
  <transition>
    <div class="modal"><slot/></div>
  </transition>
</template>

<!-- usage -->
<modal v-if="showModal">hello</modal>
復制代碼

vue 3.x

<!-- modal component -->
<template>
  <transition>
    <div v-if="show" class="modal"><slot/></div>
  </transition>
</template>

<!-- usage -->
<modal :show="showModal">hello</modal>
復制代碼

也就是說我們只能在 <transition> 內使用切換,

transition-class

重命名兩個過渡類

v-enter 重命名成v-enter-fromv-leave重命名成 v-enter-from

.v-enter-from, .v-leave-to {
  opacity: 0;
}
.v-leave-from, .v-enter-to {
  opacity: 1
}
復制代碼

Router

適合版本:Version: Vue (2.x / 3.x) Vue Router (3.x / 4.x)

router-link 變動

router-link 添加 scoped-slot API 和 custom 屬性,并移除了 tag 屬性和 event 屬性,

添加 scoped-slot 有什么用呢?以前只能通過 active-class 來改變元素樣式的,現在有了 scoped-slot 之后,我們就更加靈活了,可以根據 scoped-slot 回傳的狀態自定義,不管是樣式還是類,

<router-link to="/" custom v-slot="{ href, navigate, isActive }">
  <li :class="{ 'active': isActive }">
    <a :href=https://www.cnblogs.com/chengxuyuanaa/p/"href" @click="navigate">
      <Icon>home</Icon><span class="xs-hidden">Home</span>
    </a>
  </li>
</router-link>
復制代碼

也就是說,新版本的 Router 就更加的純粹,只提供給我們一些引數,讓我們自己利用這些引數來實作不同的場景,

meta 合并

{
  path: '/parent',
  meta: { requiresAuth: true, isChild: false },
  children: [
    { path: 'child', meta: { isChild: true }}
  ]
}

復制代碼

當訪問 /parent/child 時,子路由中的 meta 如下:

{ requiresAuth: true, isChild: true }
復制代碼

合并策略與 Object.assign 類似

路由匹配所有

const routes = [
  {
    path: '/',
    name: 'Home',
    component: () => import(/* webpackChunkName: "Home" */ '../views/Home.vue')
  },
  {
    path: '/about',
    name: 'About',
    component: () => import(/* webpackChunkName: "about" */ '../views/About.vue')
  },
  {
    path: '/:catchAll(.*)',
    name: 'All',
    component: () => import(/* webpackChunkName: "All" */ '../views/Home.vue')
  }
]
復制代碼

這里有一個需要注意的就是 vue-router 匹配所有路由的寫法已經改變了,不是舊版本的 * ,在新的版本里寫法參考上面的示例代碼

獲取當前路由資訊

import router from '../router'
export default {
  setup () {
    const currentRoute = router.currentRoute.value
    console.log(currentRoute)
  }
}
復制代碼

引入的 router 為我們通過 createRouter() 方法創建的物件

import { createRouter, createWebHashHistory } from 'vue-router'
const router = createRouter({
  history: createWebHashHistory(),
  routes
})
復制代碼

routes 路由為我們定義的路由陣列,跟舊版本的一樣,

樣式 scoped

適用版本:Version: 2.x, 3.x

舊版本寫法

/* 深度選擇器 */
/*方式一:*/
>>> .foo{ }
/*方式二:*/
/deep/ .foo{ }
/*方式三*/
::v-deep .foo{ }
復制代碼

新版本寫法

/* 深度選擇器 */
::v-deep(.foo) {}
復制代碼

除了上面的深度選擇器外,還有下面的兩個,寫法也差不多,

/* slot content 起作用 */
::v-slotted(.foo) {}

/* 全域 */
::v-global(.foo) {}
復制代碼

屬性值修正

適用版本:Version: 3.x

vue 本身會對元素的屬性作相應的處理,在舊版本的 vue 中處理如下:

運算式正常最終處理成
:attr="null" / draggable="false"
:attr="undefined" / /
:attr="true" foo="true" draggable="true"
:attr="false" / draggable="false"
:attr="0" foo="0" draggable="true"
attr="" foo="" draggable="true"
attr="foo" foo="foo" draggable="true"
attr foo="" draggable="true"

新版本處理方式:

運算式正常最終處理成
:attr="null" / /
:attr="undefined" / /
:attr="true" foo="true" draggable="true"
:attr="false" foo="false" draggable="false"
:attr="0" foo="0" draggable="0"
attr="" foo="" draggable=""
attr="foo" foo="foo" draggable="foo"
attr foo="" draggable=""

在新版本中基本保持了原樣,也就是我們給元素添加什么屬性值,最好 vue 處理完后還是什么屬性值,

異步組件

import { defineAsyncComponent } from "vue"

// simple usage
const AsyncFoo = defineAsyncComponent(() => import("./Foo.vue"))
復制代碼

寫法上與之前有些不一樣,

動態路由

適用版本 Router 4

添加了幾個方法

  1. router.addRoute(route: RouteRecord) 動態添加路由
  2. router.removeRoute(name: string | symbol),動態洗掉路由
  3. router.hasRoute(name: string | symbol): boolean ,判斷路由是否存在
  4. router.getRoutes(): RouteRecord[] 獲取路由串列
router.addRoute({
  path: '/new-route',
  name: 'NewRoute',
  component: NewRoute
})

// add to the children of an existing route
router.addRoute('ParentRoute', {
  path: 'new-route',
  name: 'NewRoute',
  component: NewRoute
})

router.removeRoute('NewRoute')

// normalized version of the records added
const routeRecords = router.getRoutes()
復制代碼

詳情可見:github.com/vuejs/rfcs/…

emits-option

const Foo = defineComponent({
  emits: {
    submit: (payload: { email: string; password: string }) => {
      // perform runtime validation
    }
  },

  methods: {
    onSubmit() {
      this.$emit('submit', {
        email: '[email protected]',
        password: 123 // Type error!
      })

      this.$emit('non-declared-event') // Type error!
    }
  }
})

復制代碼

現在的 $emit() 方法在用法上沒變,但需要額外多定義 emits 物件,但要注意的是現在 alpha 版本還不支持 TypeScript

組件根元素數量

vue 3 后組件不再限制 template 中根元素的個數(舊的版本之前是只能有一個根元素),

vue 3.x 中費棄

  • beforeCreate、created
  • filters
  • keycode
  • inline-template
  • data-object
  • on,off 和 $once

1.閱讀完本文我相信你大概對 vue 3 有了一個基本的認識,雖然本文會不讓你瞬間成為 vue 3.x 的駕馭者,但怎么說也讓你含蓄地體驗了一把 vue 3.x 的新特性,特別是 composition API 即使本文沒有詳細寫出來,但通過補充的鏈接,你也能閱讀到它的所有,我覺得 composition API 真的很棒,
2.光理論是不夠的,在此贈送2020最新企業級 Vue3.0/Js/ES6/TS/React/node等實戰視頻教程,想學的可進裙 519293536 免費獲取,小白勿進哦!

本文的文字及圖片來源于網路加上自己的想法,僅供學習、交流使用,不具有任何商業用途,著作權歸原作者所有,如有問題請及時聯系我們以作處理

轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/73788.html

標籤:JavaScript

上一篇:如何用webpack搭建vue專案?本文案例詳解

下一篇:JavaScript 仿 flash 輪播圖

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • IEEE1588PTP在數字化變電站時鐘同步方面的應用

    IEEE1588ptp在數字化變電站時鐘同步方面的應用 京準電子科技官微——ahjzsz 一、電力系統時間同步基本概況 隨著對IEC 61850標準研究的不斷深入,國內外學者提出基于IEC61850通信標準體系建設數字化變電站的發展思路。數字化變電站與常規變電站的顯著區別在于程序層傳統的電流/電壓互 ......

    uj5u.com 2020-09-10 03:51:52 more
  • HTTP request smuggling CL.TE

    CL.TE 簡介 前端通過Content-Length處理請求,通過反向代理或者負載均衡將請求轉發到后端,后端Transfer-Encoding優先級較高,以TE處理請求造成安全問題。 檢測 發送如下資料包 POST / HTTP/1.1 Host: ac391f7e1e9af821806e890 ......

    uj5u.com 2020-09-10 03:52:11 more
  • 網路滲透資料大全單——漏洞庫篇

    網路滲透資料大全單——漏洞庫篇漏洞庫 NVD ——美國國家漏洞庫 →http://nvd.nist.gov/。 CERT ——美國國家應急回應中心 →https://www.us-cert.gov/ OSVDB ——開源漏洞庫 →http://osvdb.org Bugtraq ——賽門鐵克 →ht ......

    uj5u.com 2020-09-10 03:52:15 more
  • 京準講述NTP時鐘服務器應用及原理

    京準講述NTP時鐘服務器應用及原理京準講述NTP時鐘服務器應用及原理 安徽京準電子科技官微——ahjzsz 北斗授時原理 授時是指接識訓通過某種方式獲得本地時間與北斗標準時間的鐘差,然后調整本地時鐘使時差控制在一定的精度范圍內。 衛星導航系統通常由三部分組成:導航授時衛星、地面檢測校正維護系統和用戶 ......

    uj5u.com 2020-09-10 03:52:25 more
  • 利用北斗衛星系統設計NTP網路時間服務器

    利用北斗衛星系統設計NTP網路時間服務器 利用北斗衛星系統設計NTP網路時間服務器 安徽京準電子科技官微——ahjzsz 概述 NTP網路時間服務器是一款支持NTP和SNTP網路時間同步協議,高精度、大容量、高品質的高科技時鐘產品。 NTP網路時間服務器設備采用冗余架構設計,高精度時鐘直接來源于北斗 ......

    uj5u.com 2020-09-10 03:52:35 more
  • 詳細解讀電力系統各種對時方式

    詳細解讀電力系統各種對時方式 詳細解讀電力系統各種對時方式 安徽京準電子科技官微——ahjzsz,更多資料請添加VX 衛星同步時鐘是我京準公司開發研制的應用衛星授時時技術的標準時間顯示和發送的裝置,該裝置以M國全球定位系統(GLOBAL POSITIONING SYSTEM,縮寫為GPS)或者我國北 ......

    uj5u.com 2020-09-10 03:52:45 more
  • 如何保證外包團隊接入企業內網安全

    不管企業規模的大小,只要企業想省錢,那么企業的某些服務就一定會采用外包的形式,然而看似美好又經濟的策略,其實也有不好的一面。下面我通過安全的角度來聊聊使用外包團的安全隱患問題。 先看看什么服務會使用外包的,最常見的就是話務/客服這種需要大量重復性、無技術性的服務,或者是一些銷售外包、特殊的職能外包等 ......

    uj5u.com 2020-09-10 03:52:57 more
  • PHP漏洞之【整型數字型SQL注入】

    0x01 什么是SQL注入 SQL是一種注入攻擊,通過前端帶入后端資料庫進行惡意的SQL陳述句查詢。 0x02 SQL整型注入原理 SQL注入一般發生在動態網站URL地址里,當然也會發生在其它地發,如登錄框等等也會存在注入,只要是和資料庫打交道的地方都有可能存在。 如這里http://192.168. ......

    uj5u.com 2020-09-10 03:55:40 more
  • [GXYCTF2019]禁止套娃

    git泄露獲取原始碼 使用GET傳參,引數為exp 經過三層過濾執行 第一層過濾偽協議,第二層過濾帶引數的函式,第三層過濾一些函式 preg_replace('/[a-z,_]+\((?R)?\)/', NULL, $_GET['exp'] (?R)參考當前正則運算式,相當于匹配函式里的引數 因此傳遞 ......

    uj5u.com 2020-09-10 03:56:07 more
  • 等保2.0實施流程

    流程 結論 ......

    uj5u.com 2020-09-10 03:56:16 more
最新发布
  • 使用Django Rest framework搭建Blog

    在前面的Blog例子中我們使用的是GraphQL, 雖然GraphQL的使用處于上升趨勢,但是Rest API還是使用的更廣泛一些. 所以還是決定回到傳統的rest api framework上來, Django rest framework的官網上給了一個很好用的QuickStart, 我參考Qu ......

    uj5u.com 2023-04-20 08:17:54 more
  • 記錄-new Date() 我忍你很久了!

    這里給大家分享我在網上總結出來的一些知識,希望對大家有所幫助 大家平時在開發的時候有沒被new Date()折磨過?就是它的諸多怪異的設定讓你每每用的時候,都可能不小心踩坑。造成程式意外出錯,卻一下子找不到問題出處,那叫一個煩透了…… 下面,我就列舉它的“四宗罪”及應用思考 可惡的四宗罪 1. Sa ......

    uj5u.com 2023-04-20 08:17:47 more
  • 使用Vue.js實作文字跑馬燈效果

    實作文字跑馬燈效果,首先用到 substring()截取 和 setInterval計時器 clearInterval()清除計時器 效果如下: 實作代碼如下: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta ......

    uj5u.com 2023-04-20 08:12:31 more
  • JavaScript 運算子

    JavaScript 運算子/運算子 在 JavaScript 中,有一些運算子可以使代碼更簡潔、易讀和高效。以下是一些常見的運算子: 1、可選鏈運算子(optional chaining operator) ?.是可選鏈運算子(optional chaining operator)。?. 可選鏈操 ......

    uj5u.com 2023-04-20 08:02:25 more
  • CSS—相對單位rem

    一、概述 rem是一個相對長度單位,它的單位長度取決于根標簽html的字體尺寸。rem即root em的意思,中文翻譯為根em。瀏覽器的文本尺寸一般默認為16px,即默認情況下: 1rem = 16px rem布局原理:根據CSS媒體查詢功能,更改根標簽的字體尺寸,實作rem單位隨螢屏尺寸的變化,如 ......

    uj5u.com 2023-04-20 08:02:21 more
  • 我的第一個NPM包:panghu-planebattle-esm(胖虎飛機大戰)使用說明

    好家伙,我的包終于開發完啦 歡迎使用胖虎的飛機大戰包!! 為你的主頁添加色彩 這是一個有趣的網頁小游戲包,使用canvas和js開發 使用ES6模塊化開發 效果圖如下: (覺得圖片太sb的可以自己改) 代碼已開源!! Git: https://gitee.com/tang-and-han-dynas ......

    uj5u.com 2023-04-20 08:01:50 more
  • 如何在 vue3 中使用 jsx/tsx?

    我們都知道,通常情況下我們使用 vue 大多都是用的 SFC(Signle File Component)單檔案組件模式,即一個組件就是一個檔案,但其實 Vue 也是支持使用 JSX 來撰寫組件的。這里不討論 SFC 和 JSX 的好壞,這個仁者見仁智者見智。本篇文章旨在帶領大家快速了解和使用 Vu ......

    uj5u.com 2023-04-20 08:01:37 more
  • 【Vue2.x原始碼系列06】計算屬性computed原理

    本章目標:計算屬性是如何實作的?計算屬性快取原理以及洋蔥模型的應用?在初始化Vue實體時,我們會給每個計算屬性都創建一個對應watcher,我們稱之為計算屬性watcher ......

    uj5u.com 2023-04-20 08:01:31 more
  • http1.1與http2.0

    一、http是什么 通俗來講,http就是計算機通過網路進行通信的規則,是一個基于請求與回應,無狀態的,應用層協議。常用于TCP/IP協議傳輸資料。目前任何終端之間任何一種通信方式都必須按Http協議進行,否則無法連接。tcp(三次握手,四次揮手)。 請求與回應:客戶端請求、服務端回應資料。 無狀態 ......

    uj5u.com 2023-04-20 08:01:10 more
  • http1.1與http2.0

    一、http是什么 通俗來講,http就是計算機通過網路進行通信的規則,是一個基于請求與回應,無狀態的,應用層協議。常用于TCP/IP協議傳輸資料。目前任何終端之間任何一種通信方式都必須按Http協議進行,否則無法連接。tcp(三次握手,四次揮手)。 請求與回應:客戶端請求、服務端回應資料。 無狀態 ......

    uj5u.com 2023-04-20 08:00:32 more