目錄
前言
Vue
獨立建置和運行時建置
生命週期
計算(computed)屬性
陣列更新偵測
物件更新
事件處理器
表單控制項綁定
元件
异步更新队列
过渡效果
Render函数和JSX
自定义指令
混合
插件
vue-router
两种导航方式
重命名(redirect)和别名(alias)
两种路由模式
导航钩子
路由meta
过渡动效
数据获取
滚动行为(scrollBehavior)
路由懒加载
router-link
Router构造配置
对组件注入
vuex
state
getters
mutations
actions
Modules
严格模式
表单处理
测试
热重载
首頁 web前端 js教程 關於Vuejs技術堆疊的知識匯總

關於Vuejs技術堆疊的知識匯總

Jun 27, 2017 am 09:41 AM
javascript vuejs 科技 知識點

前言

上家公司的專案主要是使用jQuery和Angular1,然後自己學了React,沒想到來到這家公司突然開始做vue,不過vue還是挺容易上手的。以下是vue技術棧的一些總結,都是來自官網,主要是自己對vue技術棧知識點的一些整理,因此此文很水,建議閱讀我的上一篇文章Vuejs技術棧從CLI到打包上線實戰全解析

Vue

獨立建置和運行時建置

有兩種建置方式,獨立建置和運行建置。它們的區別在於前者包含模板編譯器而後者不包含。

模板編譯器的職責是將模板字串編譯為純JavaScript的渲染函數。如果你想要在元件中使用template選項,你就需要編譯器。

生命週期

具體查看官網的流程圖,要注意的是created和mounted區別,created是vm實例已建立但未掛載,因此一些DOM操作應該放在mounted中。非同步請求放在created或mounted暫時沒發現什麼區別,如您知道有什麼區別,請評論指出。

計算(computed)屬性

模板內的表達式不應該包含太多的邏輯,對於任何複雜邏輯,都應使用計算屬性

computed屬性和methods不同的是計算屬性是基於它們的依賴進行快取的。

computed屬性和computed屬性,通常更好的想法是使用computed屬性而不是命令式的watch回呼。雖然計算屬性在大多數情況下更合適,但有時也需要一個自訂的watcher。當你想要在資料變化回應時,執行非同步操作或開銷較大的操作,這是很有用的。

陣列更新偵測

陣列的變異方法(mutation method,會改變被這些方法呼叫的原始陣列)會觸發視圖更新,有以下七個:

push()
pop()
shift()
unshift()
splice()
sort()
reverse()
登入後複製

當使用非變異方法時,可以用新數組取代舊數組,或使用Vue.set方法。

物件更新

可以用新物件取代舊對象,或是使用Vue.set方法

Vue.set(vm.someObject, 'foo', 'bar')

this.someObject = Object.assign({}, this.someObject, { a:1, b:2 })
登入後複製

事件處理器

Vue.js為v- on提供了事件修飾符和按鍵修飾符

表單控制項綁定

可以用v-model指令在表單控制項元素上建立雙向資料綁定。常見修飾符有.lazy、.number、.trim。

也可以使用自訂事件的表單輸入元件。

元件

Vue元件的API來自三個部分:props,events和slots:

  • Props允許外部環境傳遞資料給元件

  • Events允許元件觸發外部環境的副作用

  • Slots允許外部環境將額外的內容組合在元件中。

1)元件的data屬性必須是函數

2)父子元件

在Vue.js中,父子元件的關係可以總結為props down, events up 。父元件透過props向下傳遞資料給子元件,子元件透過events給父元件發送訊息。

prop是單向綁定的:當父元件的屬性變化時,將傳導給子元件,但不會反過來。這是為了防止子元件無意修改了父元件的狀態——這會讓應用程式的資料流難以理解。

另外,每次父元件更新時,子元件的所有prop都會更新為最新值。這意味著你不應該在子元件內部改變prop。如果你這麼做了,Vue會在控制台給予警告。

