js
export let customDropdownRenderer = (instance, td, row, col, prop, value, cellProperties) => {// let selectedId// console.log('答应optionsList', instance, td, row, col, prop, value, cellProperties)let optionsList = cellProperties.chosenOptions.dataif (typeof optionsList === 'undefined' || typeof optionsList.length === 'undefined' || !optionsList.length) {Handsontable.cellTypes.text.renderer(instance, td, row, col, prop, value, cellProperties)return td}//let values = (value + '').split(',')value = []for (var index = 0; index < optionsList.length; index++) {if (values.indexOf(optionsList[index].id + '') > -1) {// selectedId = optionsList[index].idvalue.push(optionsList[index].label)}}value = value.join(', ')Handsontable.cellTypes.text.renderer(instance, td, row, col, prop, value, cellProperties)// td.innerText = valuesreturn td
}<hot-table :settings="hotSettings" :data="hotData" ref="table">
</hot-table>class Myselect extends TextEditor {// const CustomEditor = Handsontable.editors.BaseEditor.prototype.extend()// ...rest of the editor code// console.log('触发')// eslint-disable-next-line no-useless-constructorconstructor (props) {super(props)}// let MySelectEditor = Handsontable.editors.TextEditor.prototype.extend()prepare (row, col, prop, td, originalValue, cellProperties) {super.prepare(row, col, prop, td, originalValue, cellProperties)this.options = {}console.log('答应prepare', originalValue)if (this.cellProperties.chosenOptions) {this.options = $.extend(this.options, cellProperties.chosenOptions)}this.originalValue = originalValuecellProperties.chosenOptions = $.extend({}, cellProperties.chosenOptions)}createElements () {let $ = window.$super.createElements()// this.$body = $(document.body)this.TEXTAREA = document.createElement('select')// Handsontable copy paste plugin calls this.TEXTAREA.select()this.TEXTAREA.select = function () { }// this.TEXTAREA.setAttribute('type', 'text');this.$textarea = $(this.TEXTAREA)Handsontable.dom.addClass(this.TEXTAREA, 'handsontableInput')this.textareaStyle = this.TEXTAREA.stylethis.textareaStyle.width = 0this.textareaStyle.height = 0this.TEXTAREA_PARENT = document.createElement('DIV')Handsontable.dom.addClass(this.TEXTAREA_PARENT, 'handsontableInputHolder')this.textareaParentStyle = this.TEXTAREA_PARENT.stylethis.textareaParentStyle.top = 0this.textareaParentStyle.left = 0this.textareaParentStyle.display = 'none'this.textareaParentStyle.width = '200px'this.TEXTAREA_PARENT.appendChild(this.TEXTAREA)this.instance.rootElement.appendChild(this.TEXTAREA_PARENT)let that = thisthis.instance._registerTimeout(setTimeout(function () {that.refreshDimensions()}, 0))}onChosenChanged () {let options = this.cellProperties.chosenOptionsif (!options.multiple) {this.close()this.finishEditing()}}onChosenClosed () {let options = this.cellProperties.chosenOptionsif (!options.multiple) {this.close()this.finishEditing()} else {}}onBeforeKeyDown (event) {let instance = thislet that = instance.getActiveEditor()let keyCodes = Handsontable.helper.KEY_CODESlet ctrlDown = (event.ctrlKey || event.metaKey) && !event.altKey // catch CTRL but not right ALT (which in some systems triggers ALT+CTRL)// Process only events that have been fired in the editorif (event.target.tagName !== 'INPUT') {return}if (event.keyCode === 17 || event.keyCode === 224 || event.keyCode === 91 || event.keyCode === 93) {// when CTRL or its equivalent is pressed and cell is edited, don't prepare selectable text in textareaevent.stopImmediatePropagation()return}let target = event.targetswitch (event.keyCode) {case keyCodes.ARROW_RIGHT:if (Handsontable.dom.getCaretPosition(target) !== target.value.length) {event.stopImmediatePropagation()} else {that.$textarea.trigger('chosen:close')}breakcase keyCodes.ARROW_LEFT:if (Handsontable.dom.getCaretPosition(target) !== 0) {event.stopImmediatePropagation()} else {that.$textarea.trigger('chosen:close')}breakcase keyCodes.ENTER:if (that.cellProperties.chosenOptions.multiple) {event.stopImmediatePropagation()event.preventDefault()event.stopPropagation()}breakcase keyCodes.A:case keyCodes.X:case keyCodes.C:case keyCodes.V:if (ctrlDown) {event.stopImmediatePropagation() // CTRL+A, CTRL+C, CTRL+V, CTRL+X should only work locally when cell is edited (not in table context)}breakcase keyCodes.BACKSPACE:let txt = $(that.TEXTAREA_PARENT).find('input').val()$(that.TEXTAREA_PARENT).find('input').val(txt.substr(0, txt.length - 1)).trigger('keyup.chosen')event.stopImmediatePropagation()breakcase keyCodes.DELETE:case keyCodes.HOME:case keyCodes.END:event.stopImmediatePropagation() // backspace, delete, home, end should only work locally when cell is edited (not in table context)break}}open (keyboardEvent) {this.refreshDimensions()this.textareaParentStyle.display = 'block'this.instance.addHook('beforeKeyDown', this.onBeforeKeyDown)this.$textarea.css({height: $(this.TD).height() + 4,'min-width': $(this.TD).outerWidth() - 4})// display the listthis.$textarea.hide()// make sure that list positions matches cell position// this.$textarea.offset($(this.TD).offset());let options = $.extend({}, this.options, {width: '100%',search_contains: true})if (options.multiple) {this.$textarea.attr('multiple', true)} else {this.$textarea.attr('multiple', false)}this.$textarea.empty()this.$textarea.append("<option value=''></option>")let el = nulllet originalValue = (this.originalValue + '').split(',')if (options.data && options.data.length) {for (let i = 0; i < options.data.length; i++) {el = $('<option />')el.attr('value', options.data[i].id)el.html(options.data[i].label)if (originalValue.indexOf(options.data[i].id + '') > -1) {el.attr('selected', true)}this.$textarea.append(el)}}if ($(this.TEXTAREA_PARENT).find('.chosen-container').length) {this.$textarea.chosen('destroy')}// console.log('thishtishthsi', this)this.$textarea.chosen(options)let self = thissetTimeout(function () {self.$textarea.on('change', this.onChosenChanged.bind(self))self.$textarea.on('chosen:hiding_dropdown', this.onChosenClosed.bind(self))self.$textarea.trigger('chosen:open')$(self.TEXTAREA_PARENT).find('input').on('keydown', function (e) {if (e.keyCode === Handsontable.helper.KEY_CODES.ENTER /* || e.keyCode === Handsontable.helper.KEY_CODES.BACKSPACE */) {if ($(this).val()) {e.preventDefault()e.stopPropagation()} else {e.preventDefault()e.stopPropagation()self.close()self.finishEditing()}}if (e.keyCode === Handsontable.helper.KEY_CODES.BACKSPACE) {let txt = $(self.TEXTAREA_PARENT).find('input').val()$(self.TEXTAREA_PARENT).find('input').val(txt.substr(0, txt.length - 1)).trigger('keyup.chosen')e.preventDefault()e.stopPropagation()}if (e.keyCode === Handsontable.helper.KEY_CODES.ARROW_DOWN || e.keyCode === Handsontable.helper.KEY_CODES.ARROW_UP) {e.preventDefault()e.stopPropagation()}})setTimeout(function () {self.$textarea.trigger('chosen:activate').focus()if (keyboardEvent && keyboardEvent.keyCode && Number(keyboardEvent.keyCode) !== 113) {let key = keyboardEvent.keyCodelet keyText = (String.fromCharCode((key >= 96 && key <= 105) ? key - 48 : key)).toLowerCase()$(self.TEXTAREA_PARENT).find('input').val(keyText).trigger('keyup.chosen')self.$textarea.trigger('chosen:activate')}}, 1)}, 1)}init () {Handsontable.editors.TextEditor.prototype.init.apply(this, arguments)}close () {this.instance.listen()this.instance.removeHook('beforeKeyDown', this.onBeforeKeyDown)this.$textarea.off()this.$textarea.hide()Handsontable.editors.TextEditor.prototype.close.apply(this, arguments)}getValue () {if (!this.$textarea.val()) {return ''}if (typeof this.$textarea.val() === 'object') {return this.$textarea.val().join(',')}return this.$textarea.val()}// setValue(value) {//  console.log('答应setValue', value)//   this.select.value = value;// }focus () {this.instance.listen()// DO NOT CALL THE BASE TEXTEDITOR FOCUS METHOD HERE, IT CAN MAKE THIS EDITOR BEHAVE POORLY AND HAS NO PURPOSE WITHIN THE CONTEXT OF THIS EDITOR// Handsontable.editors.TextEditor.prototype.focus.apply(this, arguments);}beginEditing (initialValue) {let onBeginEditing = this.instance.getSettings().onBeginEditingif (onBeginEditing && onBeginEditing() === false) {return}Handsontable.editors.TextEditor.prototype.beginEditing.apply(this, arguments)}finishEditing (isCancelled, ctrlDown) {this.instance.listen()return Handsontable.editors.TextEditor.prototype.finishEditing.apply(this, arguments)}
}
{tittle: '媒介',editor: Myselect,data:'fdMediaIds',renderer: customDropdownRenderer,chosenOptions: {multiple: true,data: [{id: '1',label: 'NNN'}, {id: '2',label: 'YYY'}, {id: '3',label: 'QQQ'}, {id: '4',label: 'TTT'}]},width: 150
}

代码不全 但是关键配置都在这里 需要的话可以看官方文档补全

通过修改里面的一些配置

Cell editor - Guide - Handsontable Documentation

关键的api 有
this.$refs.table.hotInstance.loadData(this.hotData) // 更新数据

let index = this.$refs.table.hotInstance.getDataAtRow(i) // 获取 行数据
this.hotSettings.columns[11].source = res.data.data
this.$refs.table.hotInstance.updateSettings(this.hotSettings) // 更新setting

上面大部分覆盖了大部分场景 定制需求的话需要理解render和edit的写法 会稍微复杂点

handsontable+vue+ 自定义多选相关推荐

  1. Vue 自定义多选组件

    Vue 自定义多选组件 子组件(选项卡) checkBoxCard.vue <template><div class="checkBoxCard">< ...

  2. vue 自定义多选框组件

    自定义多选框组件 <template><div class="checkBox"><input v-model="isInherit&quo ...

  3. Handsontable VUE+element-ui +handsontable 实现Excel复制文本到项目表格列表(基于Elemenet+handsontable)

    @VUE封装handsontable(仿写Element样式)-重点查看使用方法 #Handsontable VUE+element-ui 实现Excel复制文本到项目表格列表(基于Elemenet) ...

  4. Vue自定义组件之时间跨度选择器

    时间跨度选择器 该组件是个时间跨度选择器. 基于 vue自定义组件之选择器 和 Vue自定义组件之日期时间范围选择器 点击选框,下拉列表中有四个选项,点击自定义时间,后边会出现 日期时间范围选择 代码 ...

  5. el-checkbox 自定义 复选框【多选框】

    1. 自定义 多选框 el-checkbox; 预览: 注意: 假如有全局字体引入会影响显示效果: 去除el-checkbox__inner附加字体css font-family: not speci ...

  6. 超实用:Vue 自定义指令合集

    大家好,我是漫步 前面我已经分享过一篇"分享8个非常实用的Vue自定义指令"文章,里面教了大家如何使用自定义指令,以及几个使用的指令,下面这篇文章也是类似内容,希望你会喜欢.记得查 ...

  7. vue 定义全局弹框_VUE路由拦截:Vue自定义全局弹窗组件

    前言 在任何一个平台中,如果需要增加用户黏度,除了用户需要的基本内容外,用户登录注册提交信息也是非常重要的一环,可以了解用户基本信息,用户喜欢等. 抛出前后端混合开发外,vue可以轻松的实现路由拦截. ...

  8. php动态写入vue,Vue自定义动态组件使用详解

    这次给大家带来Vue自定义动态组件使用详解,Vue自定义动态组件的注意事项有哪些,下面就是实战案例,一起来看一下. 现在基于vue的UI组件库有很多,比如iview,element-ui等.但有时候这 ...

  9. vue自定义指令封装节流_Vue自定义指令封装节流函数的方法示例

    节流函数是web前端开发中经常用到的一个开发技巧,在input实时搜索,滚动事件等,为了避免过多消耗性能,我们都会使用节流函数.在<JavaScript高级程序设计>一书中有这样的一个例子 ...

  10. WPF自定义控件与样式(8)-ComboBox与自定义多选控件MultComboBox

    一.前言 申明:WPF自定义控件与样式是一个系列文章,前后是有些关联的,但大多是按照由简到繁的顺序逐步发布的等,若有不明白的地方可以参考本系列前面的文章,文末附有部分文章链接. 本文主要内容: 下拉选 ...

最新文章

  1. selenium+Python(鼠标和键盘事件)
  2. 全民IT时代到来了?学计算机很有前途?——淘宝2011校园招聘笔试感想
  3. android多线程读取网页内容
  4. android canvas bitmap matrix,Canvas API详解(Part 3)Matrix和drawBitmapMash
  5. [scala-spark]1. Spark vs Hadoop 及 基础
  6. c语言 将结构体放在flash,如何将 结构体 的 数据 定义在flash里面,并如何读出来,求各位达人帮助……...
  7. Django - Form和ModelForm
  8. linux snmp 限制ip_Windows/Linux服务器监控软件推荐
  9. creator图片循环显示_Cocos creator 游戏背景循环滚动--Javascript编写
  10. AspectJ——预编译方式实现AOP
  11. VAssistX给注释中文带来红色下划线可以去掉
  12. 京东商城逆势融资B2C成投资热土
  13. PSP开发简明教程(2)
  14. Struts2漏洞爆发 知道创宇云安全已拦截近万攻击样本
  15. vivo计算机的隐藏功能教程,Vivo手机的5个隐藏功能,真的很实用,一定要打开
  16. 【前端】javascript实现导航栏筋斗云效果特效
  17. 如何在word里面打对勾
  18. 只能看,不能读的文章
  19. 查询网站收录的方式?怎样查询网站收录情况?
  20. echarts自定义视图数据(dataView)

热门文章

  1. 文件批量提取工具,从大量文件中批量提取指定文件的实现思路,文件批量复制
  2. ThoughtWorks.QRCode功能齐全的二维码开发工具
  3. 鲜卑族的由来与现在的分布
  4. 如何撰写高水平的博士论文?
  5. 蚂蚁金服实习Android岗,面试闯关记。
  6. axure动态面板的简单介绍
  7. web前端基础——Less语法
  8. 蛋白质ph稳定性计算机模拟,蛋白质分子设计.ppt
  9. 2013-06-16 读书笔记 大前研一 《无国界的世界》
  10. 文件批量重命名怎么加下划线?