Javascript vuejs中的Array.prototype.splice和arr.splice有什么区别?
代码:(vue2.0,vue路由器)Javascript vuejs中的Array.prototype.splice和arr.splice有什么区别?,javascript,vue.js,vuejs2,Javascript,Vue.js,Vuejs2,代码:(vue2.0,vue路由器) <template> <a v-for="apiItem in allApis" href="#"></a> </template> <script> computed: mapGetters([ 'allApis' ]), </script> 行A将更改allApis并更新视图 但是行B不会更改allApi并更新视图 是的,state.api.splice(0,1)
<template>
<a v-for="apiItem in allApis" href="#"></a>
</template>
<script>
computed: mapGetters([
'allApis'
]),
</script>
行A
将更改allApis
并更新视图
但是
行B
不会更改allApi
并更新视图 是的,state.api.splice(0,1)
将起作用,因为Vue拦截变异方法并发出事件,您可以在中看到这一点
正如您在源代码中看到的:arrayMethods
是原始的数组原型方法,它们被覆盖以提供vue的反应功能,因此使用Array.prototype
会忽略vue定义的行为
从:
Vue包装了观察到的阵列的变异方法,因此它们也将触发视图更新
您是对的,但不管您是否意识到,您缺少了一个要点,即在您引用的源代码中,
export const arrayMethods=Object.create(arrayProto)
正在为数组创建一个新的原型,因此使用Array.prototype
会忽略vue定义的行为。@PanJunjie潘俊杰 是的,这就是我在这里要指出的,你可以通过这些函数获得额外的功能,而这些函数在数组中没有。prototype
,可能我在这个答案中不是很清楚,会显式地添加它。
const mutations {
myMutation(state) {
state.apis.splice(0, 1) // A
//Array.prototype.splice.call(state.apis, 0, 1); //B
}
}
const getter = {
allApis: (state) => {
return state.apis
}
}
export default {
state,
getters,
actions,
mutations
}
const arrayProto = Array.prototype
export const arrayMethods = Object.create(arrayProto)
/**
* Intercept mutating methods and emit events
*/
;[
'push',
'pop',
'shift',
'unshift',
'splice',
'sort',
'reverse'
]
.forEach(function (method) {
// cache original method
const original = arrayProto[method]