1. 程式人生 > >vue基礎知識整理

vue基礎知識整理

例項-vue是由例項組成的

根例項 元件也是例項

以$開頭的單詞都是代表著vue的例項屬性例項方法

vue例項中的生命週期鉤子

8個生命週期函式 這幾個函式不用放到methods裡面

計算屬性

儘量使用計算屬性而不是watch!

可以配合著計算屬性使用setter和getter

繫結樣式

  • 對於非行內樣式 方法一: :class=“{becomeRed: isActivated}” 其中isActivated放到data裡面,如果是true,就有becomeRed這個class,否則就沒有。

方法二:

:class=“[becomeRed]”

data:{ becomeRed: “”}

becomeRed裡面放類名

  • 對於行內樣式
:style=“styleObj”
//或
:style=“[styleObj,
{fontSize: '20px'}]”

data:{
    styleObj:{
        color:”black”
    }
}

v-if和v-show

後者只是隱藏而已,dom元素還在;前者直接殺掉dom元素。

使用後者效能更高。 如果要使用v-if,而且這個要隱藏的元件以後還會顯示,我們可以在這個元件標籤裡面加上一個v-once,以此來增加效能,不讓這個元件死掉。

v-if和v-else

兩個東西要連著寫!

陣列

如果想改變陣列,介面跟著變。不能使用方括號來改。 有三種方式:

  1. 使用陣列遍歷函式
  2. 改變陣列的引用
  3. set方法:
Vue.set(vm.userInfo,1,5)
//或
vm.$set(vm.userInfo,2,10)

template佔位符

起一個包裹的作用

向物件中注入新的屬性

  1. 改變物件的引用
  2. set方法:
Vue.set(vm.userInfo,”address”,”beijing”)
//或
vm.$set(vm.userInfo,”address”,”beijing”)

使用自定義元件時

is屬性

在table、ul、select下面使用自定義標籤時,使用is屬性解決模板標籤的bug

data

不應該是個物件,而是個函式,返回content,這樣的話,返回一個引用,每個子元件都可以擁有獨立的資料,互不干擾。

獲取dom

對原生標籤

ref=‘hello’

this.$refs.hello

對自定義標籤

使用ref返回的是引用。

父子元件的資料傳遞

父傳子

通過屬性的形式傳遞資料

<counter :count = "0"></counter>//傳數字


    <counter count = "1"></counter>//傳字串

單向資料流: 父元件可以向子元件傳遞資料,但是子元件不能修改父元件傳過來的東西。因為有可能其他元件還在使用父元件傳遞過來的資料,會影響其他元件。

如果要修改,得copy一份副本,修改這個副本

子傳父

激發事件emit

引數校驗

props後面不寫陣列了,改寫成一個物件,like this:

props: {
    content: {
        type: String,
        validator: function(value) {
            return (value.length > 5)
        }
    },
    index: Number,
    num: [String,Number],
    fuck: {
        type: String,
        required: false,
        default: 'default value'
    }
}

props特性

父元件向子元件傳屬性,子元件在props裡面剛好聲明瞭,即父傳子接。 父元件和子元件有一種對應特性:

  1. 這個傳遞屬性不會在dom上顯示;
  2. 子元件接受了props後,子元件就可以使用差值表示式將其顯示出來。

非props特性

父元件向子元件傳屬性,但是子元件在props裡面卻沒有宣告該屬性。 即父傳子不接。

  1. 子元件沒辦法獲取該屬性的內容,因為沒有獲取;
  2. 非props特性會顯示在dom元素裡面的。

如何給自定義元件繫結原生事件?

  • 方法一:
  1. 給子元件繫結一個原生事件,觸發子元件函式;
  2. 在子元件函式裡面監聽,然後$emit一個自定義事件給自定義元件即可
  • 方法二: 直接在自定義事件上面加native修飾符,這樣寫: @click.native = “handleClick”

如何解決複雜的元件間傳值?

  1. vuex
  2. 釋出訂閱模式(匯流排機制/Bus/觀察者模式)

匯流排機制

  <div id="app">
    <child content="旭鳳"></child>
    <child content="錦覓"></child>
  </div>

  <script type="text/javascript">

    Vue.prototype.bus = new Vue();

    Vue.component('child',{
      data: function() {
        return {selfContent: this.content}
      },
      props: ['content'],
      template: "<div @click='handleChildClick'>{{selfContent}}</div>",
      methods: {
        handleChildClick: function() {
          this.bus.$emit('change', this.selfContent);
        }
      },
      mounted: function() {
        var that = this;
        this.bus.$on('change', function(msg) {
          that.selfContent = msg;
        })
      }
    });

    var app = new Vue({
      el: '#app'
    });
  </script>

