iview批量上传on-success只触发一次

在使用iview进行批量文件上传时遇到问题,虽然before-upload多次触发,但on-success只触发一次,导致只能显示第一个上传文件。进一步排查发现,uploadVue.post中的uploadVue.clearFiles()在多选时影响了上传,通过设置变量避免多选时执行此清除操作,解决了问题。

如下面代码,多选时,多个文件只显示了第一个上传的。before-upload 会触发多次,但是on-success只触发了一次。上传完成的打印也有多次的。证明多个文件已经上传成功了

 <Upload
                ref="upload"
                type="drag"
                :show-upload-list="showUploadList"
                :format="format"
                multiple
                :before-upload="onBeforeUpload"
                :on-success="onSuccessHandler"
                :on-error="onErrorHandler"
                :max-size="maxSize"
                action="/">
           <div v-for="item in fileList">xxxx</div>
        </Upload>
onBeforeUpload(file) {
	//xxxxxxxxx 处理逻辑;
	return beforeCosUpload(this, file, beforeCheck)
}

onSuccessHandler(response, file) {
        console.info('上传成功', response, file)
        this.fileList.push( {
        	// xxxxxxxxx
        })
      },
      
function beforeCosUpload(self, file, beforeCheck) {
  let uploadVue = self.$refs.upload
  uploadVue.post = function (file) {
     uploadVue.clearFiles() 
    uploadVue.handleStart(file)
    // xxxxxxxxxxxxx
      onProgress(progressData) {
        progressData.percent = progressData.percent * 100
        uploadVue.handleProgress(progressData, file)
      },
      onSuccess(data) {
        // console.info('上传完成`', data) // 在此处有都会触发多次
        uploadVue.handleSuccess(data, file)
      },
      onError(err, data) {
      }
    }

    let result = cosUpload(obj)
  }
  return new Promise((resolve, reject) => {
   // xxxxxxxxxx
  })
  }

最后发现是在后面 uploadVue.post 里面的uploadVue.clearFiles() 影响到了。所以处理一下,加个变量,多选时不去执行清除设置 uploadVue.clearFiles()

return beforeCosUpload(this, file, beforeCheck,false)

function beforeCosUpload(self, file, beforeCheck,isClear = true) {
  uploadVue.post = function (file) {
    if (isClear) {
      uploadVue.clearFiles()  
    }
  }
}


