有關(guān)vue的常見面試題(上)

一:防抖節(jié)流

防抖:一個(gè)頻繁觸發(fā)的函數(shù)剑刑,在規(guī)定時(shí)間內(nèi)媳纬,只讓最后一次生效,前面的不生效施掏。
例:防抖經(jīng)常用在我們搜索框輸入搜索钮惠,點(diǎn)擊提交,防止等七芭;
節(jié)流:一個(gè)頻繁觸發(fā)的函數(shù)素挽,在規(guī)定時(shí)間內(nèi),函數(shù)執(zhí)行一次后狸驳,只有大于設(shè)定的執(zhí)行周期后才會執(zhí)行第二次预明。
例:節(jié)流一般在onresize、mousemove耙箍、滾動(dòng)事件等事件中使用多律,防止過多的請求造成服務(wù)器壓力

二:Css盒模型

盒模型的組成:元素的內(nèi)容content、元素的內(nèi)邊距padding烤镐、元素的外邊距margin框全、元素的邊框border
盒模型分為 : W3C標(biāo)準(zhǔn)盒子 、IE盒子
W3C標(biāo)準(zhǔn)盒子(content-box):又稱內(nèi)容盒子,是指塊元素box-sizing屬性為content-box的盒模型术辐,盒子總寬度 = margin + border + padding + width
IE盒子(border-box):又稱怪異盒模型(邊框盒子)砚尽,是指塊元素box-sizing屬性為border-box的盒模型,盒子總寬 = margin + width

三:數(shù)組都有哪些方法

1.toString()與join()一樣都是把數(shù)組轉(zhuǎn)成以逗號分割的字符串
2.pop() 刪除數(shù)組的最后一項(xiàng)
3.push() 往數(shù)組最后添加新數(shù)據(jù)
4.shift() 刪除數(shù)組最前面的一項(xiàng)

  1. unshift() 往數(shù)組開頭添加新數(shù)據(jù)
  2. splice() 方法可用于向數(shù)組添加新項(xiàng)或者刪除數(shù)組
    7.concat()連接兩個(gè)數(shù)組生成一個(gè)新數(shù)組
    8.slice()
//slice 與 splice 的區(qū)別
var  arr=['a','b','c','d','e','f'];
arr.splice(1,3); // arr = ['a', 'e', 'f']; arr.splice(1,3)=['b', 'c', 'd'];
var  arr=['a','b','c','d','e','f'];
arr.slice(1,3); // arr = ['a','b','c','d','e','f']; arr.slice(1,3)=['b', 'c']

四:var辉词、const必孤、let的區(qū)別

var定義的變量可以修改,如果不初始化會輸出undefined瑞躺,不會報(bào)錯(cuò)敷搪。
const定義的變量不可以修改,而且必須初始化
let是塊級作用域隘蝎,函數(shù)內(nèi)部使用let定義后购啄,對函數(shù)外部無影響。

五:vue生命周期

vue生命周期

beforeCreate( 創(chuàng)建前 )
在實(shí)例初始化之后嘱么,數(shù)據(jù)觀測和事件配置之前被調(diào)用狮含,此時(shí)組件的選項(xiàng)對象還未創(chuàng)建,el 和 data 并未初始化曼振,因此無法訪問methods几迄, data, computed等上的方法和數(shù)據(jù)冰评。
created ( 創(chuàng)建后 )
實(shí)例已經(jīng)創(chuàng)建完成之后被調(diào)用映胁,實(shí)例已完成以下配置:數(shù)據(jù)觀測、屬性和方法的運(yùn)算甲雅,watch/event事件回調(diào)解孙,完成了data 數(shù)據(jù)的初始化,el沒有抛人。 然而弛姜,掛在階段還沒有開始, $el屬性目前不可見,這是一個(gè)常用的生命周期妖枚,因?yàn)槟憧梢哉{(diào)用methods中的方法廷臼,改變data中的數(shù)據(jù),并且修改可以通過vue的響應(yīng)式綁定體現(xiàn)在頁面上绝页,荠商,獲取computed中的計(jì)算屬性等等,通常我們可以在這里對實(shí)例進(jìn)行預(yù)處理续誉,在這里發(fā)ajax請求莱没,值得注意的是,這個(gè)周期中是沒有什么方法來對實(shí)例化過程進(jìn)行攔截的酷鸦,因此假如有某些數(shù)據(jù)必須獲取才允許進(jìn)入頁面的話饰躲,并不適合在這個(gè)方法發(fā)請求朴译,建議在組件路由鉤子beforeRouteEnter中完成
beforeMount
掛在開始之前被調(diào)用,相關(guān)的render函數(shù)首次被調(diào)用(虛擬DOM)属铁,實(shí)例已完成以下的配置: 編譯模板,把data里面的數(shù)據(jù)和模板生成html躬翁,完成了el和data 初始化焦蘑,注意此時(shí)還沒有掛在html到頁面上。
mounted
掛在完成盒发,也就是模板中的HTML渲染到HTML頁面中例嘱,此時(shí)一般可以做一些ajax操作,mounted只會執(zhí)行一次宁舰。
beforeUpdate(更新前)
在數(shù)據(jù)更新之前被調(diào)用拼卵,發(fā)生在虛擬DOM重新渲染和打補(bǔ)丁之前,可以在該鉤子中進(jìn)一步地更改狀態(tài)蛮艰,不會觸發(fā)附加地重渲染過程
updated(更新后)
在由于數(shù)據(jù)更改導(dǎo)致地虛擬DOM重新渲染和打補(bǔ)丁只會調(diào)用腋腮,調(diào)用時(shí),組件DOM已經(jīng)更新壤蚜,所以可以執(zhí)行依賴于DOM的操作即寡,然后在大多是情況下,應(yīng)該避免在此期間更改狀態(tài)袜刷,因?yàn)檫@可能會導(dǎo)致更新無限循環(huán)聪富,該鉤子在服務(wù)器端渲染期間不被調(diào)用
beforeDestroy(銷毀前)
在實(shí)例銷毀之前調(diào)用,實(shí)例仍然完全可用著蟹,這一步還可以用this來獲取實(shí)例墩蔓,一般在這一步做一些重置的操作,比如清除掉組件中的定時(shí)器和監(jiān)聽的dom事件
destroyed(銷毀后)
在實(shí)例銷毀之后調(diào)用萧豆,調(diào)用后奸披,所有的事件監(jiān)聽器會被移出,所有的子實(shí)例也會被銷毀炕横,該鉤子在服務(wù)器端渲染期間不被調(diào)用