為什麼我們會有修改prop中資料的衝動呢?通常是這兩種原因:

1.prop作為初始值傳入後,子元件想把它當作局部資料來用;

2.prop作為初始值傳入,由子組件處理成其它資料輸出。

對這兩個原因,正確的因應方式是:

1.定義一個局部變量,並用prop的值初始化它:

props: ['initialCounter'],
data: function () {
  return { counter: this.initialCounter }
}
登入後複製

2.定義一個計算屬性,處理prop的值並傳回。

props: ['size'],
computed: {
  normalizedSize: function () {
    return this.size.trim().toLowerCase()
  }
}
登入後複製

注意在JavaScript中物件和陣列是參考類型,指向同一個記憶體空間,如果prop是物件或陣列,在子元件內部改變它會影響父元件的狀態。

3)非父子元件

有時候兩個元件也需要通訊(非父子關係)。在簡單的場景下,可以使用空的Vue實例作為中央事件匯流排。在複雜的情況下,我們應該考慮使用專門的狀態管理模式。

4).sync修飾符

在某些情況下,我們可能會需要對一個prop進行『雙向綁定』。

2.0中移除了.sync,Vue2.3.0+又將其加回來了,但是這次它只是作為一個編譯時的語法糖存在,它會被擴展為一個自動更新父組件屬性的v-on偵聽器。如下程式碼

<comp :foo.sync="bar"></comp>
登入後複製

會被擴展為:

<comp :foo="bar" @update:foo="val => bar = val"></comp>
登入後複製

當子元件需要更新foo的值時,它需要明確地觸發一個更新事件:

this.$emit('update:foo', newValue)
登入後複製

5)使用slot進行內容分發

作用域插槽:接收從子元件傳遞的prop物件。作用域插槽更具代表性的用例是列表元件,允許元件自訂應該如何渲染列表每一項

6)動態元件、is特性和keep-alive指令

7 )子元件索引

尽管有props和events,但是有时仍然需要JavaScript中直接访问子组件。为此可以使用ref为子组件指定一个索引ID。

异步更新队列

虽然 Vue.js 通常鼓励开发人员沿着“数据驱动”的方式思考,避免直接接触 DOM,但是有时我们确实要这么做。为了在数据变化之后等待 Vue 完成更新 DOM ,可以在数据变化之后立即使用 Vue.nextTick(callback) 。这样回调函数在 DOM 更新完成后就会调用。

过渡效果

Vue在插入、更新或者移除DOM时,提供多种不同方式的应用过渡效果。包括以下工具:

  • 在CSS过渡和动画中自动应用class

  • 可以配合使用第三方CSS动画库,如Animate.css

  • 在过渡钩子函数中使用JavaScript直接操作DOM

  • 可以配合使用第三方JavaScript动画库,如Velocity.js

1)单元素/组件的过渡

Vue提供了transition的封装组件,在下列情形中,可以给任何元素和组件添加过渡

  • 条件渲染(使用v-if)

  • 条件展示(使用v-show)

  • 动态组件

  • 组件根节点

2)多个元素的过渡

对于原生标签可以使用 v-if/v-else

3)多个组件的过渡

多个组件的过渡我们可以使用动态组件。

4)列表过渡

Render函数和JSX

自定义指令

和Angular的指令类似,主要操作DOM,下面是一个滚动加载的指令,holder暂时没想到什么更好的处理方法:

let scrollCallback = function (callback) {
  let windowH = window.innerHeight
  let getDocumentHeight = function () {
    var body = document.body
    var html = document.documentElement
    return Math.max(
      body.offsetHeight,
      body.scrollHeight,
      html.clientHeight,
      html.offsetHeight,
      html.scrollHeight
    )
  }
  let scrollH = document.documentElement.scrollTop || document.body.scrollTop
  if (windowH + scrollH >= getDocumentHeight() - (this.holder || 20)) {
    callback()
  }
}

