tree提供的方法貌似没有能够直接获取节点DOM,或者点击勾选节点响应函数参数node其实只是传入data的数据对象,拿不到DOM,得想一想法子来获取之node
事情是这样的:最近作一个表单,要能勾选一个二级的下拉数据,因而就想起了element的tree组件,并且二级的数据是要调用接口懒加载展开的,这个应该不少人会遇到这种需求,tree组件即支持勾选框又支持懒加载节点,功能是够用的。api
因此起初我是这样用组件的:数组
<el-tree :data="exitDataOnlyFirst" :props="{label: 'name'}" :load="loadNode" node-key="code" :expand-on-click-node="true" :default-checked-keys="form.checkedKeysSecond" lazy ref="dataTree" show-checkbox> </el-tree>
注: 个人展现数据大概样子以下:dom
data = [ {code: 1, name: '一', children: [{code: 11, name:'11'}]} ]
不过,在作编辑修改的时候,遇到这个组件就有点小困难了,虽然它有支持默认勾选节点的属性配置default-checked-keys
,不过问题页面第一次加载这个组件的时候,通常来讲我只加载第一级的数据,不加载第二级,尽管只要checked-keys设置的匹配,点击第一级展开以后,第二级只要一匹配上就会自动勾选,但显然这多一步的操做无疑不符合正常交互流程也不是很好体验,那只能考虑更直观点的操做了,那就是要能默认展开已经被选的第一级数据下的第二级数据,并勾选上相关节点。函数
expand-on-click-node
通常支持除勾选框外的节点部分点击后展开子节点。优化
如今要优化的几个点是:this
针对第一点,其实只要解决勾选一级节点触发展开子节点便可,勾选全部,组件已经实现了的,但上面我也提到过了expand-on-click-node
通常支持除勾选框外的节点部分点击才会触发展开,勾选框只负责勾选功能,那怎么让它也触发展开呢,这个时候就须要用到@check-change
响应了,code
<el-tree :data="exitDataOnlyFirst" :props="{label: 'name'}" :load="loadNode" node-key="code" :expand-on-click-node="true" :default-checked-keys="form.checkedKeysSecond" lazy @check-change="treeCheck" ref="dataTree" show-checkbox> </el-tree>
响应函数这么写:component
treeCheck(currentData, isCheck) { //if (currentData.leaf) return if (!currentData.children.length && isCheck) { // 点击这个data对应的节点的展开图标 const currentCode = currentData.code const $current = Array.from(this.$refs.dataTree.$children).filter($child => {return $child.node.data.code === currentCode })[0] $current.$el.childNodes[0].childNodes[0].click() } }
利用第二个参数isCheck获悉到勾选节点是将其选中,同时该节点尚未children,可做为还未展开过的依据,此时要是check-chage能提供当前节点的dom或者有展开功能函数提供就行了,然而并无,和同事交流的时候还说要修改源码,有点大费周章的感受,不过好在查看了整个tree的ref,发现$childrens这个属性,进而发现其node.data恰好是传入的data对象对应的数据,所以,能够利用数据遍历和过滤的方式来一步一步找到对应的dom,只要找到 展开箭头 的图标dom,再手动click一下,就解决了~orm
有了第一点获取节点dom和对应展开图标dom的经验后,第二点就很好作了,正如一早提到的default-checked-keys
告知了组件只要有出现这些key就勾选上,因而第二点的方案就能够定位到 解决展开那些有被勾选中子节点的一级节点上,而后经过遍历和匹配数据获取对应的dom,在手动click展开图标便可,剩下的加载操做,让组件帮你完成。
总结一下tree的几个关键属性:
当发现组件api不够用的时候,只要想法设法完成功能,须要用到dom的时候,还须要多多观察。