Heim  >  Artikel  >  Web-Frontend  >  Detaillierte Analyse mehrerer leicht übersehener Teile der Vue-Dokumentation

Detaillierte Analyse mehrerer leicht übersehener Teile der Vue-Dokumentation

亚连
亚连Original
2018-05-29 11:09:171573Durchsuche

Für einige Inhalte im Vue-Dokument, die Sie möglicherweise nicht studieren, stellt dieser Artikel hauptsächlich die detaillierte Analyse einiger leicht übersehender Teile des Vue-Dokuments vor. Freunde, die es benötigen, können darauf verweisen

Zu einigen Inhalten in der Vue-Dokumentation, die Sie möglicherweise nicht studieren, habe ich eine kleine Zusammenfassung als schnellen Snack für erfahrene Leute erstellt, die für Anfänger nicht besonders geeignet ist und möglicherweise einige Mängel aufweist Gib mir weitere Vorschläge.

Codesparendes Mixin

Mixin-Konzept: wiederverwendbare Logik auf Komponentenebene, einschließlich Datenvariablen/Lebenszyklus-Hooks/öffentliche Methoden, damit beim Mischen Es kann direkt in Komponenten verwendet werden, ohne dass redundante Logik neu geschrieben werden muss (ähnlich wie bei der Vererbung)

Verwendung:

Erstellen Sie einen Mixin-Ordner unter einem bestimmten öffentlichen Ordner pub, unter dem Sie mixinTest erstellen. js

const mixinTest = {
  created() {
    console.log(`components ${this.name} created`)
  },
  methods: {
    hello() {
      console.log('mixin method hello')
    }
  }
}
export default mixinTest

Referenzieren Sie gerade die öffentliche Mixin-Datei in der Komponente und verwenden Sie

import mixinTest from '../pub/mixin/mixinTest.js'
export default {
  data() {
    return {
      name: 'hello'
    }
  },
  mixins: [mixinTest],
  methods: {
    useMixin() {
      this.hello()
    }
  }
}

ps: Wenn Sie die Methode Vue.mixin() verwenden, wirkt sich dies auf alle später erstellten Vue-Beispiele aus. Verwenden Sie diese mit Vorsicht!

Achten Sie auf mehrere Funktionen von Mixin:

  1. Die eingemischten Datenvariablen sind flache Zusammenführungen. Bei Konflikten haben die Daten in der Komponente Vorrang (benutzerdefinierte Variablen). im Objekt)

  2. Die Logik in der gemischten Lebenszyklusfunktion wird mit der in der Komponente definierten Lebenszyklusfunktionslogik zusammengeführt und zuerst ausgeführt (erstellt/montiert/zerstört)

  3. Der gemischte Wert ist eine Objektoption, die in ein Objekt gemischt wird. Nach einem Konflikt hat der Schlüsselname innerhalb der Komponente Vorrang (Daten/Methode/Komponenten/Anweisungen)

Slot-Inhaltsverteilung

Einführung in das Slot-Konzept: Der Unterschied zwischen Vue und React beim Schreiben liegt in der Organisation interner Elemente von Komponenten und Sub -Komponenten. Es gibt kein untergeordnetes Element in der Komponente, auf das wir zugreifen und das wir anzeigen können (wobei die Renderfunktion vorerst außer Acht gelassen wird), die API ist stattdessen Slot

Verwendungsszenariodefinition:

  1. Es gibt verschachtelten HTML-Code in der benutzerdefinierten Unterkomponente oder anderen benutzerdefinierten Etikettenkomponenten.

  2. Diese benutzerdefinierte Unterkomponente ist in der übergeordneten Komponente geschrieben, und auch verschachtelte Dinge sind es in der übergeordneten Komponente platziert

  3. Durch die Verwendung des 58cb293b8600657fad49ec2c8d37b4727971cf77a46923278913ee247bc958ee-Tags in der Vorlage der untergeordneten Komponente wird der Effekt des Renderns der in der übergeordneten Komponente geschriebenen verschachtelten Tags erzielt wird erreicht

  4. Es geht darum, den Inhalt der übergeordneten Komponente in die untergeordnete Komponente einzufügen und ihn an der Position der untergeordneten Komponente einzufügen

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

Zwei erweiterte Punkte der Slot-Funktion:

Der Zusammenstellungsumfang des in den Slot eingefügten Inhalts: der Umfang des verteilten Inhalts wird entsprechend der Vorlage bestimmt, in der er sich befindet

  1. Spezifisch Der Ort, an dem der Inhalt geschrieben wird, bestimmt den Umfang der Kompilierung (in den meisten Fällen im Rahmen der übergeordneten Komponente)

  2. 2.1.0+ fügt einen neuen Bereichsslot hinzu, sodass Sie die Eigenschaften der untergeordneten Komponente für den in der untergeordneten Komponente geschriebenen Inhalt in der übergeordneten Komponente verfügbar machen können. Verwenden Sie das Slot-Tag in Die untergeordnete Komponente schreibt benutzerdefinierte Eigenschaften direkt und die übergeordnete Komponente schreibt sie dann in den Slot. Die Bezeichnung wird mit dem Slot-Scope-Attribut

  3. <!-- 父组件模板 -->
    <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>
Das Namensattribut des Slots gibt die Stelle an, an der das Etikett eingefügt wird. Dabei handelt es sich um eine benannte Einfügung in den Dokumentslot (dieses offizielle Dokument erklärt dies klar)