let callBackWarpped

export default {
  bind (el, binding, vnode) {
    let holder
    if (vnode.data && vnode.data.attrs && vnode.data.attrs['scroll-placeholder']) {
      holder = parseInt(vnode.data.attrs['scroll-placeholder'])
    } else {
      holder = 20
    }
    callBackWarpped = scrollCallback.bind({el, holder}, binding.value)
    window.addEventListener('scroll', callBackWarpped, false)
  },

  unbind: function () {
    window.removeEventListener('scroll', callBackWarpped, false)
  }
}
登入後複製

混合

混合是一种灵活的分布式复用Vue组件的方式。混合对象可以包含任意组件选项。以组件使用混合对象时,所有混合对象的选项将被混入该组件本身的选项。

插件

1)创建插件

Vue.js的插件应当有一个公开方法install。这个方法的第一个参数是Vue构造器 , 第二个参数是一个可选的选项对象。

2)使用插件

通过全局方法Vue.use()使用插件:

// 调用 `MyPlugin.install(Vue)`
Vue.use(MyPlugin)
登入後複製

也可以传入一个选项对象:

Vue.use(MyPlugin, { someOption: true })
登入後複製

vue-router

两种导航方式

1)router-link声明式导航

<router-link to="/foo">Go to Foo</router-link>
登入後複製

router-link对应的路由匹配成功,将自动设置class属性值.router-link-active。

2)编程式导航

// 字符串
router.push('home')

// 对象
router.push({ path: 'home' })

// 命名的路由
router.push({ name: 'user', params: { userId: 123 }})

// 带查询参数,变成 /register?plan=private
router.push({ path: 'register', query: { plan: 'private' }})
登入後複製

重命名(redirect)和别名(alias)

两种路由模式

vue-router默认hash模式,也可以设置为路由的history模式。

导航钩子

vue-router提供的导航钩子主要用来拦截导航,让它完成跳转或取消。有多种方式可以在路由导航发生时执行钩子:全局的, 单个路由独享的, 或者组件级的。

路由meta

一个路由匹配到的所有路由记录会暴露为$route对象(还有在导航钩子中的route对象)的$route.matched数组。因此,我们需要遍历$route.matched来检查路由记录中的meta字段。

过渡动效

router-view是基本的动态组件,所以我们可以用transition组件给它添加一些过渡效果。

数据获取

有时候,进入某个路由后,需要从服务器获取数据。例如,在渲染用户信息时,你需要从服务器获取用户的数据。我们可以通过两种方式来实现:

导航完成之后获取:先完成导航,然后在接下来的组件生命周期钩子中获取数据。在数据获取期间显示『加载中』之类的指示。

导航完成之前获取:导航完成前,在路由的enter钩子中获取数据,在数据获取成功后执行导航。

滚动行为(scrollBehavior)

注意: 这个功能只在HTML5 history模式下可用。

路由懒加载

当打包构建应用时,Javascript包会变得非常大,影响页面加载。如果我们能把不同路由对应的组件分割成不同的代码块,然后当路由被访问的时候才加载对应组件,这样就更加高效了。

结合Vue的异步组件和Webpack的code splitting功能,轻松实现路由组件的懒加载。

const Foo = resolve => require(['./Foo.vue'], resolve)

const router = new VueRouter({
  routes: [
    { path: '/foo', component: Foo }
  ]
})
登入後複製

可以设置tag、append、active-class、exact等属性

有时候我们要让 "激活时的CSS类名" 应用在外层元素,而不是a标签本身,那么可以用router-link渲染外层元素,包裹着内层的原生a标签:

<router-link tag="li" to="/foo">
  <a>/foo</a>
</router-link>
登入後複製

在这种情况下,a将作为真实的链接(它会获得正确的 href 的),而"激活时的CSS类名"则设置到外层的li。

Router构造配置

routes、mode、base、linkActiveClass、scrollBehavior

