RangeError: Maximum call stack size exceeded
javascript
通常vue-router報錯說明是路由配置出問題了,或者跳轉調用路由的時候出現死循環,RangeError: Maximum call stack size exceeded
是死循環出現的語句,這種狀況先檢查組件中是否有重名調用,若是有應從新考慮組件命名。css
Computed property "XXX" was assigned to but it has no setter
html
形成這種問題的根源在於XXX
屬性在vue表單中,使用v-model
進行雙向綁定且須要在computed
中進行計算更新時,須要保證XXX
屬性具備setter
方法才能計算。 下面以個人store
做爲示例:vue
// store.js
const app = {
state: {
praiseCheckStatus: false,
},
mutations: {
SETPRAISECHECKSTATUS(state, data) {
state.praiseCheckStatus = data;
},
},
actions: {
setPraiseCheckStatus({commit}, data) {
commit('SETPRAISECHECKSTATUS', data);
},
},
};
export default app;
複製代碼
computed: {
praiseCheckStatus: {
get () {
return this.$store.state.app.praiseCheckStatus;
},
set (newValue) {
this.$store.dispatch('setPraiseCheckStatus', newValue);
}
}
}
複製代碼
// store.js
const app = {
state: {
praiseCheckStatus: { checked: false },
},
mutations: {
SETPRAISECHECKSTATUS(state, data) {
state.praiseCheckStatus.checked = data;
},
},
actions: {
setPraiseCheckStatus({commit}, data) {
commit('SETPRAISECHECKSTATUS', data);
},
},
};
export default app;
複製代碼
computed: {
...mapState({
praiseChecked: state => state.app.praiseCheckStatus
})
},
methods: {
praiseCheckboxChange(e) {
this.$store.dispatch('setPraiseCheckStatus', e.target.checked);
},
}
複製代碼
這樣須要在表單中v-model="praiseChecked.cheked"
便可,實際上是利用Object對象自帶get、set方法,因此沒有直接對計算屬性進行計算,而是對該計算屬性對象的某個屬性值進行賦值。java
還有另外的錯誤狀況,好比:webpack
computed: {
...mapState({
list: state => state.app.list
}),
},
methods: {
delete() {
....... // 執行過程
this.$store.dispatch('setPostCommentList', this.list);
}
}
複製代碼
因爲computed
計算結果屬性會映射到當前vue
組件的data
數據源中,因此咱們能夠直接this.list
來使用這個計算後的屬性,但上面這種狀況是咱們把this.list
處理改變了this.list
原有數據後直接塞回store
中的行爲會報這個錯誤,由於vuex的stroe中的數據是隻讀的,想要改變store
中的數據須要經過dispatch或commit
來觸發改變,因此不能在組件中直接操做store
中的數據並從新dispatch或commit
,須要用一個新的數據副原本進行dispatch或commit
web
methods: {
delete() {
....... // 執行過程
// 執行刪除僞代碼,這裏的刪除依然不能改變this.list的原有數據結構
// newList是一個全新的數組
const newList = this.list.delete();
this.$store.dispatch('setPostCommentList', newList);
}
}
複製代碼
[Vue warn]: Avoid mutating a prop directly since the value will be overwritten whenever the parent component re-renders. Instead, use a data or computed property based on the prop's value. Prop being mutated: "XXX"
vue-router
形成這個問題的緣由是vue中不容許直接操做經過props
傳過來的數據。 解決辦法很簡單,在data
中建立一個副本YYY
變量,初始值爲props
屬性XXX
的值,同時在組件內全部須要調用props
的地方調用這個data
對象YYY
,副本變量發生變化後,經過this.$emit()
方法告訴父組件XXX
須要發生變化,父組件中將數據處理後再經過props
從新傳遞給子組件。vuex
Refused to apply style from 'xxx.css' because its MIME type ('text/html') is not a supported stylesheet MIME type, and strict MIME checking is enabled.
數組
緣由:webpack打包路徑配置的不對,修改便可