一直以来习惯于直接用$("#xxx").on("click",function(){})来监听click事件或其他事件。作为小程序以及vue新手,用uni-app开发,该如何操作?

首先找uni-app官方文档或者售后群,官方助手已经说明,,用this.$refs这种方式是不行的。官方文档也没有明确说怎么整。搜索引擎也没满意的答案,如此情况,只能自己研究,先实现功能。

采用以下方法可以实现,利用$emit(个人觉得vue的作者应该参考了Qt的信号与槽)在子组件中定义,在父组件中接收(@xx=""的形式,例如@doGetWxPhoneNumber="doGetWxPhoneNumber")可以实现,代码示例如下:


/**
  * @author cure
  * @Date: 2021-4-28 22:45:30
  * @Description: 自定义组件文件: c-refbtn.vue
  * @FilePath:
  * @Email: contacteml@qq.com
  */
 
<template>
	<button class="loginAuth" lang="zh_CN" @click="$emit('handlerClickRefBtn')"  v-bind:open-type="openType" @getphonenumber="$emit('doGetWxPhoneNumber', $event, $data)">
		{{ refBtnMsg }}
	    <slot></slot>
	   </button>
</template>

<script>
	export default {
		data() {
			return {
				
			}
		},
		method: {
		},
		props: {
			refBtnMsg: {
				type: String,
				//非必填
				require: false
			},
			openType: {
				type: String,
				//必填
				require: true	
			}
		}
	}
</script>

<style scoped>
	.loginAuth {
		width: 80%;
		height: 50rpx;
		color: #FFFFFF;
		background-color: #015293;
		margin-top: 30rpx;
		font-size: 30rpx;
		text-align: center;
		line-height: 50rpx;
	}
</style>

 

在父组件中这样用:

// 部分代码如下:
<template>
			<checkbox-group @change="loginAuthAgreeChange">
	            <checkbox value ='0' :checked="argeeClick" class="loginAuth-agree text-margin-left"></checkbox>
				<label class="loginAuth-text">
					<view class="loginAuth-agree">我已认真阅读并同意</view>
					<navigator url="../doc/userAgreement" class="loginAuth-agree loginAuth-agree-label">《用户协议》</navigator>
				</label>
			</checkbox-group>
<view>
   <c-refbtn @tap="loginBind" @handlerClickRefBtn="handlerClickRefBtn" @doGetWxPhoneNumber="doGetWxPhoneNumber" :openType="openType" :argeeClick="argeeClick" :refBtnMsg="cRefBtnMsg" />
</view>
</template>

<script>
	export default {
		data() {
			return {
				cRefBtnMsg: "进行绑定",
				argeeClick: false,
				openType: ""
			}
		},
		onLoad(e) {
			var that = this;
		},
		methods: {
            handlerClickRefBtn: function(e) {},
	        loginAuthAgreeChange: function(e) {
				var that = this;
				this.argeeClick = this.argeeClick === true ? false : true;
				if (this.argeeClick) {
					this.openType = "getPhoneNumber";
					this.login().then(() => {
					}).catch(() => {
					    this.toast('服务器出小差啦');
					})
						
				} else {
					this.openType = "";
				}
			},
			loginBind: function(e) {
				var that = this;
				if (!that.argeeClick) {
					this.openType = "";
					uni.showModal({
						title: "注意",
						content: "如需进行绑定,请认真阅读相关协议并点击同意",
						// icon: "none",
						// duration: 2000
					});
				}
			}, 
            //自定义对应的实现函数
			doGetWxPhoneNumber(e) {
			    if (!this.argeeClick || 
                  e.detail.errMsg=="getPhoneNumber:fail user deny") {
			        return;
			    }
				this.getUserInfo().then(() => {
				})
			}
		}
	}
</script>

 

经验证,可以实现功能。

如果有更优的实现方式,请评论告知。

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