Vue ドキュメントの見落とされやすいいくつかの部分の詳細な分析

亚连
リリース: 2018-05-29 11:09:17
オリジナル
1571 人が閲覧しました

Vue ドキュメントの一部の内容については、この記事で主に Vue ドキュメントの見落とされやすい部分の詳細な分析を紹介します。必要な方は参考にしてください。 Vue ドキュメント 学習できない可能性のある内容の一部を簡単にまとめました。経験者向けの内容なので、初心者にはあまり適していません。また、いくつかの欠点があるかもしれません。

コードを保存するミックスイン

ミックスインの概念: データ変数/ライフサイクルフック/パブリックメソッドを含むコンポーネントレベルの再利用可能なロジック。これにより、冗長なロジックを繰り返し記述することなく混合コンポーネントで直接使用できます(類似継承へ)

使い方:

あるパブリックフォルダーpub配下にmixinフォルダーを作成し、その下にmixinTest.jsを作成します


const mixinTest = {
  created() {
    console.log(`components ${this.name} created`)
  },
  methods: {
    hello() {
      console.log('mixin method hello')
    }
  }
}
export default mixinTest
ログイン後にコピー

コンポーネント内で先ほどのパブリックmixinファイルを参照して使用します


import mixinTest from '../pub/mixin/mixinTest.js'
export default {
  data() {
    return {
      name: 'hello'
    }
  },
  mixins: [mixinTest],
  methods: {
    useMixin() {
      this.hello()
    }
  }
}
ログイン後にコピー

ps: Vue.mixin() メソッドを使用すると、後で作成されるすべての Vue サンプルに影響を与えるため、使用には注意してください。

ミックスインのいくつかの機能に注意してください:

    混合されたデータ変数は浅いマージであり、競合が発生した場合、コンポーネント内のデータが優先されます (オブジェクト内のカスタム変数)
  1. のロジック。混合ライフサイクル関数は、コンポーネントで定義されたライフサイクル関数ロジックとマージし、最初に実行 (作成/マウント/破棄) します
  2. オブジェクトとして値が混合されたオプションは、競合後にオブジェクトに混合されます。 、コンポーネント内のキー名も優先されます (データ/メソッド/コンポーネント/ディレクティブ)
スロットコンテンツの配布

スロットの概念の紹介: 記述における Vue と React の違いは内部コンポーネントの構成にありますコンポーネントとサブコンポーネントの要素にアクセスして表示するための API は、代わりにスロットです

使用シナリオ定義:

    カスタムサブコンポーネントにはネストされたHTMLやその他のカスタムタグコ​​ンポーネントがあります
  1. このカスタムサブコンポーネントは親コンポーネントに記述されており、ネストされたものも親コンポーネントに配置されます
  2. 。サブコンポーネントのテンプレートで タグを使用することで実現されます。親コンポーネントに記述されたネストされたタグの効果は、基本的に、親コンポーネントのコンテンツを子コンポーネントに配置することです。複数のタグも一緒に挿入されます
  3. <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>
    ログイン後にコピー
  4. スロット機能の 2 つの高度なポイント:
スロットに挿入されたコンテンツのコンパイル スコープ: 配布されたコンテンツのスコープコンテンツは、それが配置されているテンプレートに従って決定されます

特定のコンテンツが書き込まれる場所によって、コンパイルのスコープが決まります (ほとんどの場合、親コンポーネントのスコープ内にあります)

2.1.0 + 新しいスコープ スロットを追加すると、子コンポーネントのプロパティを親コンポーネントの子コンポーネントに書き込まれたコンテンツに公開できるようになります
  1. 子コンポーネントのスロット タグはカスタム属性を直接書き込むことができ、その後、親コンポーネントは、スロットにタグとスロットスコープ属性を書き込みます
  2. <!-- 父组件模板 -->
    <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>
    ログイン後にコピー
  3. タグが挿入される場所を指定するスロットの name 属性、そしてそれはドキュメント内の名前付きスロットです (これは公式ドキュメントにわかりやすく説明されています)

サブコンポーネントのテンプレートに書かれたスロットにはname属性()が付いています

スロットの内容を親コンポーネント内の子コンポーネントには、slot 属性 (

123

) を指定します
  1. 親コンポーネントの内容は、slot== に対応する名前を正しく入力してください位置
  2. スロット属性が指定されていない場合、デフォルトで匿名スロット位置に配置されます
  3. 動的コンポーネント
  4. 動的コンポーネントのこの機能は、人々が作成した多くの Vue プロジェクトでは使用されていません

動的コンポーネントの適用性: 一部のコンポーネントの切り替えにはルーティングが含まれません。

変更されたコンポーネントのパラメータは定義上一貫しています。たとえば、オブジェクトを渡す必要がありますが、オブジェクト内のデータ構造は次のようになります。

コンポーネントの is 属性を使用することで、テンプレート内の冗長なコンポーネントが回避され、コードがよりクリーンになります
  1. 使用されるメソッド (ドキュメントを参照):
  2. <keep-alive>
      <component v-bind:is="currentView">
      <!-- 组件在 vm.currentview (对应组件名称)变化时改变! -->
      <!-- 非活动组件将被缓存!可以保留它的状态或避免重新渲染 -->
      </component>
    </keep-alive>
    ログイン後にコピー

  3. 注:

動的に切り替えられるコンポーネントは、親コンポーネントに導入する必要があります。レンダリングは動的ですが、インポートは動的ではありません。

動的コンポーネントをラップするとき、非アクティブなコンポーネントのインスタンスはパフォーマンスを向上させ、繰り返しのレンダリングを避けるためにキャッシュされます (keep-alive は追加の DOM 構造をレンダリングしません)

include と exclude の 2 つの属性は、キャッシュされたコンポーネントとキャッシュされていないコンポーネントを指定するために使用されます (文字列/配列/通常を渡します)
  1. 再レンダリングを回避する別の方法は、次のように属性 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: &#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的变化过程展现出来

上記のアイデアに従って、ユニットレベルのアニメーション効果が完成します。これと同様のプロセスは実際には非常に一般的な要件であるため、このプロセスをコンポーネントにカプセル化し、遷移する値のみをエントリとして公開する必要があります。 、この値が変更されるたびに、アニメーションのトランジション効果が発生します。コンポーネントのカプセル化は、上記の 4 つの手順に基づいて、実装されたライフサイクルで指定された初期値を追加する必要があります。同時に、元の 2 つの値 a/b はコンポーネント内で 1 つの値として使用され、区別できます。監視オブジェクトの newValue と oldValue によって。 最後の SVG についても、その本質はデジタル移行ですが、より多くの状態変数と長いコードが含まれます。ただし、純粋なフロントエンド ページの需要はまだそれほど多くありませんが、趣味として少しいじってみるのも良いでしょう。小さなデモですが、デザイナーの参加が必ず必要です。そうしないと、パラメーターを調整するのが難しくなります。

上記は私があなたのためにまとめたものです。

関連記事:

Angular フィルター大文字/小文字を使用して大文字小文字変換機能を実装する例

Angular 操作イベントコマンド ng-click を使用して複数のパラメーターを渡す例

txt ファイルを実装する JavaScript コードアップロードプレビュー機能

以上がVue ドキュメントの見落とされやすいいくつかの部分の詳細な分析の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート