Vue文檔易錯點整理
這次帶給大家Vue文檔易錯點整理,Vue文檔易錯點使用的注意事項有哪些,下面就是實戰案例,一起來看一下。
節省程式碼量的mixin
mixin概念:元件層級可重複使用邏輯,包含資料變數/生命週期鉤子/公用方法,因此在混入的元件中可以直接使用,不用重複寫冗餘邏輯(類似繼承)
使用方法:
在某一公用資料夾pub下創建mixin資料夾,其下建立mixinTest.js
const mixinTest = { created() { console.log(`components ${this.name} created`) }, methods: { hello() { console.log('mixin method hello') } } } export default mixinTest
在元件中引用剛才的公用混入檔案並使用
import mixinTest from '../pub/mixin/mixinTest.js' export default { data() { return { name: 'hello' } }, mixins: [mixinTest], methods: { useMixin() { this.hello() } } }
ps: 若是使用Vue.mixin()這個方法,則會影響之後創建的所有Vue示例,慎用!
注意mixin的幾個特性:
混入的資料變數是淺合併,衝突時以元件內的資料優先(物件裡面的自定義變數)
混入的生命週期函數內的邏輯會與元件內定義的生命週期函數邏輯合併,並且先執行(created/mounted/destroy)
混入的值為物件的選項,會混合成一個對象,衝突後也是以元件內鍵名優先(data/method/components/directives)
#slot內容分發
slot概念引入:Vue跟React在寫法上的不同就在於元件與子元件內部元素的組織上,在元件裡面沒有children元素供我們存取和展現(暫不考慮render函數),取而代之的API是slot
#使用場景定義:
自訂的子元件裡面有巢狀的HTML或其他自訂的標籤元件
這個自訂的子元件是寫在父元件裡面,巢狀的東西也放在父元件裡面
透過在子元件的範本裡面使用
標籤,從而達到渲染寫在父元件裡的嵌套標籤的效果 #本質是把父元件放在子元件裡的內容,插到了子元件的位置,多個標籤也會一起被插入
<template> <p id="app"> <self-component> <!--self-component表示自定义的组件--> <span>12345</span> <!--父组件里的嵌套标签--> </self-component> </p> </template> <script> export default { components: [selfComponent] } </script> <!--self-component的组件模板--> <template> <p> <button><slot></slot></button> </p> </template> <script> export default { // 只有子组件的模板里面有slot标签,才能取到写在自定义组件里面的标签的渲染引用 } </script>
slot特性的進階兩點:
slot插入內容的編譯作用域:被分發的內容的作用域,根據其所在模板決定
具體內容寫的位置,決定了編譯的作用域(大部分情況都是在父組件作用域下)
2.1.0 新增作用域插槽,從而可以把子組件的屬性暴露給父元件中寫在子元件內的內容使用
子元件中的slot標籤可以直接寫自訂屬性,然後父元件寫在slot的標籤加上slot-scope屬性
<!-- 父组件模板 --> <child :items="items"> <!-- 作用域插槽也可以是具名的 --> <li slot="item" slot-scope="props" class="my-fancy-item">{{ props.text }}</li> </child> <!-- 子组件模板 --> <ul> <slot name="item" v-for="item in items" :text="item.text"> <!-- 这里写当父组件引用子组件但没写内部内容时展示的东东 --> </slot> </ul>
slot的name屬性來指定標籤插入的位置,也就是文件裡面的具名插槽(這個官方文件說的明白)
在子元件的範本裡面寫的slot有個name屬性(
) 在父元件中寫子元件裡面的插槽內容,指明slot屬性(
123
)- ##父元件的內容就會對應slot==name放到正確的位置
- 沒有指明slot屬性的就會預設放到匿名插槽的位置上
動態元件
動態元件這個特性,很多人寫的Vue專案也不少,但也沒用到這個,有必要多說幾句動態元件適用情況:- 單頁應用,部分元件的切換不涉及路由,只是頁面有一塊區域的元件要變更
- 變更的元件參數定義上是一致的,例如都是對話框,要傳一個物件進去,但物件裡面的資料結構不同
- 透過使用component的is屬性,避免在template中的冗餘元件程式碼,避免多個v-if模板程式碼更加整潔
使用的方法(借鉴文档):
<keep-alive> <component v-bind:is="currentView"> <!-- 组件在 vm.currentview (对应组件名称)变化时改变! --> <!-- 非活动组件将被缓存!可以保留它的状态或避免重新渲染 --> </component> </keep-alive>
注意点:
动态切换的组件都要引入到父组件中,渲染是动态的,但引入不是。
包裹动态组件时,会缓存不活动的组件实例,提高性能,避免重复渲染(keep-alive不会渲染额外DOM结构) 有include和exclude这两个属性,用于指定缓存和不缓存的组件(传入字符串/数组/正则) 另一种避免重新渲染的方法是为标签增加属性v-once,用于缓存大量的静态内容,避免重复渲染。
ps:
动画与过渡
其实很多前端工程师第一次用Vue的动画和过渡都是通过库组件来做到的,所以对这块没怎么深挖,各种过渡特效和按钮动画就跑起来了,现在就看下文档,补补课
前端实现动画的基本方法分为三种种:css3的过渡和keyframe/javascript操纵dom/使用webgl或者canvas来独立实现,其中第三种是作为展示动画,与交互结合较少,而Vue作为一个框架,其支持动画基是从前两种入手的,从官方文档提到的四种支持就可以看出这一点。不过官方文档是从DOM过渡和状态过渡两个方面来讲解,前者是DOM的消失和出现的动画等属性的变化,后者是页面上某些值的变化。
DOM属性的改变
若是单个元素/组件的显隐,在组件外面包裹一层
CSS过渡:
vue提供了六个样式后缀,本质是在dom过渡的过程中动态地添加和删除对应的className。(-[enter|leave]-?[active|to]?)
如果用css库来辅助开发,可以在transiton这个标签上定义自定义过渡类名,也是六个属性。([enter|leave]-?[active|to]?-class)
常见的一种效果是元素首次渲染的动画,如懒加载图片飞入,这个时候要在transiton标签上加上appear,另有三个属性可指定(appear-?[to|active]?-class)
<!-- 每种CSS动画库对应的class命名规则可能不同,所以根据不同库要自己写,以animate.css为例 --> <transition name="custom-classes-transition" enter-active-class="animated tada" leave-active-class="animated bounceOutRight" :duration="{ enter: 500, leave: 800 }" >...</transition> <!-- duration属性可以传一个对象,定制进入和移出的持续时间-->
JS过渡:
因为现在很多动画库需要工程师调用库提供的函数,把dom元素传入进行处理,这个时候需要这种方式
通过在transiton这个标签上添加监听事件,共8个([before|after]?-?[enter|leave]-?[cancelled]?)
监听事件的回调函数的第一个参数都是el,为过渡的dom元素,在enter和leave这两个还会传入done作为第二个参数
元素首次渲染的动画,可以指定的监听事件有4个([before|after]?-?appear和appear-cancelled)
<template> <transition v-bind:css="false" v-on:before-enter="beforeEnter" v-on:enter="enter" v-on:leave="leave" v-on:leave-cancelled="leaveCancelled"> <!-- 对于仅使用 JavaScript 过渡的元素添加 v-bind:css="false",Vue 会跳过 CSS 的检测 --> </transition> </template> <script> methods: { // 以Velocity库为例 beforeEnter: function (el) {/*...*/}, // 此回调函数是可选项的设置 enter: function (el, done) { // Velocity(el, { opacity: 1, fontSize: '1.4em' }, { duration: 300 }) done() //回调函数 done 是必须的。否则,它们会被同步调用。 }, leave: function (el, done) { // Velocity(el, { translateX: '15px', rotateZ: '50deg' }, { duration: 600 }) done() }, leaveCancelled: function (el) {/*...*/} } </script>
多元素过渡其实就是一句话:照常使用v-if/v-else的同时对同一种标签加上key来标识
Vue对于这种多元素动画有队列上的处理,这就是transiton这个标签上的mode属性,通过指定(in-out|out-in)模式,实现消失和出现动画的队列效果,让动画更加自然。
<transition name="fade" mode="out-in"> <!-- ... the buttons ... --> </transition>
多组件过渡也是一句话:用上一节提到的动态组件,即可完成。
针对列表过渡,其本质仍是多个元素的同时过渡,不过列表大部分是通过数组动态渲染的,因此有独特的地方,不过整体的动画思路不变。具体有以下几点
使用transitoin-group这个组件,其需要渲染为一个真实元素,可以通过tag这个属性来指定。
列表的每个元素需要提供key属性
使用CSS过渡的话,要考虑到列表内容变化过程中,存在相关元素的定位改变,如果要让定位是平滑过渡的动画,要另外一个v-move属性。 这个属性是通过设置一个css类的样式,来将创建元素在定位变化时的过渡,Vue内部是通过FLIP实现了一个动画队列,只要注意一点就是过渡元素不能设置为display:inline,这里需要文档上的代码做一个简短的demo:(其实通过在li上设置过渡transition属性也可以实现v-move的效果)
<template> <button v-on:click="shuffle">Shuffle</button> <transition-group name="flip-list" tag="ul"> <li v-for="item in items" v-bind:key="item">{{ item }}</li> </transition-group> </template> <script> import _ from 'lodash'; export default { data() { return { items: [1,2,3,4,5,6,7,8,9] } }, methods: { shuffle: function () { this.items = _.shuffle(this.items) } } } </script> <style lang="css"> .flip-list-move { transition: transform 1s; } </style>
数值和属性动态变化
这一部分的动画主要是针对数据元素本身的特效,比如数字的增减,颜色的过渡过程控制,svg动画的实现等,其本质都是数字/文本的变化。 我自己总结就是:通过利用Vue的响应式系统,把数字的变化通过外部库把DOM上对应数值的变化做出连续的效果,如1->100是个数字递增的连续过程,黑色->红色的过程。官方文档主要是用几个示例代码来说明,其本质步骤如下:
在页面上通过input的双向绑定修改某一变量a,还有一个处理dom上的过渡效果的变量b
这个数据被watcher绑定(watch对象中某个属性是这个变量a),触发逻辑
在watcher里面的逻辑就是通过外部过渡库,指定初始值b和最终值a,是把b的值最后改为a
DOM上绑定的变量就是b,如果某些复杂情况可能是基于b的计算属性,从而把b的变化过程展现出来
上面这个思路走一遍下来就完成了一个单元级别的动画效果,这种类似的流程其实是很常见的需求,所以有必要把这个过程封装成一个组件,只暴露要过渡的值作为入口,每次改变这个值都是一个动画过渡效果。组件封装需要在上面四个步骤的基础上添加mounted生命周期规定初始值即可,同时原来的两个值a/b在组件里面作为一个值,可以用watch对象中的newValue和oldValue作为区分。 至于最后的SVG,其本质也是数字的过渡,只不过里面涉及的状态变量更多,代码更长而已,不过纯前端页面这种需求倒还是不多的,不过作为爱好倒可以鼓捣一些好玩的小demo,不过肯定需要设计师的参与,要不那些参数可不好调出来呐。
相信看了本文案例你已经掌握了方法,更多精彩请关注php中文网其它相关文章!
推荐阅读:
以上是Vue文檔易錯點整理的詳細內容。更多資訊請關注PHP中文網其他相關文章!

熱AI工具

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

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

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

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

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

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

本文將介紹如何解決MicrosoftWord中出現的記憶體或磁碟空間不足以重新分頁或列印文件的問題。這種錯誤通常會在使用者嘗試列印Word文件時出現。如果您遇到類似的錯誤,請參考本文提供的建議來解決。記憶體或磁碟空間不足,無法重新分頁或列印此文件Word錯誤解決MicrosoftWord列印錯誤「沒有足夠記憶體或磁碟空間重新分頁或列印文件」的方法。更新MicrosoftOffice關閉佔用記憶體的應用程式更改您的預設印表機在安全模式下啟動Word重命名NorMal.dotm檔案將Word檔案儲存為另一

它是395個字,就是495個這篇文章將向您介紹如何在Word文件中加入紅線。在文件中新增紅線是指對文件進行修改,以便使用者可以清楚地查看所做的變更。這項功能在多人共同編輯一個文件時非常重要。 redline是什麼意思標示文件加紅線是指使用紅線或標註來指示文件的變更、編輯或修訂。這個術語的靈感來自於使用紅色筆在列印文件上做標記的做法。紅線批註被廣泛應用在不同場景下,如:在編輯文件時為作者、編輯和審閱人清楚地顯示建議的變更。在法律協議或合約中提出變更和修改對論文、演講等提出建設性的批評和建議。如何給W

近年來,隨著網路科技的不斷發展,我們的生活中離不開各種數位工具和網路。在處理文件時,特別是在寫作中,我們經常使用到word文件。然而,有時我們可能會遇到一個棘手的問題,那就是word文件中的超連結無法開啟。以下將就這個問題進行一番探討。首先,我們需要明確的是,超連結是指在word文件中新增的指向其他文件、網頁、目錄、書籤等的連結。當我們點擊這些連結時,我

學習Go語言文件中的os.Stdout.Write函數實現標準輸出在Go語言中,標準輸出是透過os.Stdout來實現的。 os.Stdout是一個*os.File類型的變量,它代表了標準輸出設備。為了將內容輸出到標準輸出,可以使用os.Stdout.Write函數。本文將介紹如何使用os.Stdout.Write函數實現標準輸出,並提供具體的程式碼範例。 os.

當您在Windows11/10電腦上開啟Word文件時遇到空白頁面的問題,可能需要進行修復以解決此狀況。造成這一問題的根源多種多樣,其中最普遍的原因之一是文件本身損壞。此外,Office檔案的損壞也可能導致類似的情況。因此,本文提供的修復方法可能對您有幫助。您可以嘗試使用一些工具來修復損壞的Word文檔,或嘗試將文檔轉換為其他格式再重新開啟。另外,檢查系統中的Office軟體是否需要更新也是解決此問題的方法。透過這些簡單的步驟,您可能能夠解決Word文件空白開啟的Word文件在Win

如何實現Workerman文件的基本使用方法簡介:Workerman是一個高效能的PHP開發框架,它可以幫助開發者輕鬆建立高並發的網路應用程式。本文將介紹Workerman的基本使用方法,包括安裝和設定、建立服務和監聽連接埠、處理客戶端請求等。並給出相應的程式碼範例。一、安裝並設定Workerman在命令列中輸入以下命令來安裝Workerman:c

Java文件解讀:StringBuilder類別的substring()方法詳細介紹引言:在Java程式設計中,字串的處理是非常常見的操作之一。而Java提供了一系列關於字串處理的類別和方法,其中StringBuilder類別是常用於頻繁字串操作的選擇。在StringBuilder類別中,substring()方法是一個非常有用的方法,用來截取字串的子字串。本文將

Word文件是我們日常工作和學習中使用頻率較高的應用程式之一。在處理文件時,有時會遇到需要將兩頁內容合併為一頁的情況。本文將詳細介紹在Word文件中如何將兩頁合併為一頁,幫助讀者更有效率地處理文件排版。在Word文件中,將兩頁合併為一頁的操作通常用於節省紙張和列印成本,或為了使文件更加緊湊和整潔。以下是合併兩頁為一頁的具體步驟:第一步:開啟需要操作的Word