Der in die Vorlage der Unterkomponente geschriebene Slot verfügt über ein Namensattribut (af84d27f87c182823f3fa1c1661899d27971cf77a46923278913ee247bc958ee )

  1. Schreiben Sie den Slot-Inhalt in die untergeordnete Komponente Geben Sie in der übergeordneten Komponente das Slot-Attribut an (8ea3fee8481e96a978f72bfec61d2bfb12394b3e26ee717c64999d7867364b1b4a3)

  2. Der Inhalt der übergeordneten Komponente wird an der richtigen Stelle platziert Position entsprechend Slot==Name

  3. Wenn das Slot-Attribut nicht angegeben ist, wird es standardmäßig im anonymen Slot platziert Position

  4. Dynamische Komponente

Dynamische Komponente verfügt über diese Funktion. Viele Leute haben viele Vue-Projekte geschrieben, aber sie ist nutzlos. An diesem Punkt angekommen, ist es notwendig, noch ein paar Worte zu sagen Anwendbarkeit dynamischer Komponenten:

Einzelseitige Anwendung. Das Umschalten einiger Komponenten erfordert kein Routing, es gibt jedoch einen Bereich auf der Seite, in dem die Komponentenparameter angegeben werden sollen geändert

  1. sind in der Definition konsistent. Beispielsweise handelt es sich bei allen um Dialogfelder und es muss ein Objekt übergeben werden, aber die Datenstruktur im Objekt ist unterschiedlich

  2. Durch die Verwendung des is-Attributs der Komponente können Sie redundanten Komponentencode in der Vorlage und mehrere V-IF-Vorlagencodes vermeiden, was sauberer ist

  3. Verwendete Methode ( Referenz Dokument):

  4. <keep-alive>
      <component v-bind:is="currentView">
      <!-- 组件在 vm.currentview (对应组件名称)变化时改变! -->
      <!-- 非活动组件将被缓存!可以保留它的状态或避免重新渲染 -->
      </component>
    </keep-alive>

Hinweis:

Dynamische Schaltkomponenten müssen in die übergeordnete Komponente eingeführt werden , das Importieren jedoch nicht.

  1. 7c9485ff8c3cba5ae9343ed63c2dc3f7Beim Umschließen dynamischer Komponenten werden inaktive Komponenteninstanzen zwischengespeichert, um die Leistung zu verbessern und wiederholtes Rendern zu vermeiden (keep-alive rendert keine zusätzlichen DOM-Strukturen)

  2. 7c9485ff8c3cba5ae9343ed63c2dc3f7 verfügt über zwei Attribute, „include“ und „exclude“, die zur Angabe zwischengespeicherter und nicht zwischengespeicherter Komponenten verwendet werden (Übergabe von Zeichenfolgen/Arrays/Regulären)

  3. Eine weitere Möglichkeit, ein erneutes Rendern zu vermeiden, besteht darin, dem Tag das Attribut v-once hinzuzufügen, das zum Zwischenspeichern einer großen Menge statischen Inhalts und zum Vermeiden wiederholten Renderns verwendet wird.

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

动画与过渡

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

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

DOM属性的改变

若是单个元素/组件的显隐,在组件外面包裹一层300ff3b250bc578ac201dd5fb34a00046087faffb1c3f26530d25a6b190c2f81,而后选择是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: &#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 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 &#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 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的变化过程展现出来

Nachdem die obige Idee befolgt wurde, ist ein Animationseffekt auf Einheitenebene abgeschlossen. Dieser ähnliche Prozess ist tatsächlich eine sehr häufige Anforderung, daher ist es notwendig, diesen Prozess in eine Komponente zu kapseln und ihn nur verfügbar zu machen Der zu übertragende Wert dient als Einstiegspunkt und jedes Mal, wenn dieser Wert geändert wird, handelt es sich um einen animierten Übergangseffekt. Bei der Komponentenkapselung muss der im montierten Lebenszyklus angegebene Anfangswert basierend auf den oben genannten vier Schritten hinzugefügt werden. Gleichzeitig werden die beiden ursprünglichen Werte a/b als ein Wert in der Komponente verwendet und können unterschieden werden durch newValue und oldValue im Watch-Objekt. Was das endgültige SVG betrifft, so ist es im Wesentlichen ein digitaler Übergang, der jedoch mehr Zustandsvariablen und längeren Code beinhaltet. Es besteht jedoch immer noch keine große Nachfrage nach reinen Frontend-Seiten, aber als Hobby kann man etwas Spaß daran haben Demo, aber es erfordert unbedingt die Beteiligung des Designers, sonst wird es schwierig, die Parameter anzupassen.

Ich habe das Obige für Sie zusammengestellt und hoffe, dass es Ihnen in Zukunft hilfreich sein wird.

Verwandte Artikel:

Angular verwendet den Filter Groß-/Kleinschreibung, um ein Beispiel für eine Funktion zur Umwandlung von Groß- und Kleinschreibung zu implementieren

Beispiel für einen Angular-Verwendungsvorgang des Ereignisbefehls ng-click, der mehrere Parameter übergibt

JavaScript-Code implementiert die Upload-Vorschaufunktion von TXT-Dateien

Das obige ist der detaillierte Inhalt vonDetaillierte Analyse mehrerer leicht übersehener Teile der Vue-Dokumentation. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn