搜尋
首頁web前端js教程vue+mixin節省代碼量

這次帶給大家vue mixin節省程式碼量,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的幾個特性:

  1. 混入的資料變數是淺合併,衝突時以元件內的資料優先(物件裡面的自訂變數)

  2. 混入的生命週期函數內的邏輯會與元件內定義的生命週期函數邏輯合併,並且先執行(created/mounted/destroy)

  3. 混入的值為物件的選項,會混合成一個對象,衝突後也是以元件內鍵名優先(data/method/components/directives)

  1. slot內容分發

  2. slot概念引入:Vue跟React在寫法上的不同就在於元件與子元件內部元素的組織上,在元件裡面沒有children元素供我們存取和展現(暫不考慮render函數),取而代之的API是slot

  3. 使用場景定義:

自訂的子元件裡面有巢狀的HTML或其他自訂的標籤元件

  1. 這個自訂的子元件是寫在父元件裡面,巢狀的東西也放在父元件裡面

  2. 透過在子組件的模板裡面使用標籤,從而達到渲染寫在父組件裡的嵌套標籤的效果

  3. ##本質是把父元件放在子元件裡的內容,插到了子元件的位置,多個標籤也會一起被插入

  4. <template>
      <p> 
        <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插入內容的編譯作用域:被分發的內容的作用域,根據其所在模板決定
  1. 具體內容寫的位置,決定了編譯的作用域(大部分情況都是在父元件作用域下)
  2. 2.1.0 新增作用域插槽,因此可以把子元件的屬性暴露給父元件中寫在子元件內的內容使用
  3. 子元件中的slot標籤可以直接寫自訂屬性,然後父元件寫在slot的標籤加上slot-scope屬性
  4. <!-- 父组件模板 -->
    <child>
     <!-- 作用域插槽也可以是具名的 -->
     <li>{{ props.text }}</li>
    </child>
    <!-- 子组件模板 -->
    
            
    slot的name屬性來指定標籤插入的位置,也就是文檔裡面的具名插槽(這個官方文檔說的明白)

在子元件的範本裡面寫的slot有個name屬性()

在父元件中寫子元件裡面的插槽內容,指明slot屬性(

123

)

  1. 父元件的內容就會對應slot==name放到正確的位置

  2. 沒有指明slot屬性的就會預設放到匿名插槽的位置上

  3. #動態元件

#動態元件這個特性,很多人寫的Vue專案也不少,但也沒用到過這個,有必要多說幾句

動態元件適用情況:

  1. #單頁應用,部分元件的切換不涉及路由,只是頁面有一塊區域的元件要變更

    ######變更的元件參數定義上是一致的,例如都是對話框,要傳一個物件進去,但物件裡面的資料結構不同############透過使用component的is屬性,避免在template中的冗餘元件程式碼,避免多個v -if模板程式碼更整潔############使用的方法(借鏡文件):###
    <keep-alive>
      <component>
      <!-- 组件在 vm.currentview (对应组件名称)变化时改变! -->
      <!-- 非活动组件将被缓存!可以保留它的状态或避免重新渲染 -->
      </component>
    </keep-alive>
    ###注意點:###########動態切換的元件都要引入父元件中,渲染是動態的,但引入不是。 ###
  2. 包裹动态组件时,会缓存不活动的组件实例,提高性能,避免重复渲染(keep-alive不会渲染额外DOM结构)

  3. 有include和exclude这两个属性,用于指定缓存和不缓存的组件(传入字符串/数组/正则)

  4. 另一种避免重新渲染的方法是为标签增加属性v-once,用于缓存大量的静态内容,避免重复渲染。

ps:不会在函数式组件中正常工作,因为它们没有缓存实例。

动画与过渡

其实很多前端工程师第一次用Vue的动画和过渡都是通过库组件来做到的,所以对这块没怎么深挖,各种过渡特效和按钮动画就跑起来了,现在就看下文档,补补课

前端实现动画的基本方法分为三种种:css3的过渡和keyframe/javascript操纵dom/使用webgl或者canvas来独立实现,其中第三种是作为展示动画,与交互结合较少,而Vue作为一个框架,其支持动画基是从前两种入手的,从官方文档提到的四种支持就可以看出这一点。不过官方文档是从DOM过渡和状态过渡两个方面来讲解,前者是DOM的消失和出现的动画等属性的变化,后者是页面上某些值的变化。

DOM属性的改变

若是单个元素/组件的显隐,在组件外面包裹一层,而后选择是css过渡还是javascript过渡

CSS过渡:

  1. vue提供了六个样式后缀,本质是在dom过渡的过程中动态地添加和删除对应的className。(-[enter|leave]-?[active|to]?)

  2. 如果用css库来辅助开发,可以在transiton这个标签上定义自定义过渡类名,也是六个属性。([enter|leave]-?[active|to]?-class)

  3. 常见的一种效果是元素首次渲染的动画,如懒加载图片飞入,这个时候要在transiton标签上加上appear,另有三个属性可指定(appear-?[to|active]?-class)

