作者:手机用户3312丿075454 | 来源:互联网 | 2023-09-10 19:41
前言:最近项目在整一个绘制栅格颜色的工具,使用到了dat.gui ,不知道是不是我的搜索方式有问题,只是看到了API的使用,在这一点上如何让两个folder之间产生关联 属实是 折磨了我一会。这篇文章会介绍dat.gui 在Vue 下的 最基本 使用,以及不同folder下的联动。包含增添、删除,更新数据等。在我默认你有一定前端基础的前提下,我会尽可能的缩短篇幅。
下载以及引入
npm install dat.gui --save-dev
安装在开发环境中即可。
import dat from 'dat.gui'
最基础使用
简述一下:这里的关键在于 生成一个GUI的类,往这个类里添加Controller,Controller有4种类型,一个是数字类型,一个是字符串类型,一个是布尔类型,一个是函数类型。分别会有不同的显示状况。要想使用很简单,实例化这个GUI,然后往里面去填充controller即可。
var gui = new dat.GUI();
gui.add(this.person,'name');
以上代码就可以生成一个在右上角挂着的一个控制器,形状如:name [[[[[input框]]]]]。
当然通常如果稍微复杂一点,有多个属于同一类型的我们最好把他放在一个文件夹,即folder。
如上图所示,只需添加一个文件夹的名字即可。所以。
var gui = new dat.GUI();
let persons = gui.addFolder('很多人');
persons.add(this.person,'name');
这样就可以显示一个很多人的目录,目录下面有一个name为Sam的控制器。
进阶
假如我想要的是上面图的效果。那么首先,我应该是需要一个可遍历的数组对象。
"legendData": [{"val": -20,"color": [149,137,211]},{"val": -10,"color": [139,206,206]},{"val": 0,"color": [70,134,198]},{"val": 10,"color": [106,144,41]},{"val": 20,"color": [211,173,8]},{"val": 30,"color": [235,94,20]},{"val": 40,"color": [145,46,11]}],
你可以直接把他塞到data里面使用,接着循环遍历这个列表 绘制 颜色。这里应该会有个疑惑,为啥color长这样,跟我在写的项目有关了。
data() {return {colors: {},colorNumObj: {nums: 0,},legendKeyObj: {},startFlag: false,curLegendData: [],curColorsArr: [],viewer: null,timer: 3,startTimeStamp: 0,lastSortKey: [],}},
根据 数据 处理colors 生成颜色对象
methods: {keySort: function (obj) {let sortKeyStr = Object.keys(obj).sort((a, b) => a - b).join(',');let sortKeyArr = sortKeyStr.split(',');return sortKeyArr;},
}
mounted(){let legendDate &#61; this.legendDate; for (let i &#61; 0; i < legendDate.length; i&#43;&#43;) {console.log(legendDate[i])let str &#61; legendDate[i].color.join(&#39;,&#39;)let value &#61; legendDate[i].val;this.$set(this.colors, value, &#96;rgb(${str})&#96;)}let colorKeyArr &#61; this.keySort(_C_colors)for (let i &#61; 0, ii &#61; colorKeyArr.length; i < ii; i&#43;&#43;) {this.$set(this.legendKeyObj,&#96;第${i &#43; 1}个颜色数值&#96;,Number(&#96;${legendDate[i].val}&#96;))}}
var gui &#61; new dat.GUI()
var f &#61; gui.addFolder(&#39;颜色调试&#39;);
var nums &#61; gui.addFolder(&#39;颜色数值&#39;)
let legendKeyObj &#61; this.legendKeyObj
for (let i in legendKeyObj) {nums.add(legendKeyObj, i).min(-100).max(1000).step(1).onFinishChange((e) &#61;> {console.log(i);let key &#61; Number(i.replace(/[^0-9]/ig,""));let __controllers__Index &#61; key - 1;f.__controllers[__controllers__Index].name(e);})
}
let sortKeyArr &#61; this.sortKey();
for (let i &#61; 0, ii &#61; sortKeyArr.length; i < ii; i&#43;&#43;) {f.addColor(this.colors, sortKeyArr[i]);
}
以上是 其中的一种联动。即改变某一个文件夹里的值或者某一个控制器的值 让另一个控制器响应。
还有一种联动是对视图的操作。即如何在通过修改了你的引用对象如此文中的this.colors 我后面新增了一个key value&#xff0c;但是视图没有更新的情况&#xff1b;或者是删除了一个keyvalue&#xff0c;视图没有更新的情况。都会分别介绍。
添加
添加同样&#xff0c;往vue上 具有响应式 还是得 $set&#xff0c;但除此之外&#xff0c;如果想响应式地也把dat.gui的视图更新了&#xff0c;别妄想你set之后就会更新&#xff0c;你set顶多只是保证你的状态是正确的。你得手动操作&#xff0c;例如我在某一个控制器的change事件里做如下事情。即可做到响应式地更新。
this.$set(this.colors, key, rgb?)
f.addColor(this.colors, key)
删除
this.$delete(this.colors,key);
f.remove(f.__controllers[someIndex])
总结
这篇文章就结束了&#xff0c;主要介绍了dat.gui 的使用&#xff0c;以及联动的方法。一个是视图更新的操作&#xff0c;一个是控制器里的某个属性被更改 响应另一个控制器。