六:vue react區(qū)別

相同點(diǎn)

1.都支持服務(wù)器端渲染
2.都有虛擬dom,組件化開發(fā),都有‘props’的概念,允許父組件往子組件傳送數(shù)據(jù),都實(shí)現(xiàn)webComponent規(guī)范
3.數(shù)據(jù)驅(qū)動(dòng)視圖
4.都有支持native的方案,React的React native,Vue的weex
5.構(gòu)建工具
React和Vue都有自己的構(gòu)建工具源内,你可以使用它快速搭建開發(fā)環(huán)境。React可以使用Create React App (CRA)份殿,而Vue對應(yīng)的則是vue-cli膜钓。都有管理狀態(tài),React有redux,Vue有自己的Vuex

區(qū)別

設(shè)計(jì)思想
react
1.函數(shù)式思想卿嘲,all in js ,jsx語法颂斜,js操控css
2.單項(xiàng)數(shù)據(jù)流
3.setState重新渲染
4.每當(dāng)應(yīng)用的狀態(tài)被改變時(shí),全部子組件都會重新渲染拾枣。當(dāng)然沃疮,這可以通過shouldComponentUpdate這個(gè)生命周期方法來進(jìn)行控制盒让,如果為true繼續(xù)渲染、false不渲染司蔬,但Vue將此視為默認(rèn)的優(yōu)化邑茄。
vue
1.響應(yīng)式思想,也就是基于數(shù)據(jù)可變的俊啼。把html肺缕、js、css授帕、組合到一起同木,也可以通過標(biāo)簽引擎組合到一個(gè)頁面中
2.雙向綁定,每一個(gè)屬性都需要建立watch監(jiān)聽(頁面不用跛十,涉及到組件更新的話需要)
3.Vue宣稱可以更快地計(jì)算出虛擬 DOM的差異彤路,這是由于它在渲染過程中,會跟蹤每一個(gè)組件的依賴關(guān)系芥映,不需要重新渲染整個(gè)組件樹
性能
react ----大型項(xiàng)目洲尊、優(yōu)化需要手動(dòng)去做,狀態(tài)可控
vue ------中小型項(xiàng)目屏轰、狀態(tài)改變需要watch監(jiān)聽颊郎,數(shù)據(jù)量太大的話會卡頓
擴(kuò)展性
react
1 類式寫法api少,更容易結(jié)合ts
2 可以通過高階組件來擴(kuò)展
vue
1 聲明式寫法霎苗,結(jié)合ts比較復(fù)雜
2 需要通過mixin方式來擴(kuò)展

七:vue路由守衛(wèi)

vue-router提供了導(dǎo)航鉤子:全局前置導(dǎo)航鉤子 beforeEach和全局后置導(dǎo)航鉤子 afterEach
導(dǎo)航鉤子3個(gè)參數(shù)(to,from,next):

  • to:將要進(jìn)入的路由對象
  • from:將要離開的路由對象
  • next:調(diào)用該方法后姆吭,才能進(jìn)入下一個(gè)鉤子函數(shù)(afterEach不接收next只有to/from)next函數(shù),決定是否展示你要看到的路由頁面
