vue 中級基礎考察面試題


vue 生命周期有哪些
 beforeCreate
 created
 beforeMount
 mounted
 beforeUpdate
 updated
 activated
 deactivated
 beforeDestroy
 destroyed
 errorCaptured
初始化請求數據在那個生命鈎子里
// 最好放到 created 鈎子里,在頁面沒有渲染之前
mounted
// mounted 鈎子,是在dom 渲染完成后調用的鈎子,當需要dom 加載完成后執行的操作,需要放到 該鈎子函數中
activated deactivated
// 重復進出緩存組件的同時,需要做一下操作時很有用
activated 激活該組件時調用,初次進入也是調用,只要激活該組件
deactivated 組件失活時調用
父子組件渲染過程
----父子組件加載過程----
//父beforeCreate => 父created => beforeMount => 子 beforeCreate => 子created => 子beforeMounted => 子mounted => 父mounted
----父子組件更新過程----
// 父beforeUpdate => 子 beforeUpdate => 子updated => 父updated
----父子組件銷毀過程----
// 父beforeDestroy => 子beforeDestroy => 子destroyed => 父destroyed
父組件怎么監聽子組件的生命周期(兩種方法)
方法一
// 自定義事件,當觸發子組件對應的生命鈎子函數時,通過$emit 通知父組件
-----------------------父組件-----------------
<template>
    <div>
        <child @gouzi="gouzi"></child>
    </div>
</template>
<script>
import child from './child.vue'
export default {
    name:'parent',
    components:{
        child
    },
    methods:{
        gouzi(val) {
            console.log(val)
        }
    }

}
---------子組件-----
<template>
    <div>
         <el-button @click="add">增加金額</el-button>
    </div>
</template>
<script>
export default {
    name:'child',
    mounted() {
        this.$emit('gouzi','子組件的mounted 鈎子')
    }
}
</script>
方法二
// 通過 hook 方法監聽子組件的鈎子函數,以監聽子組件 mounted 鈎子為例
-----------------------父組件-----------------
<template>
    <div>
        <child @hook:mounted="doCallback"></child>
    </div>
</template>
<script>
import child from './child.vue'
export default {
    name:'parent',
    components:{
        child
    },
    methods:{
        doCallback() {
            console.log('監聽子組件 鈎子函數 的回調')
        }
    }

}
---------子組件-----
<template>
    <div>
       子組件
    </div>
</template>
<script>
export default {
    name:'child',
    mounted() {
       console.log('子組件 mounted 鈎子')
    }
}
// 子組件 mounted 鈎子
// 監聽子組件 鈎子函數 的回調
</script>
vue 常用的指令
 v-if
 v-show
 v-model
 v-on
 v-bind
 v-for
 v-slot
v-if v-show 的區別
 兩者都是有隱藏的功能,區別如下
 v-if 是dom元素的插入和刪除
 v-show 是dom元素的顯示和隱藏,操作的css樣式 display:none/block
vue 父子組件傳值的方法有幾種
父子組件傳值
1,父組件通過 prop 傳值,子組件通過 $emit 向父組件 傳值
2,通過v-model value input 傳值(看下面示例)
3,通過 update sync 進行傳值(看下面示例)
4,通過事件總線eveBus
5,直接操作子組件的數據 子組件通過$parent 向父組件傳值
6, vuex
// 通過v-model 進行父子組件之間的傳值
// v-model 就是一個語法糖 父組件通過默認屬性 value傳值,子組件通過默認事件 input 向父組件傳值
-----------------------父組件-----------------
<template>
    <div>
        <model v-model="price"></model>
    </div>
</template>
<script>
import model from './model.vue'
export default {
    name:'parent',
    components:{
        model
    }
}
---------子組件-----
<template>
    <div>
         <el-button @click="add">增加金額</el-button>
    </div>
</template>
<script>
export default {
    name:'child',
    props: ['value'], // 接受值 value
    methods: {
        add() {
          this.$emit('input', '我是子組件傳的值')  // 通過默認時間 input 向父組件傳值
        }
    }
}
</script>
// sync update 配合使用
<template>
    <div>
       <atest :dialogVisible.sync="dialogVisible"></atest>
       <button @click="open">顯示 彈框 {{ dialogVisible }}</button>
    </div>
</template>
<script>
import atest from './atest.vue'
export default {
    name:'parent',
    components:{
        atest
    },
    data(){
        return{
           dialogVisible: false
        }
    },
    methods: {
        open () {
          this.dialogVisible = !this.dialogVisible
        }
    }
}
------子組件----
<template>
    <div>
      <span v-if='dialogVisible'>
        <el-button @click="close">取 消</el-button>
      </span>
    </div>
</template>
<script>
export default {
    name:'child',
    props: ['dialogVisible'],
    methods: {
        close() {
             this.$emit('update:dialogVisible', false)
        }
    }
}
</script>
vue 組件跨代傳值(爺孫組件及更深層組件)的方法
1. $attr $listeners(看示例)
2, provide/inject。(看示例)
3,通過事件總線eveBus
4,直接操作子組件的數據 子組件通過$parent 向父組件傳值
5, vuex
$attr $listeners 組件跨代傳值
// 父組件
<template>
    <div>
        <child :price="price" :from='from' :num='num' @upRocket="reciveRocket"></child>
    </div>
</template>
<script>
import child from './child.vue'
export default {
    name:'parent',
    components:{
        model
    },
    data() {
        return {
           // child 組件接受的參數
            from:{
                name:'wg',
                age:18
            },
            price:200,
            num:2
        }
    },
    methods:{
       // 要傳遞的函數
       reciveRocket () {
            console.log("reciveRocket success")
       }
    }
}
// 子組件
<template>
  <div class="a">
    <div>子組件</div>
    <grandson :pageNum='pageNum' :pageSize='pageSize' v-bind="$attrs" v-on="$listeners"></grandson>
  </div>
</template>
<script>

import grandson from './grandson.vue'


export default {
  name: 'child',
  props: ['from'], // 通過props 接受一個from
  components: {
    grandson
  },
  data () {
    return {
        pageNum:1,
        pageSize:10
    }
  },
  mounted() {
    console.log(this.$attr,'attr')  
    console.log(this.$listeners,'listeners')
    // price num 'attr'   (父組件傳進來 from price num, 子組件通過props 接受了 from, $attr 就剩下 price num)
    // upRocket  'listeners'  父組件定義的函數
  },
  methods: {

  }
}
</script>
// 孫子組件
<template>
  <div class="grandson">
    <div>孫子組件</div>
    <button></button>
  </div>
</template>
<script>

export default {
  name: 'grandson',
  components: {
    grandson
  },
  data () {
    return {
    }
  },
  mounted() {
    console.log(this.$attr,'attr')  
    console.log(this.$listeners,'listeners')
    // pageNum pageSize price num  'attr'  => attr 接受除props 接受的外的 所有屬性
    // upRocket  'listeners'  接受父組件綁定的函數,(父組件直接綁定的爺組件定義的函數)
  },
  methods: {

  }
}
</script>
如果跨代很多,$attr $listeners就會有點太繁瑣,可以考慮 provide/inject
父組件通過 provide傳值, 子組件 通過 inject 接受值,不過不是響應式的,具體參考官網(詳細)點擊這里
// 父級組件提供 'foo'
var Provider = {
  provide: {
    foo: 'bar'
  },
  // ...
}

// 子組件注入 'foo'
var Child = {
  inject: ['foo'],
  created () {
    console.log(this.foo) // => "bar"
  }
  // ...
}
兄弟組件傳值
  // 1,eventBus
  // 2,vuex
  // 實際開發中,更傾向於子組件通過$emit 觸發父組件函數,父組件再改變值傳給 兄弟組件
watch computed 有什么區別
1. 當一個對象改變需要做一些邏輯處理或者開銷比較大的時候,考慮使用watch
2. 當多個變量都會對某一個產品影響時,考慮使用 computed
$set 什么用途
// vue2.0 中,數據視圖響應式是根據 Object.defineProperty 劫持屬性的getter和setter 結合發布訂閱者模式實現的,新加的屬性實現響應,要用$set 對該屬性進項劫持才能實現響應式
怎么緩存組件或者頁面
// 用keep-alive,進行緩存,(不需要重新創建卸載 => 緩存) 
路由有哪幾種模式
// 瀏覽器端 hash 模式 history模式, 服務端 Abstract 模式,主要介紹瀏覽器端
// hash 變現為 url路徑有#,原理是 通過監聽 hashChange 進行路由的轉換
// history 是Html5 新加的 History模式,原理是通過監聽 pushState popState replaceState 進行路由的轉換
路由傳參有那些方式 三種方法
// 動態路由 路由表中配置占位符
   {
     path: '/list/:id',
     name: 'list',
     component:list
   }
// 通過 push 跳轉
  this.$router.push({
    path: `/particulars/${id}`,
  })
// 通過 this.$route.params.id 取參
// path 方法傳參
        this.$router.push({
          path: '/list',
          query: {
            name: 'wg'
          }
        })
// 通過 this.$route.query.name 取參
// name 方法傳參
       this.$router.push({
          name: 'list',
          params: {
            age: '18'
          }
        })
// 通過 this.$route.params.age 取參
路由懶加載有幾種 兩種 require import
// require 方式
    {
      path: '/about',
      name: 'About',
      component: resolve => require(['../pages/About.vue'], resolve)
    }
// import 方式
  {
    path: '/HelloWorld',
    name: 'HelloWorld',
    component: () => import("@/components/HelloWorld") // @ 通過webpack 配置,默認 指向src 文件
  }
vuex 有那幾個模塊組成
// state   定義變量
// getters   派生狀態 類似於計算屬性
// mutations 改變 store 中的狀態
// actions  主要操作異步操作,在組件中通過 this.$store.dispatch('xxx') 去觸發actions方法
// modules  把store 分為細小的模塊,應用於復雜的模塊
mutations 和 actions 的區別
// mutations 主要用於同步操作 store.commit('xxx') 觸發
// actions 主要用於異步操作 store.dispatch('xxx') 觸發actions, actions 在通過觸發 mutations 更改 state狀態 
怎么解決 vuex 刷新數據丟失的問題
// 把數據存到 sessionStorage中,當頁面刷新時 store的初始值 從 sessionStorage中取
// 其關鍵點在於 把store的值什么時候存到 sessionStorage中,建議是 當頁面刷新之前,可以再入口app.vue組件created鈎子中 添加監聽 beforeunload 進行處理賦值

最后一個 vue2.0 中 雙向綁定的原理 (基礎版)
// vue通過 Object.defineProperty 劫持data中各個屬性的getter和setter,結合發布訂閱者模式 進行數據和視圖的響應


免責聲明!

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



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