对组件注入

1)注入的属性

通过在Vue根实例的router配置传入router实例,下面两个属性成员会被注入到每个子组件。

$router:router实例

$route:当前激活的路由信息对象。这个属性是只读的,里面的属性是immutable(不可变)的,不过你可以watch(监测变化)它。

2)允许的额外配置:beforeRouteEnter、beforeRouteLeave

vuex

state

1)单一状态树

Vuex使用单一状态树--是的,用一个对象就包含了全部的应用层级状态。至此它便作为一个『唯一数据源(SSOT)』而存在。这也意味着,每个应用将仅仅包含一个store实例。单一状态树让我们能够直接地定位任一特定的状态片段,在调试的过程中也能轻易地取得整个当前应用状态的快照。

2)在Vue组件中获得Vuex状态

最好在根实例中注册store选项,该store实例会注入到根组件下的所有子组件中,且子组件能通过this.$store访问到。而不是在每个需要使用state的组件中需要频繁地导入。

3)mapState辅助函数

当一个组件需要获取多个状态时候,可以使用mapState辅助函数帮助我们生成计算属性,这样可以简化代码书写。mapState函数会返回一个对象,然后可以使用对象展开运算符将它与局部计算属性混合使用。

4)不要滥用vuex

使用Vuex并不意味着你需要将所有的状态放入Vuex。虽然将所有的状态放到Vuex会使状态变化更显式和易调试,但也会使代码变得冗长和不直观。如果有些状态严格属于单个组件,最好还是作为组件的局部状态。你应该根据你的应用开发需要进行权衡和确定。

getters

getters用来从store中的state中派生出一些状态,例如对列表进行过滤并计数:

computed: {
  doneTodosCount () {
    return this.$store.state.todos.filter(todo => todo.done).length
  }
}
登入後複製

getters可以认为是store的计算属性。和state类似,有mapGetters辅助函数。

mutations

更改Vuex的store中的状态的唯一方法是提交mutation。Vuex中的mutations非常类似于事件:每个mutation都有一个字符串的事件类型(type)和一个回调函数(handler)。这个回调函数就是我们实际进行状态更改的地方,并且它会接受state作为第一个参数

1)提交载荷(Payload)

你可以向store.commit传入额外的参数,即mutation的载荷(payload):

// ...
mutations: {
  increment (state, n) {
    state.count += n
  }
}
store.commit('increment', 10)
登入後複製

2)Mutations需遵守Vue的响应规则

3)使用常量替代Mutation事件类型

4)mutation必须是同步函数

5)在组件中提交Mutations

你可以在组件中使用this.$store.commit('xxx')提交mutation,或者使用mapMutations辅助函数将组件中的methods映射为store.commit调用(需要在根节点注入store)。

actions

actions类似于mutation,不同在于:

  • actions提交的是mutation,而不是直接变更状态。

  • actions可以包含任意异步操作。

1)在组件中分发Action

你在组件中使用this.$store.dispatch('xxx')分发action,或者使用mapActions辅助函数将组件的methods映射为store.dispatch调用(需要先在根节点注入store)

2)组合Actions

Action通常是异步的,那么如何知道action什么时候结束呢?更重要的是,我们如何才能组合多个action,以处理更加复杂的异步流程?

首先,你需要明白store.dispatch可以处理被触发的action的回调函数返回的Promise,并且store.dispatch仍旧返回Promise。

使用async/await会更加简单:

// 假设 getData() 和 getOtherData() 返回的是 Promise

actions: {
  async actionA ({ commit }) {
    commit('gotData', await getData())
  },
  async actionB ({ dispatch, commit }) {
    await dispatch('actionA') // 等待 actionA 完成
    commit('gotOtherData', await getOtherData())
  }
}
登入後複製

Modules

由于使用单一状态树,应用的所有状态会集中到一个比较大的对象。当应用变得非常复杂时,store对象就有可能变得相当臃肿。

