vue2中props的type为Function时,default 中使用this为null

vue2中props的type为Function时,default 中使用this为null

父组件

<template>

<div>

<el-row>

<Tree/>

</el-row>

<el-row>

<Tree :handleNodeClick="handleNodeClick" />

</el-row>

</div>

<script>

import Tree from './Tree'

export default {

components: {

Tree

},

methods: {

handleNodeClick(data) {

console.log('父组件', data, 'this', this);

}

},

}

</script>

子组件

<template>

<div >

<el-tree :data="data" :props="defaultProps" @node-click="handleNodeClick"></el-tree>

</div>

</template>

<script>

export default {

props: {

handleNodeClick: {

type: Function,

default (data) {

// this为空

console.log('子组件', data, 'this', this)

}

}

}

}

</script>

上面的代码 在父组件不传handleNodeClick时,想要子组件使用default函数,但是访问不到this 要怎么办?


回答:

发现有些场景下this是本组件实例,有些场景下this为null,调试后发现不行的场景是vue主动绑定this 为 null,下面是 vue2.6.11 版本构建的 vue.esm.js

function createFnInvoker (fns, vm) {

function invoker () {

var arguments$1 = arguments;

var fns = invoker.fns;

if (Array.isArray(fns)) {

var cloned = fns.slice();

for (var i = 0; i < cloned.length; i++) {

invokeWithErrorHandling(cloned[i], null, arguments$1, vm, "v-on handler");

}

} else {

// return handler return value for single handlers

return invokeWithErrorHandling(fns, null, arguments, vm, "v-on handler")

}

}

invoker.fns = fns;

return invoker

}

function invokeWithErrorHandling (

handler,

context,

args,

vm,

info

) {

var res;

try {

// 就是这行

res = args ? handler.apply(context, args) : handler.call(context);

if (res && !res._isVue && isPromise(res) && !res._handled) {

res.catch(function (e) { return handleError(e, vm, info + " (Promise/async)"); });

// issue #9511

// avoid catch triggering multiple times when nested calls

res._handled = true;

}

} catch (e) {

handleError(e, vm, info);

}

return res

}

解决方法是在子组件中手动bind一次

<template>

<div >

<el-tree :data="data" :props="defaultProps" @node-click="handleNodeClick"></el-tree>

</div>

</template>

<script>

export default {

props: {

propsHandleNodeClick: {

type: Function,

default (data) {

console.log('子组件', data, 'this', this)

}

}

},

methods: {

handleNodeClick (...rest) {

// 根据函数的 name 属性来判断 父组件有没有传入方法,因为这里用了'default' 所以 函数名里不能有 'default'

if (this.propsHandleNodeClick.name.indexOf('default') > -1) {

this.handleNodeClick = this.propsHandleNodeClick.bind(this)

} else {

// 如果父组件有传入方法,基本上this的指向是父组件实例 不需要改变this

this.handleNodeClick = this.propsHandleNodeClick

}

this.handleNodeClick(...rest)

}

}

}

</script>

以上是 vue2中props的type为Function时,default 中使用this为null 的全部内容, 来源链接: utcz.com/p/936498.html

回到顶部