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

vue+mixin節省代碼量

Jun 14, 2018 am 10:37 AM
vue 文件

這次帶給大家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 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插入內容的編譯作用域:被分發的內容的作用域,根據其所在模板決定
  1. 具體內容寫的位置,決定了編譯的作用域(大部分情況都是在父元件作用域下)
  2. 2.1.0 新增作用域插槽,因此可以把子元件的屬性暴露給父元件中寫在子元件內的內容使用
  3. 子元件中的slot標籤可以直接寫自訂屬性,然後父元件寫在slot的標籤加上slot-scope屬性
  4. <!-- 父组件模板 -->
    <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

)

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

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

  3. #動態元件

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

動態元件適用情況:

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

    ######變更的元件參數定義上是一致的,例如都是對話框,要傳一個物件進去,但物件裡面的資料結構不同############透過使用component的is屬性,避免在template中的冗餘元件程式碼,避免多個v -if模板程式碼更整潔############使用的方法(借鏡文件):###
    <keep-alive>
      <component v-bind:is="currentView">
      <!-- 组件在 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
  name="custom-classes-transition"
  enter-active-class="animated tada"
  leave-active-class="animated bounceOutRight"
  :duration="{ enter: 500, leave: 800 }"
>...</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 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>
登入後複製

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

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

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

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

  3. 使用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是個數字遞增的連續過程,黑色->紅色的過程。官方文檔主要是用幾個範例程式碼來說明,其本質步驟如下:

  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

熱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)

vue中怎麼用bootstrap vue中怎麼用bootstrap Apr 07, 2025 pm 11:33 PM

在 Vue.js 中使用 Bootstrap 分為五個步驟:安裝 Bootstrap。在 main.js 中導入 Bootstrap。直接在模板中使用 Bootstrap 組件。可選:自定義樣式。可選:使用插件。

vue怎麼給按鈕添加函數 vue怎麼給按鈕添加函數 Apr 08, 2025 am 08:51 AM

可以通過以下步驟為 Vue 按鈕添加函數:將 HTML 模板中的按鈕綁定到一個方法。在 Vue 實例中定義該方法並編寫函數邏輯。

vue中的watch怎麼用 vue中的watch怎麼用 Apr 07, 2025 pm 11:36 PM

Vue.js 中的 watch 選項允許開發者監聽特定數據的變化。當數據發生變化時,watch 會觸發一個回調函數,用於執行更新視圖或其他任務。其配置選項包括 immediate,用於指定是否立即執行回調,以及 deep,用於指定是否遞歸監聽對像或數組的更改。

vue多頁面開發是啥意思 vue多頁面開發是啥意思 Apr 07, 2025 pm 11:57 PM

Vue 多頁面開發是一種使用 Vue.js 框架構建應用程序的方法,其中應用程序被劃分為獨立的頁面:代碼維護性:將應用程序拆分為多個頁面可以使代碼更易於管理和維護。模塊化:每個頁面都可以作為獨立的模塊,便於重用和替換。路由簡單:頁面之間的導航可以通過簡單的路由配置來管理。 SEO 優化:每個頁面都有自己的 URL,這有助於搜索引擎優化。

vue返回上一頁的方法 vue返回上一頁的方法 Apr 07, 2025 pm 11:30 PM

Vue.js 返回上一頁有四種方法:$router.go(-1)$router.back()使用 &lt;router-link to=&quot;/&quot;&gt; 組件window.history.back(),方法選擇取決於場景。

vue.js怎麼引用js文件 vue.js怎麼引用js文件 Apr 07, 2025 pm 11:27 PM

在 Vue.js 中引用 JS 文件的方法有三種:直接使用 &lt;script&gt; 標籤指定路徑;利用 mounted() 生命週期鉤子動態導入;通過 Vuex 狀態管理庫進行導入。

vue遍歷怎麼用 vue遍歷怎麼用 Apr 07, 2025 pm 11:48 PM

Vue.js 遍歷數組和對像有三種常見方法:v-for 指令用於遍歷每個元素並渲染模板;v-bind 指令可與 v-for 一起使用,為每個元素動態設置屬性值;.map 方法可將數組元素轉換為新數組。

vue的div怎麼跳轉 vue的div怎麼跳轉 Apr 08, 2025 am 09:18 AM

Vue 中 div 元素跳轉的方法有兩種:使用 Vue Router,添加 router-link 組件。添加 @click 事件監聽器,調用 this.$router.push() 方法跳轉。

See all articles