vue 開發中的常見問題

(一)eslint靜態檢查javascript

在你們用vue-cli建立工程的時候,會有一項,使用使用eslint,若是選擇了y,那麼工程就會安裝並啓用eslint。css

這裏列舉一下常見的錯誤:html

1.多餘的分號 圖片描述vue

2.定義了卻未使用的變量 圖片描述java

3.結尾多餘空格 圖片描述node

4.超過一行的空行 圖片描述webpack

5.代碼尾行應該有空行 圖片描述es6

錯誤確定是列舉不完的,那麼提示錯誤的時候,咱們應該先去看提示信息(翻譯),若是發現沒有錯誤,能夠對照eslint的官方文檔web

在你們適應了eslint的寫法後,效率和正確率會直線上升,這裏安利下個人另外一篇文章,提高效率的eslint+vscode的開發環境搭建vue-cli


(二)this指向

常常會有朋友問一些undifined的錯誤,好比:

<script>
import Hello from './components/Hello'

export default {
  data () {
    return {
      list: ['a', 'b', 'c'],
      idx: 0,
      current: ''
    }
  },
  methods: {
    iter () {
      this.list.map(function (v, k) {
        if (k === this.idx) {
          this.current = v

          console.log(this.current)
        }
      })
    }
  },
  components: {
    Hello
  }
}
</script>

這是剛建立的工程,咱們定義了list,idx和current,在執行iter方法時,咱們就給current賦值以idx爲下標的值,當咱們執行後會發現,瀏覽器報了一個錯誤

圖片描述

這麼回事,咱們不是定義了idx了嗎?

實際上是由於咱們在map裏的this是指向當前map的迭代對象,而非咱們vue的實例,因此this裏沒有咱們須要的idx。

解決方式有兩種,其一是經過保存this

let _this = this

其二是使用es6箭頭函數

methods: {
  iter () {
    this.list.map((v, k) => {
      if (k === this.idx) {
        this.current = v

        console.log(this.current)
      }
    })
  }
},

如今再看咱們的瀏覽器

圖片描述

已經能夠達到咱們預期的效果了!

再來一發

<div @click="check"></div>

methods: {
  check () {
    alert('ok')
  }
}

你們會發現並不會alert,可是語法沒錯誤呀,這是爲何呢?

讓我媽修改alert

methods: {
    check () {
        window.alert('ok')
    }
}

這下alert就能正常工做了,你們確定都明白是怎麼一回事了!

沒錯 就是this的鍋!


(三)方法傳值

咱們在input中的方法但願獲取input的value,怎麼獲取呢?

能夠經過$event這個對象,經過將$event傳入方法

<input type="text" value="value" @input="change($event)"/>

咱們能夠成功的拿到咱們但願的值

change (e) {
  console.log(e.target.value)
  this.value = e.target.value
}

(四)迭代判斷

好比咱們有一個列表,咱們但願能顯示咱們當前選中的那一個,如何實現呢?

基本思路是經過$index來判斷是不是當前迭代對象,而後去增減class或者style來實現不一樣的樣式

<ul>
  <!-- 方法1 class-->
  <li v-for="item in list" :class="{'active': $index === activeId}">{{item}}</li>
  <!-- 方法2 style-->
  <li v-for="item in list" :style="{backgroundColor: $index === activeId ? 'red' : 'white'}">{{item}}</li>
</ul>


data () {
  return {
    list: ['a', 'b', 'c'],
    activeId: 0
  }
},

(五)camelCase vs. kebab-case

HTML 特性不區分大小寫。名字形式爲 camelCase 的 prop 用做特性時,須要轉爲 kebab-case(短橫線隔開)(官網例子)

Vue.component('child', {
  // camelCase in JavaScript
  props: ['myMessage'],
  template: '<span>{{ myMessage }}</span>'
})

<!-- kebab-case in HTML -->
<child my-message="hello!"></child>

另外props的寫法

簡寫

props: ['demo-first', 'demo-second']

帶類型

props: {
    'demo-first': Number,
    'demo-second': Number
}

帶多種檢查

props: {
  'demo-first': {
    type: Number,
    default: 0
  }
}

因此, 當你獲取不到props的值的時候,能夠先仔細檢查拼寫是否正確。


(六)傳值與傳字面量

在vue的組件中傳遞數據,若是是單純傳遞字面量,如

<hello result="success"></hello>

那麼在hello中獲取的props result的值就是「success」,若是但願進行值傳遞,須要在指令前加 ‘:’ 冒號,這樣,父層的success的值改變,hello的值也會跟着改變。


(七)轉場動畫

在vue中有個很好用的指令,transition,經過它咱們能夠實現自定義的router切換中的動畫

方法就是在

<router-view transition="fade"></router-view>

加入自定義的class fade-transition , fade-leave , fade-enter便可。


(八)數據驅動 vs dom

vue是基於數據驅動的,最好不要直接去修改dom(雖然官方給出了這樣的方法)


(九)v-cloak

若是出現{{}}的短暫出現的狀況,能夠經過添加v-cloak來處理。

這個指令保持在元素上直到關聯實例結束編譯。和 CSS 規則如 [v-cloak] { display: none } 一塊兒用時,這個指令能夠隱藏未編譯的 Mustache 標籤直到實例準備完畢。


(十)使用sass

首先安裝依賴

npm i node-sass sass-loader -D

而後在vue的style裏添加

<style lang="scss" scoped></style>

注意:是"scss"!而後重啓webpack,就ok啦

(十一)vue片斷

有時候咱們會看到這個警告 圖片描述

這是由於咱們的template中,出現了片斷,那麼這個片斷究竟是什麼gui呢?

咱們能夠理解爲是一段沒有根的dom元素,官網上是這麼描述的

下面幾種狀況會讓實例變成一個片段實例:

模板包含多個頂級元素。 模板只包含普通文本。 模板只包含其它組件(其它組件多是一個片斷實例)。 模板只包含一個元素指令,如 <partial>  vue-router  <router-view>。 模板根節點有一個流程控制指令,如 v-if  v-for

vue建議咱們爲片斷添加一個根節點,這樣方便傳遞props和過渡效果,也可讓dom更好的溯源,因此,解決方法很簡單,在template的內部套一層div便可,像這樣

// 片斷

<template>
  <h1>hello</h1>
  <h2>world</h2>
</template>

// 套div

<template>
  <div>
    <h1>hello</h1>
    <h2>world</h2>
  </div>      
</template>

(十二)引用圖片

首先,若是使用的是img標籤那麼能夠這樣

data () {
  return {
    img: require('path/to/your/source')
  }
}

而後在template

<img :src="img" />

若是使用的是背景圖的方式,那麼

能夠這樣
data () {
  return {
    img: require('path/to/your/source')
  }
}

<div :style="{backgroundImage: 'url(' + img + ')'}"></div>
 或者直接在css中定義 
background-image: url('path/to/your/source');
轉自:http://cnodejs.org/topic/5750d752491b9c4f36910fec
相關文章
相關標籤/搜索