Vue父组件和子组件间的方法调用
Vue父组件调用子组件方法
vue中如果父组件想调用子组件的方法,可以通过设置子组件的ref属性,然后通过this.$refs.ref.method调用,例如:
父组件:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18<template>
<div @click="fatherMethod">
<child ref="child"></child>
</div>
</template>
<script>
import child from '~/components/child.vue';
export default {
components: {
child
},
methods: {
fatherMethod() {
this.$refs.child.childMethods();
}
}
};
</script>
子组件:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17<template>
<div>{{name}}</div>
</template>
<script>
export default {
data() {
return {
name: '子组件'
};
},
methods: {
childMethods() {
console.log(this.name);
}
}
};
</script>
在父组件中, this.$refs.child 返回的是一个vue实例,可以直接调用这个实例的方法
子组件调用父组件方法
Vue中子组件调用父组件的方法,这里有三种方法提供参考
this.$parent.event
第一种方法是直接在子组件中通过this.$parent.event来调用父组件的方法
父组件:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18<template>
<div>
<child></child>
</div>
</template>
<script>
import child from '~/components/child';
export default {
components: {
child
},
methods: {
fatherMethod() {
console.log('父组件');
}
}
};
</script>
子组件:1
2
3
4
5
6
7
8
9
10
11
12
13
14<template>
<div>
<button @click="childMethod()">点击</button>
</div>
</template>
<script>
export default {
methods: {
childMethod() {
this.$parent.fatherMethod();
}
}
};
</script>
this.$emit(…)
第二种方法是在子组件里用$emit向父组件触发一个事件,父组件监听这个事件就行了。
父组件:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18<template>
<div>
<child @fatherMethod="fatherMethod"></child>
</div>
</template>
<script>
import child from '~/components/child';
export default {
components: {
child
},
methods: {
fatherMethod() {
console.log('测试');
}
}
};
</script>
子组件:1
2
3
4
5
6
7
8
9
10
11
12
13
14<template>
<div>
<button @click="childMethod()">点击</button>
</div>
</template>
<script>
export default {
methods: {
childMethod() {
this.$emit('fatherMethod');
}
}
};
</script>
方法传入子组件
第三种是父组件把方法传入子组件中,在子组件里直接调用这个方法
父组件:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18<template>
<div>
<child :fatherMethod="fatherMethod"></child>
</div>
</template>
<script>
import child from '~/components/child';
export default {
components: {
child
},
methods: {
fatherMethod() {
console.log('父组件');
}
}
};
</script>
子组件:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22<template>
<div>
<button @click="childMethod()">点击</button>
</div>
</template>
<script>
export default {
props: {
fatherMethod: {
type: Function,
default: null
}
},
methods: {
childMethod() {
if (this.fatherMethod) {
this.fatherMethod();
}
}
}
};
</script>
三种都可以实现子组件调用父组件的方法,但是效率有所不同,根据实际需求选择合适的方法。