emit的用法

emit: 子组件向父组件传值

JS用法

vm.$emit( eventName, […args] )
参数:

  • {string} eventName
  • [...args]
    触发当前实例上的事件。附加参数都会传给监听器回调。
<template>
  <div>
    <div>$emit子组件调用父组件的方法并传递数据</div>
    <h1>父组件数据:{{msg}}</h1>
    <emit-ch @updateInfo="updateInfo" :sendData="msg"></emit-ch>
  </div>
</template>
<script>
import emitCh from './$emitCh'
export default {
  name: 'emitFa',
  components: { emitCh },
  data () {
    return {
      msg: '北京'
    }
  },
  methods: {
    updateInfo (data) { // 点击子组件按钮时触发事件
      console.log(data)
      this.msg = data.city // 改变了父组件的值
    }
  }
}
</script>

<!-- ==================================================== -->
<template>
 <div class="train-city">
    <h3>父组件传给子组件的数据:{{sendData}}</h3>
    <br/><button @click='select()'>点击子组件</button>
  </div>

</template>

<script>
export default {
  name: 'emitCh', // 相当于一个全局 ID,可以不写,写了可以提供更好的调试信息
  props: ['sendData'], // 用来接收父组件传给子组件的数据
  data () {
    return {
    }
  },
  computed: {
  },
  methods: {
    select () {
      let data = {
        city: '杭州'
      }
      this.$emit('updateInfo', data)// select事件触发后,自动触发updateInfo事件
    }
  }
}
</script>

TS用法

@Emit

<template>
    <div class="container">
        <!-- value需要子组件@Prop定义,这里把驼峰化横线 -->
        <child-com :parent-value="msg"></child-com>
        <!-- 方法一: 驼峰转横线 -->
        <child-com @handle-to-parent1="handleChildValue"></child-com>
        <!-- 方法二: 驼峰转横线. 注意,这里是用test接收的 -->
        <child-com @test="handleChildValue"></child-com>
        <!-- 方法三: 驼峰转横线 -->
        <child-com @handle-to-parent3="handleChildValue"></child-com>
    </div>
</template>
 
<script lang="ts">
import { Component, Vue } from "vue-property-decorator";
import childCom from "路径";
 
@Component({
    components: {
        childCom    // 声明子组件
    }
})
export default class Parent extends Vue {
    private msg: string = "要传给子组件的值";
    
    private childValue: string = "";
 
    // 处理子组件传过来的值 val:是自定义的
    private handleChildValue(val: string) {
        // val: 子组件传过来的值
        this.childValue = val;
    }
}
</script>

<!-- ============================================== -->
<template>
    <div class="container">
        <!-- 方法一: 直接调用@Emit -->
        <button @click="handleToParent1">向父组件传值</button>
        <!-- 方法二: 直接调用@Emit -->
        <button @click="handleToParent2">向父组件传值</button>
        <!-- 方法三: 间接调用 -->
        <button @click="handleClickEvent">向父组件传值</button>
    </div>
</template>
 
<script lang="ts">
// 引入Emit
import { Component, Vue, Emit } from "vue-property-decorator";
 
@Component
export default class Child extends Vue {
    // 子组件向父组件传的值
    private msg: string = "要传递给父组件的值";
 
 
    // 方法一
    @Emit()    
    private handleToParent1() {
        return this.msg;    // return将要传递的值
    }
 
    // 方法二: 注意,这时父组件接收值时是用@Emit("test")括号中的test接收的,test会把正面的方法名字覆盖。(test)是自定义的
    @Emit("test")    
    private handleToParent2() {
        return this.msg;    // return将要传递的值
    }
 
    // 方法三
    // 先定义父组件接收的方法(同方法一、二)
    @Emit() 
    private handleToParent3() {
        return this.msg;    // return将要传递的值
    }
    private handleClickEvent() {
        // ... 一些其它的操作
        // 然后手动调用传值
        this.handleToParent3();
    }
}
</script>

谁不是孤身一人,翻山越岭
原文地址:https://www.cnblogs.com/hasz/p/14342521.html