router.beforeEach(to,from,next){};
router.afterEach(to,from){}

組件內(nèi)的守衛(wèi)

到達(dá)這個(gè)組件時(shí):

beforeRouteEnter:(to,from,next)=>{
  console.log(this.數(shù)據(jù))//undefined 
   //因?yàn)樯芷谠颥F(xiàn)在data數(shù)據(jù)還未渲染唁盏,所以要用
  next(vm=>{
    consoel.log(this.數(shù)據(jù))//這里就可以得到data里的數(shù)據(jù)
  })
 }

離開這個(gè)組件時(shí):beforeRouteLeave:(to,from,next)=>{}
確認(rèn)離開next();取消離開next(false)内狸;

路由獨(dú)享的守衛(wèi)

beforeEnter:(to,from,next)=>{},用法與全局守衛(wèi)一致厘擂。只是昆淡,將其寫進(jìn)其中一個(gè)路由對象中,只在這個(gè)路由下起作用刽严。

八:vue的組件傳值

父子組件傳值

父傳子
// 父組件
<user-detail :myName="name" />
//子組件
<script>
export default{
  props:['myName'],
  data() {
    return {
      name : this.myName    // 把傳過來的值賦值給新的變量
    }
  },
  watch: {//偵聽器
    myName(newVal) {
      this.name = newVal //對父組件傳過來的值進(jìn)行監(jiān)聽昂灵,如果改變也對子組件內(nèi)部的值進(jìn)行改變
      //引用類型的值,當(dāng)在子組件中修改后舞萄,父組件的也會修改眨补,因其數(shù)據(jù)是公用的,其他同樣引用了該值的子組件也會跟著被修改倒脓〕怕荩可以理解成父組件傳遞給子組件的值,就相當(dāng)于復(fù)制了一個(gè)副本崎弃,這個(gè)副本的指針還是指向父組件中的那個(gè)甘晤,即共享同一個(gè)引用含潘。所以除非有特殊需要,否則不要輕易修改
    }
  },
  methods: {
    changeName() {  
      this.name = 'Lily'  // 這里修改的只是自己內(nèi)部的值线婚,就不會報(bào)錯(cuò)了
    },
  }
}
</script>
子傳父

方法一:
子組件綁定一個(gè)事件遏弱,通過 this.$emit() 來觸發(fā)
在子組件中綁定一個(gè)事件,并給這個(gè)事件定義一個(gè)函數(shù)

// 子組件
<button @click="changeParentName">點(diǎn)擊改變父組件的name</button>
<script>
export default {
    methods: {
        //子組件的事件
        changeParentName: function() {
            this.$emit('handleChange', 'aaa') // 觸發(fā)父組件中handleChange事件并傳參aaa
            // 注:此處事件名稱與父組件中綁定的事件名稱要一致
        }
    }
}
</script>

在父組件中定義并綁定 handleChange 事件

// 父組件
<child @handleChange="changeName"></child>
methods: {
    changeName(name) {  // name形參是子組件中傳入的值Jack
        this.name = name
    }
}

方法二:
通過 callback 函數(shù)
先在父組件中定義一個(gè)callback函數(shù)塞弊,并把 callback 函數(shù)傳過去

// 父組件
<child :callback="callback"></child>
methods: {
    callback: function(name) {
        this.name = name
    }
}

在子組件中接收腾窝,并執(zhí)行 callback 函數(shù)

// 子組件
<button @click="callback('aaa')">點(diǎn)擊改變父組件的name</button>
props: {
    callback: Function,
}

方法三:
通過$parent /$children 或 $refs訪問組件實(shí)例
這兩種都是直接得到組件實(shí)例,使用后可以直接調(diào)用組件的方法或訪問數(shù)據(jù)居砖。
這種方式的組件通信不能跨級

// 子組件
<script>
export default {
  data () {
    return {
      title: '子組件'
    }
  },
  methods: {
    sayHello () {
        console.log('Hello');
    }
  }
}
</script>
// 父組件
<template>
  <child ref="childRef" />
</template>
<script>
  export default {
    created () {
      // 通過 $ref 來訪問子組件
      console.log(this.$refs.childRef.title);  // 子組件
      this.$refs.childRef.sayHello(); // Hello
      
      // 通過 $children 來調(diào)用子組件的方法
      this.$children.sayHello(); // Hello 
    }
  }
</script>

方法四:
$attrs和$listeners

//父組件
<template>
   <child :name="name" :age="age" :infoObj="infoObj" @updateInfo="updateInfo" @delInfo="delInfo" />
