vue 開發中的常見問題


(一)eslint靜態檢查

在大家用vue-cli創建工程的時候,會有一項,使用使用eslint,如果選擇了y,那么工程就會安裝並啟用eslint。

這里列舉一下常見的錯誤:

1.多余的分號 圖片描述

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

3.結尾多余空格 圖片描述

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

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

錯誤肯定是列舉不完的,那么提示錯誤的時候,我們應該先去看提示信息(翻譯),如果發現沒有錯誤,可以對照eslint的官方文檔

在大家適應了eslint的寫法后,效率和正確率會直線上升,這里安利下我的另一篇文章,提升效率的eslint+vscode的開發環境搭建


(二)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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM