vue實例從建立到銷燬的過程,就是生命週期。也就是從開始建立、初始化數據、編譯模板、掛載Dom->渲染、更新->渲染、卸載等一些列的過程。咱們稱這是vue的生命週期。vue
vue的生命週期中有多個事件鉤子,讓咱們在控制整個vue示例的過程時更容易造成好的邏輯。node
beforeCreate、created、beforeMount、mounted面試
mountedajax
加載渲染過程 父beforeCreate->父created->父beforeMount->子beforeCreate->子created->子beforeMount->子mounted->父mountedvuex
子組件更新過程 父beforeUpdate->子beforeUpdate->子updated->父updatednpm
父組件更新過程 父beforeUpdate->父updated數組
銷燬過程 父beforeDestroy->子beforeDestroy->子destroyed->父destroyedpromise
5中,分別是state、getter、mutation、action、module緩存
state
單一狀態樹。在state中須要定義咱們所須要管理的數組,對象,字符等,只有在這裏定義了,在vue的組件中才能獲取你定義的這個對象的狀態。(基本數據 )getter
相似vue的計算屬性,當咱們須要從store的state中派生出一些狀態,那麼咱們就須要使用getter,getter會接受state做爲第一個參數,並且getter的返回值會根據他的依賴被緩存起來,只有getter中的依賴值(state中的某個須要派生狀態的值)發生改變的時候纔會被從新計算。(從基本數據派生的數據 )mutation
更改store中state狀態的惟一方法就是提交mutation,每一個mutation都有一個字符串類型的事件類型和一個回調函數,咱們須要改變state的值就要在回調函數中改變。咱們要執行這個回調函數,那麼咱們須要執行一個相應的調用方法:store.commit。(提交更改數據的方法,同步! )action
action能夠提交mutation,在action中能夠執行store.commit,並且action中能夠有任何的異步操做。在頁面中若是咱們要調用這個action,則須要執行store.dispatch.( 像一個裝飾器,包裹mutations,使之能夠異步。 )module
其實只是解決了當state中很複雜臃腫的時候,module能夠將store分割成模塊,每一個模塊中擁有本身的state、mutation、action和getter。(模塊化Vuex)state,mutations,active,gettersbash
methods
key是給每個vnode的惟一id,能夠依靠key,更準確, 更快的拿到oldVnode中對應的vnode節點。
對於每一個迭代map, parseInt()傳遞兩個參數: 字符串和基數。 因此實際執行的的代碼是:
['1', '2', '3'].map((item, index) => {
return parseInt(item, index)
})
複製代碼
即返回的值分別爲:
複製代碼
事件循環中分爲宏任務隊列和微任務隊列。
console.log('script start') //1. 打印 script start
setTimeout(function(){
console.log('settimeout') // 4. 打印 settimeout
}) // 2. 調用 setTimeout 函數,並定義其完成後執行的回調函數
console.log('script end') //3. 打印 script start
// 輸出順序: script start -> script end -> settimeout
複製代碼
console.log('script start') // 1111111
let promise1 = new Promise(function (resolve) {
console.log('promise1') // 222222
resolve()
console.log('promise1 end') // 333333
}).then(function () {
console.log('promise2')
})
setTimeout(function(){
console.log('settimeout')
})
console.log('script end')
// 輸出順序: script start -> promise1 -> promise1 end -> script end-> promise2 -> settimeout
複製代碼
async function async1(){
console.log('async1 start');
await async2();
console.log('async1 end')
}
async function async2(){
console.log('async2')
}
console.log('script start');
async1();
console.log('script end')
// 輸出順序:script start -> async1 start -> async2 -> script end -> async1 end
複製代碼
已知以下數組: var arr = [ [1, 2, 2], [3, 4, 5, 5], [6, 7, 8, 9, [11, 12, [12, 13, [14] ] ] ], 10]; 編寫一個程序將數組扁平化去併除其中重複部分數據,最終獲得一個升序且不重複的數組
let newArr = [...new Set(arr.flat(Infinity)].sort((a,b)=>a-b)
複製代碼
promise構造函數是同步執行的,then方法是異步執行的
????
在ES5中,全局變量直接掛載到全局對象的屬性上,因此能在window上看到var聲明的變量 在ES6中,全局對象的屬性和全局變量脫鉤,可是爲了保持兼容性,舊的不變,因此var、function聲明的全局變量依然能夠在window對象上看到,而let、const聲明的全局變量在window對象上看不到
爲了保證數據的單向流動,便於對數據進行追蹤,避免數據混亂。
然而 props傳入的是對象的話 是能夠直接在子組件裏更改的, 由於是同一個引用 組件對於data的監聽是深度監聽 而對於props的監聽是淺度監聽
let arr = [3, 15, 8, 29, 102, 22]
arr.sort((a, b)=>{
return a-b
})
複製代碼
在嚴格模式下直接使用確實會有問題。 解決方案:
<input v-model="message" />
computed: {
message: {
set (value) {
this.$store.dispatch('updateMessage', value);
},
get () {
return this.$store.state.obj.message
}
}
}
mutations: {
UPDATE_MESSAGE (state, v) {
state.obj.message = v;
}
}
actions: {
update_message ({ commit }, v) {
commit('UPDATE_MESSAGE', v);
}
}
複製代碼
<div class="parent">
<div class="child"></div>
</div>
div.parent{
display:flex;
}
div.child{
margin:auto;
}
複製代碼
var nums1 = [1, 2, 2, 1], nums2 = [2, 2, 3, 4];
var newArr2 = nums1.filter((item) => {
return nums2.includes(item);
});
console.log(newArr2);
複製代碼
function processString (s) {
var arr = s.split('');
var new_arr = arr.map((item) => {
return item === item.toUpperCase() ? item.toLowerCase() : item.toUpperCase();
});
return new_arr.join('');
}
console.log(processString('AbC'));
複製代碼