为了解决以上问题,Vuex允许我们将store分割成模块(module)。每个模块拥有自己的state、mutation、action、getter、甚至是嵌套子模块——从上至下进行同样方式的分割:

const moduleA = {
  state: { ... },
  mutations: { ... },
  actions: { ... },
  getters: { ... }
}

const moduleB = {
  state: { ... },
  mutations: { ... },
  actions: { ... }
}

const store = new Vuex.Store({
  modules: {
    a: moduleA,
    b: moduleB
  }
})

store.state.a // -> moduleA 的状态
store.state.b // -> moduleB 的状态
登入後複製

插件

Vuex的store接受plugins选项,这个选项暴露出每次mutation的钩子。Vuex插件就是一个函数,它接收store作为唯一参数。

严格模式

开启严格模式,仅需在创建store的时候传入strict:true

在严格模式下,无论何时发生了状态变更且不是由mutation函数引起的,将会抛出错误。这能保证所有的状态变更都能被调试工具跟踪到。

不要在发布环境下启用严格模式!严格模式会深度监测状态树来检测不合规的状态变更--请确保在发布环境下关闭严格模式,以避免性能损失。

表单处理

测试

热重载

以上是關於Vuejs技術堆疊的知識匯總的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

Stable Diffusion 3論文終於發布,架構細節大揭秘,對復現Sora有幫助? Stable Diffusion 3論文終於發布,架構細節大揭秘,對復現Sora有幫助? Mar 06, 2024 pm 05:34 PM

StableDiffusion3的论文终于来了!这个模型于两周前发布,采用了与Sora相同的DiT(DiffusionTransformer)架构,一经发布就引起了不小的轰动。与之前版本相比,StableDiffusion3生成的图质量有了显著提升,现在支持多主题提示,并且文字书写效果也得到了改善,不再出现乱码情况。StabilityAI指出,StableDiffusion3是一个系列模型,其参数量从800M到8B不等。这一参数范围意味着该模型可以在许多便携设备上直接运行,从而显著降低了使用AI

自動駕駛與軌跡預測看這篇就夠了! 自動駕駛與軌跡預測看這篇就夠了! Feb 28, 2024 pm 07:20 PM

軌跡預測在自動駕駛中承擔著重要的角色,自動駕駛軌跡預測是指透過分析車輛行駛過程中的各種數據,預測車輛未來的行駛軌跡。作為自動駕駛的核心模組,軌跡預測的品質對於下游的規劃控制至關重要。軌跡預測任務技術堆疊豐富,需熟悉自動駕駛動/靜態感知、高精地圖、車道線、神經網路架構(CNN&GNN&Transformer)技能等,入門難度很高!許多粉絲期望能夠盡快上手軌跡預測,少踩坑,今天就為大家盤點下軌跡預測常見的一些問題和入門學習方法!入門相關知識1.預習的論文有沒有切入順序? A:先看survey,p

DualBEV:大幅超越BEVFormer、BEVDet4D,開卷! DualBEV:大幅超越BEVFormer、BEVDet4D,開卷! Mar 21, 2024 pm 05:21 PM

這篇論文探討了在自動駕駛中,從不同視角(如透視圖和鳥瞰圖)準確檢測物體的問題,特別是如何有效地從透視圖(PV)到鳥瞰圖(BEV)空間轉換特徵,這一轉換是透過視覺轉換(VT)模組實施的。現有的方法大致分為兩種策略:2D到3D和3D到2D轉換。 2D到3D的方法透過預測深度機率來提升密集的2D特徵,但深度預測的固有不確定性,尤其是在遠處區域,可能會引入不準確性。而3D到2D的方法通常使用3D查詢來採樣2D特徵,並透過Transformer學習3D和2D特徵之間對應關係的注意力權重,這增加了計算和部署的

