1. 程式人生 > 其它 >vue 點選的點有樣式 其他沒有樣式_【前端詞典】Vue 使用時常見的 5 個問題

vue 點選的點有樣式 其他沒有樣式_【前端詞典】Vue 使用時常見的 5 個問題

技術標籤:vue 點選的點有樣式 其他沒有樣式

前言

今天分享 5 個你或許在使用 Vue 開發過程中也遇到的問題。

Vue 使用時常見的 5 個問題

自定義路徑別名

可能有些人注意到了,在 vue-cli 生成的模板中在匯入元件時使用了這樣的語法:

import Index from '@/components/Index'

這個 @ 是什麼東西?後來改配置檔案的時候發現這個是 webpack 的配置選項之一:路徑別名。

我們也可以在基礎配置檔案中新增自己的路徑別名,比如下面這個就把 ~ 設定為路徑 src/components 的別名:

// build/webpack.base.js

{

resolve: {

extensions: ['.js', '.vue', '.json'],

alias: {

'vue$': 'vue/dist/vue.esm.js',

'@': resolve('src'),

'~': resolve('src/components')

}

}

}

然後我們匯入元件的時候就可以這樣寫:

// import YourComponent from '/src/components/YourComponent'

import YourComponent from '~/YourComponent'

既解決了路徑過長的麻煩,又解決了相對路徑的煩惱,方便很多吧!

CSS 作用域與模組

元件內樣式

通常,元件中 標籤裡的樣式是全域性的,在使用第三方 UI 庫(如:Element)時,全域性樣式很可能影響 UI 庫的樣式。

我們可以通過新增 scoped 屬性來使 style 中的樣式只作用於當前元件:

lang="less" scoped>

@import 'other.less';

.title {

font-size: 1.2rem;

}

在有 scoped 屬性的 style 標籤內匯入其他樣式,同樣會受限於作用域,變為元件內樣式。複用程度較高的樣式不建議這樣使用。

匯入樣式

 相對於 style

使用 scoped 屬性時的元件內樣式,有時候我們也需要新增一些全域性樣式。當然我們可以用沒有 scoped 屬性的 style 來寫全域性樣式。

但是相比較,更推薦下面這種寫法:

/* 單獨的全域性樣式檔案 */

/* style-global.less */

body {

font-size: 10px;

}

.title {

font-size: 1.4rem;

font-weight: bolder;

}

然後在入口檔案中匯入全域性樣式:

// src/main.js

import 'style-global.less'

v-for 的使用 tips

v-for 指令很強大,它不僅可以用來遍歷陣列、物件,甚至可以遍歷一個數字或字串。

基本語法就不講了,這裡講個小 tips:

索引值

在使用 v-for 根據物件或陣列生成 DOM 時,有時候需要知道當前的索引。我們可以這樣:

v-for='(item, key) in items' :key='key'> {{ key }} - {{ item }}

但是,在遍歷數字的時候需要注意,數字的 value 是從 1 開始,而 key 是從 0 開始:

v-for='(v, k) in 3' :key='k'> {{ k }}-{{ v }}

2.2.0+ 的版本里,當在元件中使用 v-for 時,key 現在是必須的。

vue 中 this 指向問題

method 不能使用箭頭函式

因為箭頭函式綁定了父級作用域的上下文,所以 this 將不會按照期望指向 Vue 例項。

const App = new Vue({

el: 'body',

methods: {

foo: () => {

console.log(this) // undefined

}

}

})

const App = new Vue({

el: 'body',

methods: {

foo () {

console.log(this) // Vue instance

}

}

})

method 中方法使用定時器需要使用箭頭函式

箭頭函式中的this指向是固定不變的,即是在定義函式時的指向 而普通函式中的this指向時變化的,即是在使用函式時的指向

箭頭函式程式碼:

methods: {

goPage: function (index) {

this.newPage = index

},

inv: function () {

this.invt = setInterval(() => {

this.goPage(this.nextPage)

console.log(this)

//此時的this指向是該vue元件,不管在哪使用,指向都是該vue元件

}, 1000)

}

}

普通函式的程式碼:

methods: {

goPage: function (index) {

this.newPage = index

},

inv: function () {

this.invt = setInterval(function () {

this.goPage(this.nextPage)

console.log(this)

//此時的this並不是該vue元件,而是指向window。

}, 1000)

}

}

setInterval() 與 setTimeout() 是 window 物件的函式,所以 this 會指向 window

一個 template 模板只能有一個可渲染的子元素

一個 下面只能有一個可渲染的子元素否則會報錯, 報錯如下:

e9b7a21c94c32157b9e557082cae7e17.png

即:

Title

Balabala...

Balabala...

// 應該為

Title

Balabala...

Balabala...

最後

這篇文章是我從筆記中抽離出來的,有些內容已經忘了出處。

如果你想進【大前端交流群】,關注公眾號點選“交流加群”新增機器人自動拉你入群。關注我第一時間接收最新干貨。

bc5976131a9606664214fa03b3eebbf5.png