14-emit子向父传值

80 阅读1分钟

[]

新建一个全局组件myevent,写一个输入框,通过输入框自带的input事件,写一个方法,获取到输入框里的内容

<template>
  <view>
    {{title}}
    <view class="">
      <input type="text" placeholder="请输入..." @input="oninput">
    </view>
  </view>
</template>

<script>
  export default {
    name:"myevent",
    props: {
      title: {
        type: String,
        default: "默认标题"
      }
    },
    data() {
      return {
        
      };
    },
    methods:{
      oninput(e){
        console.log(e.detail.value);
      }
    }
  }
</script>

<style lang="scss">

</style>

@input是uniapp的输入框自带方法,给他绑定一个方法,用于获取用户输入

image.png

通过$emit方法向父组件传值

通过$emit方法在公共组件自定义一个事件,这个事件用起来就和写系统提供的方法是一样的,在事件名前面加一个@符号即可,不同的是,自定义事件只能在自定义组件的标签中使用,在vue的标签中是不能用的

<template>
  <view>
    {{title}}
    <view class="">
      <input type="text" placeholder="请输入..." @input="oninput">
    </view>
  </view>
</template>

<script>
  export default {
    name:"myevent",
    props: {
      title: {
        type: String,
        default: "默认标题"
      }
    },
    data() {
      return {
        
      };
    },
    methods:{
      oninput(e){
        console.log(e.detail.value);
        // myenv就是自定义的事件名 onclick等就是系统提供的事件
        // 第二个参数就是这个事件的值,这里暂时写死
            // 只要这个自定义事件被触发,就会获取到这个事件的返回值123
        this.$emit("myenv",123)
      }
    }
  }
</script>

<style lang="scss">

</style>

oninput就是通过系统自带的@input方法获取用户输入,然后把值传递给下面定义的方法,onimput就是形参,下面定义的方法中的e就是接收的实参,这里是写死的123,把123换成e.detail.value,就是实际用户输入的数据了


在父组件中使用自定义方法:

本质就是在父组件中定义一个方法,然后通过一个自定义事件名把这个方法传递到子组件,子组件通过$emit接收到这个方法之后,把值给他,这样父组件就能通过这个方法接收到子组件传过来的值

@myenv = "onmyenv"@后面是在emit中自定义的方法名,onmyenv是在父组件这里定义的方法名,在methods中打印这个方法,会看到两个结果

<template>
  <view>
    <pubTitle :title = "title" subtitle="about page"></pubTitle>
    <view class="">about页面</view>
    <navigator url="../index/index" open-type="redirect">回到首页</navigator>
    <navigator url="../list/list" open-type="redirect">回到列表页</navigator>
    <myevent title="组件间传值" @myenv = "onmyenv"></myevent>
  </view>
</template>

<script>
  export default {
    data() {
      return {
        title: "关于我们页面"
      };
    },
    methods:{
      onmyenv(e){
        console.log(e);
      }
    }
  }
</script>

<style lang="scss">

</style>

在关于页面的输入框里输入rr,会返回rr和123,rr就是父组件这里定义的方法获取到的值,而123就是自定义组件中返回的值 image.png

把自定义组件的方法中获取值的代码改成真正的获取用户输入,detail.value是vue这个顶级对象下自带的属性

    methods:{
      oninput(e){
        // 打印用户输入的值
        // console.log(e.detail.value);
        // myenv就是自定义的事件名 onclick等就是系统提供的事件
        // 第二个参数就是这个事件的值,这里暂时写死
        // 只要触发这个自定义事件,就会获取到这个自定义的值123
        this.$emit("myenv",e.detail.value)
      }
    }

在输入框中输入结果后,确实拿到了用户输入,看后面的数据来源,就是父组件about.vue,如果console没有注释掉的话,会同时打印两个一样的值,但是console那一行打印出来的值会显示来自子组件,而不是父组件:

image.png

子组件中的这个方法传值还可以传对象,例如获取用户输入和时间戳:

    methods:{
      oninput(e){
        // 打印用户输入的值
        // console.log(e.detail.value);
        // myenv就是自定义的事件名 onclick等就是系统提供的事件
        // 第二个参数就是这个事件的值,这里暂时写死
        // 只要触发这个自定义事件,就会获取到这个自定义的值123
        this.$emit("myenv",{value:e.detail.value,time:Date.now()})
      }
    }

这两个在子组件中的值,传递到了父组件 image.png