插槽

<slot>預設內容</slot>

具名插槽

給插槽起一個名字,插到指定的位置

作用域插槽

當子元件做迴圈或某一部分它的dom結構應該由外部傳進來的時候,使用作用域插槽。

<div id="app">
    <sweet>
      <template slot-scope='props'>
        <h1>{{props.item}}</h1>
      </template>
    </sweet>
  </div>

  <script type="text/javascript">

    Vue.component('sweet',{
      data: function() {
        return {
          list: ['錦覓', '旭鳳', '潤玉']
        }
      },
      template:
      `<div>
        <ul>
          <slot
            v-for='item in list'
            :item='item'
          ></slot>
        </ul>
      </div>`
    })
    var app = new Vue({
      el: '#app'
    });
  </script>

動態元件

<component :is=“type”></component> 這個type是根例項data裡面的一個屬性,用於替換component變成你自定義過的自定義元件。

可以用於替代v-if的效果!

動畫

過渡動態效果

漸入

漸出

  <div id="app">
    <transition name='fade'>
      <div v-show='seen'>香蜜沉沉燼如霜</div>
    </transition>
    <button type="button" @click='handleBtnClick'>change</button>
  </div>

<style>
    .fade-enter, .fade-leave-to{
      opacity: 0;
    }

    .fade-enter-active, .fade-leave-active{
      transition: opacity 3s;
    }
  </style>

Animate.css

  • keyframes自定義的標籤動畫
  • 匯入animate庫
<transition
         name="fade"
         enter-active-class="animated swing"
         leave-active-class="animated shake"
      >
        <div v-show='seen'>香蜜沉沉燼如霜</div>
      </transition>

如何讓重新整理之後自動顯示動畫?

在transition標籤裡面加上這麼兩個屬性:

appear

appear-active-class=“animated swing”

如何讓keyframes動畫和transiton動畫融合在一起?

都放到enter和leave的那兩個active class裡面去。

兩者時間不統一,如何設定動畫時間?

在transition標籤裡面加上這麼幾條屬性即可:

:duration=“{enter: 5000, leave: 10000}”

//或
:duration="1000"

//或
type="transition"

js動畫

使用js動畫鉤子。

<transition
         name="fade"
         @before-enter="handleBeforeEnter"
         @enter="handleEnter"
         @after-enter="handleAfterEnter"
      >
        <div v-show='seen'>香蜜沉沉燼如霜</div>
      </transition>

methods: {
          handleBtnClick: function() {
            this.seen = !this.seen
          },
          handleBeforeEnter: function(el) {
            el.style.color = 'pink';
          },
          handleEnter: function(el, done) {
            setTimeout(()=>{
              el.style.color = 'blue'
            },2000);
            setTimeout(()=>{
              done()
            },4000);
          },
          handleAfterEnter: function(el) {
            el.style.color = 'red'
          }
        }

使用velocity.js來創作js動畫

  methods: {
          handleBtnClick: function() {
            this.seen = !this.seen
          },
          handleBeforeEnter: function(el) {
            el.style.opacity = 0;
          },
          handleEnter: function(el, done) {
            Velocity(el,{
              opacity: 1
            },{
              duration: 1000,
              complete: done
            })
          },
          handleAfterEnter: function(el) {
            console.log('4s是垃圾!')
          },

          handleBeforeLeave: function(el) {
            el.style.opacity = 1;
          },
          handleLeave: function(el, done) {
            Velocity(el,{
              opacity: 0
            },{
              duration: 1000,
              complete: done
            })
          },
          handleAfterLeave: function(el) {
            console.log('我走了!')
          }
        }

多元素過渡效果

  • 對原生元件
<style>
      .fade-enter, .fade-leave-to {
        opacity: 0;
      }
      .fade-enter-active, .fade-leave-active {
        transition: opacity 1s;
      }
    </style>


  <transition
         name="fade"
         mode="out-in"
      >
        <div v-if='seen' key='flower'>錦覓</div>
        <div v-else key='bird'>旭鳳</div>
      </transition>
  • 對自定義元件
<child v-if=“show”></child>
<child-one v-else></child-one>
  • 對動態元件 直接用component標籤替換這兩child,就可以直接使用。效果一樣哦。

列表過渡

使用transition-group標籤代替transition標籤,來包裹列表,其他部分使用起來和前面一樣。

原理

相當於在每一個表項div外面包裹了一個transition標籤,對它使用一些如v-enter的class。

動畫封裝

不用css動畫了,用js動畫。