簡易JavaScript教學:取得HTTP狀態碼的方法 簡易JavaScript教學:取得HTTP狀態碼的方法 Jan 05, 2024 pm 06:08 PM

JavaScript教學:如何取得HTTP狀態碼,需要具體程式碼範例前言:在Web開發中,經常會涉及到與伺服器進行資料互動的場景。在與伺服器進行通訊時,我們經常需要取得傳回的HTTP狀態碼來判斷操作是否成功,並根據不同的狀態碼來進行對應的處理。本篇文章將教你如何使用JavaScript來取得HTTP狀態碼,並提供一些實用的程式碼範例。使用XMLHttpRequest

綜述!深度模型融合(LLM/基礎模型/聯邦學習/微調等) 綜述!深度模型融合(LLM/基礎模型/聯邦學習/微調等) Apr 18, 2024 pm 09:43 PM

23年9月國防科大、京東和北理工的論文「DeepModelFusion:ASurvey」。深度模型整合/合併是一種新興技術,它將多個深度學習模型的參數或預測合併為一個模型。它結合了不同模型的能力來彌補單一模型的偏差和錯誤,以獲得更好的性能。而大規模深度學習模型(例如LLM和基礎模型)上的深度模型整合面臨一些挑戰,包括高運算成本、高維度參數空間、不同異質模型之間的干擾等。本文將現有的深度模型融合方法分為四類:(1)“模式連接”,透過一條損失減少的路徑將權重空間中的解連接起來,以獲得更好的模型融合初

《我的世界》化身AI小鎮,NPC居民角色扮演如同真人 《我的世界》化身AI小鎮,NPC居民角色扮演如同真人 Jan 02, 2024 pm 06:25 PM

請留意,這個方塊人正在緊鎖眉頭,思考著面前幾位「不速之客」的身份。原來她陷入了危險境地,意識到這一點後,她迅速展開腦力搜索,尋找解決問題的策略。最終,她決定先逃離現場,然後儘快尋求幫助,並立即採取行動。同時,對面的人也在進行著與她相同的思考……在《我的世界》中出現了這樣一個場景,所有的角色都由人工智慧控制。他們每個人都有著獨特的身份設定,例如之前提到的女孩就是一個年僅17歲但聰明又勇敢的快遞員。他們擁有記憶和思考能力,在這個以《我的世界》為背景的小鎮中像人類一樣生活。驅動他們的,是一款全新的、

不只3D高斯!最新綜述一覽最先進的3D重建技術 不只3D高斯!最新綜述一覽最先進的3D重建技術 Jun 02, 2024 pm 06:57 PM

寫在前面&筆者的個人理解基於圖像的3D重建是一項具有挑戰性的任務,涉及從一組輸入圖像推斷目標或場景的3D形狀。基於學習的方法因其直接估計3D形狀的能力而受到關注。這篇綜述論文的重點是最先進的3D重建技術,包括產生新穎的、看不見的視野。概述了高斯飛濺方法的最新發展,包括輸入類型、模型結構、輸出表示和訓練策略。也討論了尚未解決的挑戰和未來的方向。鑑於該領域的快速進展以及增強3D重建方法的眾多機會,對演算法進行全面檢查似乎至關重要。因此,本研究對高斯散射的最新進展進行了全面的概述。 (大拇指往上滑

揭秘HTML快取機制:不可或缺的知識要點 揭秘HTML快取機制:不可或缺的知識要點 Jan 23, 2024 am 08:51 AM

HTML快取機制大揭密:必備的知識點,需要具體程式碼範例在Web開發中,效能一直是重要的考量。而HTML快取機制是提升Web頁面效能的關鍵之一。本文將揭秘HTML快取機制的原理與實務技巧,並提供具體的程式碼範例。一、HTML快取機制的原理Web頁面存取過程中,瀏覽器透過HTTP協定請求伺服器取得HTML頁面。 HTML快取機制就是將HTML頁面快取在瀏覽器

See all articles