</template>
<script>
    import Child from '../components/child.vue'
    export default {
        name: 'father',
        components: { Child },
        data () {
            return {
                name: 'Lily',
                age: 22,
                infoObj: {
                    from: '上海',
                    job: 'policeman',
                    hobby: ['reading', 'writing', 'skating']
                }
            }
        },
        methods: {
            updateInfo() {
                console.log('update info');
            },
            delInfo() {
                console.log('delete info');
            }
        }
    }
</script>
//子組件
<template>
    <grand-son :height="height" :weight="weight" @addInfo="addInfo" v-bind="$attrs" v-on="$listeners"  />
    // 通過 $listeners 將父作用域中的事件,傳入 grandSon 組件驴娃,使其可以獲取到 father 中的事件
</template>
<script>
    import GrandSon from '../components/grandSon.vue'
    export default {
        name: 'child',
        components: { GrandSon },
        props: ['name'],
        data() {
          return {
              height: '180cm',
              weight: '70kg'
          };
        },
        created() {
            console.log(this.$attrs); 
       // 結(jié)果:age, infoObj, 因?yàn)楦附M件共傳來name, age, infoObj三個(gè)值奏候,由于name被 props接收了,所以只有age, infoObj屬性
            console.log(this.$listeners); // updateInfo: f, delInfo: f
        },
        methods: {
            addInfo () {
                console.log('add info')
            }
        }
    }
</script>
//爺組件
<template>
    <div>
        {{ $attrs }} --- {{ $listeners }}
    <div>
</template>
<script>
    export default {
        ... ... 
        props: ['weight'],
        created() {
            console.log(this.$attrs); // age, infoObj, height 
            console.log(this.$listeners) // updateInfo: f, delInfo: f, addInfo: f
            this.$emit('updateInfo') // 可以觸發(fā) father 組件中的updateInfo函數(shù)
        }
    }
</script>
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末唇敞,一起剝皮案震驚了整個(gè)濱河市蔗草,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌疆柔,老刑警劉巖咒精,帶你破解...
    沈念sama閱讀 218,755評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異旷档,居然都是意外死亡模叙,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,305評論 3 395
  • 文/潘曉璐 我一進(jìn)店門鞋屈,熙熙樓的掌柜王于貴愁眉苦臉地迎上來范咨,“玉大人,你說我怎么就攤上這事厂庇∏。” “怎么了?”我有些...
    開封第一講書人閱讀 165,138評論 0 355
  • 文/不壞的土叔 我叫張陵权旷,是天一觀的道長。 經(jīng)常有香客問我拄氯,道長,這世上最難降的妖魔是什么熙含? 我笑而不...
    開封第一講書人閱讀 58,791評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮艇纺,結(jié)果婚禮上怎静,老公的妹妹穿的比我還像新娘邮弹。我一直安慰自己蚓聘,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,794評論 6 392
  • 文/花漫 我一把揭開白布夜牡。 她就那樣靜靜地躺著与纽,像睡著了一般。 火紅的嫁衣襯著肌膚如雪塘装。 梳的紋絲不亂的頭發(fā)上急迂,一...
    開封第一講書人閱讀 51,631評論 1 305
  • 那天蹦肴,我揣著相機(jī)與錄音,去河邊找鬼勺阐。 笑死,一個(gè)胖子當(dāng)著我的面吹牛渊抽,可吹牛的內(nèi)容都是我干的议忽。 我是一名探鬼主播懒闷,決...
    沈念sama閱讀 40,362評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼栈幸,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了侦镇?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,264評論 0 276
  • 序言:老撾萬榮一對情侶失蹤震捣,失蹤者是張志新(化名)和其女友劉穎闹炉,沒想到半個(gè)月后蒿赢,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體渣触,經(jīng)...
    沈念sama閱讀 45,724評論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,900評論 3 336
  • 正文 我和宋清朗相戀三年皂冰,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片秃流。...
    茶點(diǎn)故事閱讀 40,040評論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡舶胀,死狀恐怖概说,靈堂內(nèi)的尸體忽然破棺而出嚣伐,到底是詐尸還是另有隱情,我是刑警寧澤轩端,帶...
    沈念sama閱讀 35,742評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響骨田,放射性物質(zhì)發(fā)生泄漏耿导。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,364評論 3 330
  • 文/蒙蒙 一态贤、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧悠汽,春花似錦、人聲如沸茬高。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,944評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽宿饱。三九已至,卻和暖如春谬以,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背邮丰。 一陣腳步聲響...
    開封第一講書人閱讀 33,060評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留柠座,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,247評論 3 371
  • 正文 我出身青樓淮野,卻偏偏與公主長得像,于是被迫代替她去往敵國和親骤星。 傳聞我的和親對象是個(gè)殘疾皇子爆哑,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,979評論 2 355

推薦閱讀更多精彩內(nèi)容