父组件代码(index.vue)
我们可以这样理解谁是父组件在哪引用谁就是父组件一般index是最大的父组件
需求:
现在想从dialog中间组件调用aMap里面的方法
<template>
<div class="map-container">
<div class="map-wrapper">
<Map ref="line" />
</div>
<Dialog @wire="wire"/>
</div>
</template>
<script>
import Map from './aMap'
import Dialog from './dialog'
import $ from 'jquery'
export default {
components: {
'Map': Map,
'Dialog': Dialog
},
data () {
return {}
},
methods: {
wire(val) {
this.getWire(val)
},
getWire(val) {
this.$refs.line.drawPolyline(val)
}
}
}
</script>
<style lang="scss" scoped>
.map-wrapper{
width: 100%;
height: 100%;
position: absolute;
}
</style>
我们可以看代码,index组件中没有做什么功能,而我们只是引用了其他的组件,我个人觉得这样细分模块后期更好维护
ref="line"作用是什么?
@wire="wire"作用是什么?
this.$refs.line.drawPolyline(val)作用是什么?
各位是不是有这几个问题想问?作用是什么?我来解释一下。
ref:被用来给DOM元素或子组件注册引用信息。引用信息会根据父组件的$refs 对象进行注册。如果在普通的DOM元素上使用,引用信息就是元素; 如果用在子组件上,引用信息就是组件实例,比如呢,我想关联到子组件,我们可以在实例的组件上加上ref="line"这个对西,我们就能调用实例的组件里面的方法了<Map ref="line" />
@wire="wire":用来绑定中间组件dialog.vue的这样我就能在中间组件dialog.vue点击按钮就能触发子组件aMap.vue里的方法了
this.$refs.line.drawPolyline(val):可以让父组件触发子组件里的方法
中间组件代码(dialog.vue)
<template>
<div>
<el-button type="primary" size="mini" @click="foundLine($event)">{{this.btnText}}</el-button>
</div>
</template>
<script>
export default {
data() {
return {
btnText: '开始创建'
}
},
created() {
},
mounted() {
},
methods: {
foundLine(val) {
this.$emit('wire', val)
}
</script>
<style lang="scss" scoped>
</style>
this.$emit作用?
子组件可以使用 $emit 触发父组件的自定义事件。点击按钮后触发foundLine方法,方法里面在触发当前实例上的wire事件
子组件代码(aMap.vue)
在index中引用的都是子组件
<template>
<div class="aMap">
<el-amap
vid="amapPro"
:amap-manager="amapManager"
:map-style="mapStyle"
:zoom="zoom"
:center="center"
:events="events"
:resize-enable="resizeEnable"
/>
</div>
</template>
<script>
export default {
data () {
return {
},
mounted() {
},
components:{
},
methods: {
drawPolyline(e) {
const _this = this
const map = this.amapManager.getMap()
this.mouseTool = new AMap.MouseTool(map)
if (this.falg){
this.mouseTool.polyline({
strokeColor: "#3366FF",
strokeOpacity: 1,
strokeWeight: 6,
strokeStyle: "solid",
})
this.polylineList = []
AMap.event.addListener(this.mouseTool,'draw',function (e) {
_this.polylineList.push(e.obj)
console.log("绘制的线", _this.polylineList)
})
console.log(e)
this.falg = false
} else {
this.closeDrawPolygon()
this.mouseTool.close()
this.opnePolygon()
this.falg = true
}
}
}
</script>
<style lang="scss">
</style>
drawPolyline()是我们要触发的方法
总结
- (dialog.vue里)第一我们点击按钮后会触发foundLine()方法,然后通过this.$emit(‘wire’, val)调用父组件里面的wire方法
- 在index.vue 组件中注册dialog、Map组件然后在实例两个组件,在实例组件<dialog@wire=“wire”/>上加上dialog.vue里面的方法里面写的wire因为这样才能和实例组件关联起来,然后在methods写一个wire()方法调用getWire()方法,方法里写了触发子组件的this.$refs.line.drawPolyline(val)事件,通过这些操作就能在中间组件跨父组件触发子组件里的方法了
本文地址:https://blog.csdn.net/m0_46623639/article/details/111936960