Uni-App - uniapp事件处理、事件绑定、事件传参

uni-app 事件
事件映射表,左侧为 WEB 事件,右侧为 ``uni-app`` 对应事件

{
    click: 'tap',
    touchstart: 'touchstart',
    touchmove: 'touchmove',
    touchcancel: 'touchcancel',
    touchend: 'touchend',
    tap: 'tap',
    longtap: 'longtap',
    input: 'input',
    change: 'change',
    submit: 'submit',
    blur: 'blur',
    focus: 'focus',
    reset: 'reset',
    confirm: 'confirm',
    columnchange: 'columnchange',
    linechange: 'linechange',
    error: 'error',
    scrolltoupper: 'scrolltoupper',
    scrolltolower: 'scrolltolower',
    scroll: 'scroll'

}


在 input 和 textarea 中 change 事件会被转为 blur 事件。

踩坑注意:

上列表中没有的原生事件也可以使用,例如map组件的regionchange 事件直接在组件上写成 @regionchange,同时这个事件也非常特殊,它的 event type 有 begin 和 end 两个,导致我们无法在handleProxy 中区分到底是什么事件,所以你在监听此类事件的时候同时监听事件名和事件类型既 <map @regiοnchange="functionName" @end="functionName" @begin="functionName"><map>

平台差异所致,bind 和 catch 事件同时绑定时候,只会触发 bind ,catch 不会被触发,要避免踩坑。

事件修饰符


stop 的使用会阻止冒泡,但是同时绑定了一个非冒泡事件,会导致该元素上的 catchEventName 失效!

prevent 可以直接干掉,因为uni-app里没有什么默认事件,比如 submit 并不会跳转页面

self 没有可以判断的标识

once 也不能做,因为uni-app没有 removeEventListener, 虽然可以直接在 handleProxy 中处理,但非常的不优雅,违背了原意,暂不考虑

按键修饰符:uni-app运行在手机端,没有键盘事件,所以不支持按键修饰符。

事件绑定 @click

<template>
 <view class="demo" @click="clickTest" @longtap="longtap"></view>