<think> 首先,用户的问题是:“我想查找iview的tree组件on-select-change事件的编写方法 请问iview tree组件on-select-change事件的编写方法”。这看起来是关于iview(一个Vue UI框架)的Tree组件中的某个事件的使用方法。 用户提供了几个引用: - 引用[1]:展示了使用Tree组件时的HTML代码和在methods中定义choiceAll函数处理@on-check-change事件。注意,这里面提到了on-check-change,但用户问的是on-select-change。 - 引用[2]:展示了Tree组件的另一个例子,其中包括@on-select-change="selChange"事件绑定。 - 引用[3]:讨论了使用render函数改变颜色,并提到了on-select-change事件可能受影响。 用户的问题是专门关于on-select-change事件的编写方法。我需要从这些引用中提取相关信息来回答。 关键点在引用[2]中:有@on-select-change="selChange"绑定,表明需要在methods中定义一个名为selChange的函数来处理这个事件。 回顾引用[2]的代码: ```html <Tree v-show="familyList[0].children.length > 0" ref="mytree" :data="familyList" :load-data="handleLoadData" @on-select-change="selChange" @on-check-change="ClickCheck" show-checkbox expand-node></Tree> ``` 在methods部分,应该有类似: ```javascript methods: { selChange: function(data) { console.log(data); // 可以打印选中的节点数据 // 在这里处理选中的逻辑 } } ``` 引用[1]中也有提到类似的结构: 在引用[1]中: ```javascript @on-check-change="choiceAll" // ... choiceAll:function(data){ console.log(data); // ... } ``` 所以,对于on-select-change事件,编写方法类似: 1. 在Tree组件的HTML标签中添加@on-select-change="yourHandler"绑定。 2. 在Vue组件的methods中定义一个函数yourHandler(data),其中data是事件回调传递的数据,通常包含选中的节点信息。 引用[3]提到,使用render函数可能会影响on-select-change事件,但用户没有指定他们是否在使用render函数。所以,我应该先给出基本用法,然后简要提到潜在问题。 用户的问题很直接:如何编写on-select-change事件的方法。 结构化回答: - **介绍事件**:on-select-change是在Tree组件中当选中节点发生变化时触发的事件。 - **编写方法**: - 在Tree标签中添加@on-select-change="yourHandler"。 - 在Vue组件的methods中定义yourHandler函数。函数接收一个参数data,里面包含事件数据。 - **示例代码**:基于引用[2],提供一个简单示例。 - **注意事项**:如果需要,基于引用[3],提到如果使用render函数,事件可能会受影响,可能需要调整。 用户提供了引用,所以我应该在回答中引用这些参考,并在末尾添加引用标识如[^1]。 系统指令要求: - 回答中引用的段落末尾自然地添加引用标识。 - 使用中文回答。 - 生成相关问题- 结构清晰。 最后,生成相关问题。 完整回答结构: 1. 解释事件。 2. 给出编写方法的步骤和代码示例。 3. 添加注意事项。 4. 生成相关问题。 代码示例: 基于引用[2],简化一下。 ```html <Tree :data="treeData" @on-select-change="handleSelectChange" show-checkbox></Tree> ``` 在script中: ```javascript export default { data() { return { treeData: [ /* 树的数据 */ ] } }, methods: { handleSelectChange: function(data) { console.log('选中节点变化:', data); // data包含选中的节点信息 // 在这里处理你的逻辑 } } } ``` 注意事项: - 如果使用自定义render函数(如引用[3]所示),可能会影响节点选择和事件触发,这时可能需要使用ref来获取节点信息,或者改用其他方式如单击事件。 相关问题: 1. on-select-change事件传递的参数是什么? 2. 如何在iview Tree组件中获取当前选中的节点? 3. 使用render函数时如何解决on-select-change事件问题? 确保回答真实可靠。 </think> ### iview Tree组件on-select-change事件的编写方法 在iview的Tree组件中,`on-select-change`事件用于监听节点选中状态的变化。以下是基于引用内容的完整编写方法: #### 1. **事件绑定语法** 在Tree组件的HTML标签中,使用`@on-select-change`绑定事件处理器: ```html <Tree :data="treeData" @on-select-change="handleSelectChange" show-checkbox multiple ></Tree> ``` - **关键点**: - `@on-select-change`是事件监听器。 - `handleSelectChange`是在Vue组件的`methods`中定义的处理函数名(可自定义)。 - 示例中`show-checkbox`启用复选框,`multiple`允许多选(根据需求可选)[^2]。 #### 2. **事件处理函数编写** 在Vue组件的`methods`中定义处理函数,接收事件数据参数: ```javascript export default { data() { return { treeData: [ // 树形数据示例 { title: 'parent节点', expand: true, children: [ /* 子节点 */ ] } ] }; }, methods: { handleSelectChange(data) { // data参数包含事件触发时的节点信息 console.log('选中节点变化:', data); // 实际业务逻辑(如更新状态、调用API等) // 示例:获取所有选中节点 const selectedNodes = this.$refs.treeRef.getSelectedNodes(); console.log('当前选中节点:', selectedNodes); } } }; ``` - **参数说明**: - `data`:事件回调数据,通常包含触发事件的节点详细信息(如`title`, `checked`, `children`等)[^1][^2]。 - **常用API**: - `this.$refs.treeRef.getSelectedNodes()`:通过`ref`获取所有当前选中节点(需在Tree标签添加`ref="treeRef"`)[^1][^2]。 #### 3. **注意事项** - **自定义渲染影响**:如果使用`:render="renderContent"`自定义节点渲染(如引用[3]),`on-select-change`可能失效。解决方案: - 避免在渲染函数中覆盖默认事件逻辑。 - 改用`<a>`标签包裹标题并绑定点击事件获取节点数据[^3]。 - **事件类型区分**: - `on-select-change`:节点选中状态变化(如点击节点)。 - `on-check-change`:复选框状态变化(如引用[1]中的`choiceAll`方法)。 - 两者可同时使用(如引用[2]所示)[^1][^2]。 #### 4. **完整示例** 基于引用[2]的异步加载场景: ```html <Tree ref="mytree" :data="familyList" :load-data="handleLoadData" @on-select-change="selChange" show-checkbox ></Tree> ``` ```javascript methods: { selChange(data) { // 处理选中变化逻辑 console.log('选中节点数据:', data); const currentSelected = this.$refs.mytree.getSelectedNodes(); // ... }, handleLoadData(node, callback) { /* 异步加载逻辑 */ } } ``` ### 相关问题 1. **`on-select-change`事件回调的参数结构是什么?如何获取节点详细信息?** 2. **如何在iview Tree组件中实现动态加载数据(异步加载)并与选中事件结合?** 3. **当使用自定义渲染函数(`:render`属性)时,如何确保`on-select-change`事件正常工作?** [^1]: [引用[1]展示了`on-check-change`事件的用法,但事件绑定方法与`on-select-change`类似。] [^2]: [引用[2]明确使用了`@on-select-change="selChange"`事件绑定,并提供异步加载示例。] [^3]: [引用[3]指出自定义渲染可能影响事件,建议调整标签或逻辑。]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值