<!-- 每种CSS动画库对应的class命名规则可能不同,所以根据不同库要自己写,以animate.css为例 -->
<transition>...</transition>
<!-- duration属性可以传一个对象,定制进入和移出的持续时间-->

JS过渡:

  1. 因为现在很多动画库需要工程师调用库提供的函数,把dom元素传入进行处理,这个时候需要这种方式

  2. 通过在transiton这个标签上添加监听事件,共8个([before|after]?-?[enter|leave]-?[cancelled]?)

  3. 监听事件的回调函数的第一个参数都是el,为过渡的dom元素,在enter和leave这两个还会传入done作为第二个参数

  4. 元素首次渲染的动画,可以指定的监听事件有4个([before|after]?-?appear和appear-cancelled)

<template>
  <transition>
    <!-- 对于仅使用 JavaScript 过渡的元素添加 v-bind:css="false",Vue 会跳过 CSS 的检测 -->
  </transition>
</template>
<script>
methods: { // 以Velocity库为例
  beforeEnter: function (el) {/*...*/},
 // 此回调函数是可选项的设置
 enter: function (el, done) {
  // Velocity(el, { opacity: 1, fontSize: &#39;1.4em&#39; }, { duration: 300 })
  done() //回调函数 done 是必须的。否则,它们会被同步调用。
 },
 leave: function (el, done) {
  // Velocity(el, { translateX: &#39;15px&#39;, rotateZ: &#39;50deg&#39; }, { duration: 600 })
  done()
 },
 leaveCancelled: function (el) {/*...*/}
}
</script>

多元素过渡其实就是一句话:照常使用v-if/v-else的同时对同一种标签加上key来标识

Vue对于这种多元素动画有队列上的处理,这就是transiton这个标签上的mode属性,通过指定(in-out|out-in)模式,实现消失和出现动画的队列效果,让动画更加自然。

<transition>
 <!-- ... the buttons ... -->
</transition>

多组件过渡也是一句话:用上一节提到的动态组件,即可完成。

针对列表过渡,其本质仍是多个元素的同时过渡,不过列表大部分是通过数组动态渲染的,因此有独特的地方,不过整体的动画思路不变。具体有以下几点

  1. 使用transitoin-group这个组件,其需要渲染为一个真实元素,可以通过tag这个属性来指定。

  2. 列表的每个元素需要提供key属性

  3. 使用CSS过渡的话,要考虑到列表内容变化过程中,存在相关元素的定位改变,如果要让定位是平滑过渡的动画,要另外一个v-move属性。 这个属性是通过设置一个css类的样式,来将创建元素在定位变化时的过渡,Vue内部是通过FLIP实现了一个动画队列,只要注意一点就是过渡元素不能设置为display:inline,这里需要文档上的代码做一个简短的demo:(其实通过在li上设置过渡transition属性也可以实现v-move的效果)

<template>
  <button>Shuffle</button>
  <transition-group>
    <li>{{ item }}</li>
  </transition-group>
</template>
<script>
import _ from &#39;lodash&#39;;
export default {
  data() {
    return {
      items: [1,2,3,4,5,6,7,8,9]
    }
  },
  methods: {
    shuffle: function () {
      this.items = _.shuffle(this.items)
    }
  }
}
</script>
<style>
.flip-list-move {
 transition: transform 1s;
}
</style>

数值和属性动态变化

這一部分的動畫主要是針對資料元素本身的特效,例如數字的增減,顏色的過渡過程控制,svg動畫的實現等,其本質都是數字/文字的變化。我自己總結就是:利用Vue的響應式系統,把數字的變化透過外部庫把DOM上對應數值的變化做出連續的效果,如1->100是個數字遞增的連續過程,黑色->紅色的過程。官方文檔主要是用幾個範例程式碼來說明,其本質步驟如下:

  1. 在頁面上透過input的雙向綁定修改某一變數a,還有一個處理dom上的過渡效果的變數b

  2. 這個資料被watcher綁定(watch物件中某個屬性是這個變數a),觸發邏輯

  3. ##在watcher裡面的邏輯就是透過外部過渡函式庫,指定初始值b和最終值a,是把b的值最後改為a

  4. #DOM上綁定的變數就是b,如果某些複雜情況可能是基於b的計算屬性,從而把b的變化過程展現出來

#上面這個思路走一遍下來就完成了一個單元級別的動畫效果,這種類似的流程其實是很常見的需求,所以有必要把這個過程封裝成一個元件,只暴露要過渡的值作為入口,每次改變這個值都是一個動畫過渡效果。元件封裝需要在上面四個步驟的基礎上加入mounted生命週期規定初始值即可,同時原來的兩個值a/b在元件裡面作為一個值,可以用watch物件中的newValue和oldValue作為區分。至於最後的SVG,其本質也是數字的過渡,只不過裡面涉及的狀態變數更多,程式碼更長而已,不過純前端頁面這種需求倒還是不多的,不過作為愛好倒可以鼓搗一些好玩的小demo,不過肯定需要設計師的參與,要不要那些參數可不好調出來吶。