</template>
<script>
export default {
 methods:{
  clickTest: function(e){
   console.log(e);
   console.log('click');
  },
  longtap: function(e){
   console.log(e);
   console.log('longtap');
  }
 }
}
</script>
<style>
.demo{width:500px; margin:50px auto; background:#8F8F90; height:500px;}
</style>


注意在小程序中观察对应事件对象,可以利用此对象获取更多信息。

事件传参(动态参数演示)

<template>
 <view>
   <view v-for="(item, index) in students" class="persons" @click="menuClick" v-bind:id="index">{{index}} - {{item.name}}</view>
 </view>
</template>
<script>
export default {
 data: {
  students : [
   {name : "张三", age : 18},
   {name : "李四", age : 20}
  ]
 },
 methods:{
 menuClick : function(e){
  console.log(e);
  console.log(e.target.id);
 }
 },
}
</script>
<style>
.persons{width:750px; line-height:2.2em;}
</style>


©著作权归作者所有:来自51CTO博客作者放羊的牧码的原创作品,请联系作者获取转载授权,否则将追究法律责任
Uni-App - 事件处理、事件绑定、事件传参
https://blog.51cto.com/u_10980859/5302856

<think>好的,我需要解决用户关于如何在uni-app中为uni-file-picker组件的@select方法传递参数的问题。首先,我应该回忆uni-file-picker的文档,了解它的@select事件默认传递的参数是什么。通常,这类事件会返回选中的文件信息,比如临时路径、文件名等。 接下来,用户的问题是如何在触发@select时传递额外的参数。比如,他们可能想根据不同的场景传递不同的标识符,比如上传类型(type1或type2),然后在处理函数中使用这些参数。这时候,我需要考虑如何在调用方法时绑定额外参数。 在Vue.js中,如果要在事件处理函数中传递自定义参数,通常有两种方法:使用箭头函数或者在模板中直接调用方法并传入参数。例如,@select="(e) => handleSelect(e, 'type1')" 或者使用bind方法,如@select="handleSelect.bind(this, 'type1')"。不过,在uni-app中,可能更推荐使用箭头函数的方式,因为bind有时可能导致上下文问题。 我需要验证这两种方法在uni-app中的可行性。根据引用中的示例代码,用户可能在methods中定义handleSelect方法,需要接收事件对象和额外参数。例如: methods: { handleSelect(files, type) { console.log(type, files); } } 然后在模板中绑定事件时传递参数: <uni-file-picker @select="(files) => handleSelect(files, 'type1')"></uni-file-picker> 这样,当@select事件触发时,会调用箭头函数,将files和'type1'传递给handleSelect方法。 另外,用户可能需要动态传递参数,比如根据循环中的项传递不同的值。例如,在v-for循环中,每个文件选择器需要传递不同的id。这时候,可以在模板中使用动态参数: <uni-file-picker v-for="item in list" :key="item.id" @select="(files) => handleSelect(files, item.id)"></uni-file-picker> 同时,需要确保在handleSelect方法中正确处理这些参数,比如上传文件时携带对应的id到服务器。 还需要注意,uni-file-picker的@select事件返回的参数可能是一个数组,包含选中的文件信息。因此,在箭头函数中需要正确传递这个数组以及自定义参数。 另外,查看用户提供的引用内容,特别是引用[3]中提到的uni.downloadFile和uni.saveFile的使用,可能需要在上传文件时结合传递的参数,比如将类型参数添加到请求中。例如,在handleSelect方法中,根据传入的type参数,构造不同的上传URL或表单数据。 总结步骤: 1. 在模板中使用箭头函数绑定@select事件,并传递自定义参数。 2. 在methods中定义处理函数,接收事件对象和额外参数。 3. 在处理函数中使用这些参数进行后续操作,如上传文件时携带参数。 需要检查是否有潜在的问题,比如事件对象是否正确传递,参数是否在作用域内可用。此外,确保在uni-app的环境下,这种写法不会导致编译错误或运行时问题。根据引用中的示例,用户可能已经熟悉在模板中使用方法和绑定事件,因此这种方法是可行的。 最后,提供示例代码,展示如何实现传递参数,并说明不同的应用场景,如动态绑定和静态参数传递,以及如何处理上传逻辑。同时,可以提醒用户注意事件参数的顺序和类型,确保正确处理文件数据和自定义参数。</think>在uni-app中为`uni-file-picker`组件的`@select`事件传递参数,可以通过**箭头函数绑定**或**动态参数绑定**实现。以下是具体实现方法及示例: --- ### 方法一:箭头函数绑定参数 在模板中通过箭头函数直接传递自定义参数,同时保留默认事件参数: ```html <template> <uni-file-picker @select="(files) => handleSelect(files, '自定义参数')" ></uni-file-picker> </template> <script> export default { methods: { handleSelect(files, customParam) { console.log('文件列表:', files); console.log('自定义参数:', customParam); // 输出:'自定义参数' // 上传逻辑(可结合参数) this.uploadFile(files.tempFilePaths[0], customParam); }, uploadFile(tempFilePath, type) { uni.uploadFile({ url: 'https://example.com/upload', filePath: tempFilePath, name: 'file', formData: { type: type }, // 将参数加入表单数据 success: (res) => { /* 处理成功逻辑 */ } }); } } } </script> ``` --- ### 方法二:动态参数绑定(如循环场景) 在`v-for`循环中动态传递不同参数: ```html <template> <div v-for="(item, index) in uploadList" :key="index"> <uni-file-picker @select="(files) => handleSelect(files, item.id)" ></uni-file-picker> </div> </template> <script> export default { data() { return { uploadList: [ { id: 'type1', label: '图片上传' }, { id: 'type2', label: '文档上传' } ] }; }, methods: { handleSelect(files, id) { console.log('当前上传类型ID:', id); // 根据id执行不同逻辑 } } } </script> ``` --- ### 关键点说明 1. **参数顺序**:`@select`默认返回文件对象`files`,需作为第一个参数传递,自定义参数紧随其后。 2. **参数类型**:支持字符串、数字、对象等任意类型。 3. **结合上传逻辑**:可在`handleSelect`中调用上传接口,将参数添加到请求体或URL中[^3]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值