uni-app 事件传值this.$emit和uni.$emit

2020-04-20  本文已影响0人  iOS乐乐

//test.vue组件

<template>
    <view>
        <text>我是test组件{{title}}</text>
        <button type="primary" @click="test">按钮传值回调</button>
        <button type="warn" @click="globleEvent">全局事件订阅</button>
        
    </view>
</template>

<script>
    export default {
        data() {
            return {                
            };
        },
        props:{
            title:'',
            
        },
        methods:{
            test(){
                console.log("组件中的按钮点击事件")
                //触发子视图中的该事件方法
                this.$emit("testShowName",{name:"lele"})
            },
            globleEvent(){
                //全局事件订阅只要注册的页面都可以收到回调值
                uni.$emit("globleEvent","我是全局事件订阅的传值")
            }           
        }
    }
</script>

<style lang="scss">

</style>

//使用test.vue组件
①首先要import导入组件
② components :{test} 注册组件
③组件使用的时候,可以自定义很多的属性,具体值设置在组件中的props属性对象中
④点击按钮触发方法逻辑流程如下
1)@click="test" 组件中触发该方法时间
2)事件方法中触发, 使用该组件自定义的方法this.$emit("testShowName",{name:"lele"}), 去页面中查找该绑定方法,里面有对应的绑定事件
3)接着会触发@testShowName="testEvent"中的testEvent方法
4)紧接着就可以完成整个事件的流程了
testEvent(rel){
console.log(rel)
}

<template>
    <view>
        
        <view class="father clearfix">
            
            <block class="" v-for="(item,index) in titleArr" :key="index">
                <view  class="childOne">
                    <image src="../../static/logo.png" mode="widthFix"></image>
                    <text style="align-items: center;">{{item}}</text>
                    
                </view>
            </block>

            
            
        </view>
        
        <view class="" style="height: 200rpx;">
            <test 
                :title="title"
                @testShowName="testEvent"
            ></test>
        </view>
        
        
    </view>
</template>

<script>
    import test from "@/components/test/test.vue" //引入组建
    export default {
        data() {
            return {
                titleArr:[
                    "1",
                    "2",
                    "3"
                ],
                title:'lele'
            };
        },
        onLoad() {
            //全局事件订阅,只要订阅了事件就可以收到值
            uni.$on("globleEvent",(rel)=>{
                console.log(rel)
            })
        },
        components:{  
            test  //注册组建
        },
        methods:{
            testEvent(rel){
                console.log(rel)
            }
        }
    }
</script>

<style lang="scss">
    *{
        margin: 0;
        padding: 0;
    }
    
    .clearfix:before,.clearfix:after{
        display: block;
        content: "";
    }
    .clearfix:after{
        clear: both;
    }
    
    .father{
        margin: 0rpx 20rpx 0rpx 20rpx;
    }
    
    .childOne{
        display: flex;
        float: left;
        height:200rpx;
        align-items: center;
        width: calc((100% - 120rpx)/2);
        box-shadow: #666 0rpx -1rpx 30rpx;
        margin-left: 40rpx;
        margin-bottom: 50rpx;
        image{      
            margin-left: 20rpx;
            width: 70rpx !important;
        }
        text{
            padding-left: 20rpx;
            flex: 1;
        }
    }
        
</style>

uni.$emit 这个是全局的事件订阅
只要在想要传值的页面onload方法中注册订阅事件,在需要传值的页面传值就可以收到回调

onload(){
      //全局事件订阅,只要订阅了事件就可以收到值
    uni.$on("globleEvent",(rel)=>{
        console.log(rel)
    })
}

触发全局事件订阅的方法为

//全局事件订阅只要注册的页面都可以收到回调值
uni.$emit("globleEvent","我是全局事件订阅的传值")
上一篇下一篇

猜你喜欢

热点阅读