相信看了本文案例你已經掌握了方法,更多精彩請關注php中文網其它相關文章!

推薦閱讀:

node做出個性命令列工具

#jQuery回車觸發按鈕事件(附程式碼)
#

以上是vue+mixin節省代碼量的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
JavaScript框架:為現代網絡開發提供動力JavaScript框架:為現代網絡開發提供動力May 02, 2025 am 12:04 AM

JavaScript框架的強大之處在於簡化開發、提升用戶體驗和應用性能。選擇框架時應考慮:1.項目規模和復雜度,2.團隊經驗,3.生態系統和社區支持。

JavaScript,C和瀏覽器之間的關係JavaScript,C和瀏覽器之間的關係May 01, 2025 am 12:06 AM

引言我知道你可能會覺得奇怪,JavaScript、C 和瀏覽器之間到底有什麼關係?它們之間看似毫無關聯,但實際上,它們在現代網絡開發中扮演著非常重要的角色。今天我們就來深入探討一下這三者之間的緊密聯繫。通過這篇文章,你將了解到JavaScript如何在瀏覽器中運行,C 在瀏覽器引擎中的作用,以及它們如何共同推動網頁的渲染和交互。 JavaScript與瀏覽器的關係我們都知道,JavaScript是前端開發的核心語言,它直接在瀏覽器中運行,讓網頁變得生動有趣。你是否曾經想過,為什麼JavaScr

node.js流帶打字稿node.js流帶打字稿Apr 30, 2025 am 08:22 AM

Node.js擅長於高效I/O,這在很大程度上要歸功於流。 流媒體匯總處理數據,避免內存過載 - 大型文件,網絡任務和實時應用程序的理想。將流與打字稿的類型安全結合起來創建POWE

Python vs. JavaScript:性能和效率注意事項Python vs. JavaScript:性能和效率注意事項Apr 30, 2025 am 12:08 AM

Python和JavaScript在性能和效率方面的差異主要體現在:1)Python作為解釋型語言,運行速度較慢,但開發效率高,適合快速原型開發;2)JavaScript在瀏覽器中受限於單線程,但在Node.js中可利用多線程和異步I/O提升性能,兩者在實際項目中各有優勢。

JavaScript的起源:探索其實施語言JavaScript的起源:探索其實施語言Apr 29, 2025 am 12:51 AM

JavaScript起源於1995年,由布蘭登·艾克創造,實現語言為C語言。 1.C語言為JavaScript提供了高性能和系統級編程能力。 2.JavaScript的內存管理和性能優化依賴於C語言。 3.C語言的跨平台特性幫助JavaScript在不同操作系統上高效運行。

幕後:什麼語言能力JavaScript?幕後:什麼語言能力JavaScript?Apr 28, 2025 am 12:01 AM

JavaScript在瀏覽器和Node.js環境中運行,依賴JavaScript引擎解析和執行代碼。 1)解析階段生成抽象語法樹(AST);2)編譯階段將AST轉換為字節碼或機器碼;3)執行階段執行編譯後的代碼。

Python和JavaScript的未來:趨勢和預測Python和JavaScript的未來:趨勢和預測Apr 27, 2025 am 12:21 AM

Python和JavaScript的未來趨勢包括:1.Python將鞏固在科學計算和AI領域的地位,2.JavaScript將推動Web技術發展,3.跨平台開發將成為熱門,4.性能優化將是重點。兩者都將繼續在各自領域擴展應用場景,並在性能上有更多突破。

Python vs. JavaScript:開發環境和工具Python vs. JavaScript:開發環境和工具Apr 26, 2025 am 12:09 AM

Python和JavaScript在開發環境上的選擇都很重要。 1)Python的開發環境包括PyCharm、JupyterNotebook和Anaconda,適合數據科學和快速原型開發。 2)JavaScript的開發環境包括Node.js、VSCode和Webpack,適用於前端和後端開發。根據項目需求選擇合適的工具可以提高開發效率和項目成功率。

See all articles

熱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

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

熱工具

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

MantisBT

MantisBT

Mantis是一個易於部署的基於Web的缺陷追蹤工具,用於幫助產品缺陷追蹤。它需要PHP、MySQL和一個Web伺服器。請查看我們的演示和託管服務。

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

SublimeText3 Linux新版

SublimeText3 Linux新版

SublimeText3 Linux最新版

SecLists

SecLists

SecLists是最終安全測試人員的伙伴。它是一個包含各種類型清單的集合,這些清單在安全評估過程中經常使用,而且都在一個地方。 SecLists透過方便地提供安全測試人員可能需要的所有列表,幫助提高安全測試的效率和生產力。清單類型包括使用者名稱、密碼、URL、模糊測試有效載荷、敏感資料模式、Web shell等等。測試人員只需將此儲存庫拉到新的測試機上,他就可以存取所需的每種類型的清單。