cqwcns 发表于 2022-12-14 11:03

JS传参的问题(函数默认有参,想添加自定义参)

我正在使用ECharts绘制多边形,官方demo大概是这样的。
可见决定多边形的关键在用coords变量。



const renderItem = (params, api) => {
    const coords = [
      ,
      ,
      ,
      ,
      
    ];
    let points = [];
    for (let i = 0; i < coords.length; i++) {
      points.push(api.coord(coords));
    }
    let color = api.visual('color');
    return {
      type: 'polygon',
      shape: {
            points: echarts.graphic.clipPointsByRect(points, {
                x: params.coordSys.x,
                y: params.coordSys.y,
                width: params.coordSys.width,
                height: params.coordSys.height
            })
      },
      style: api.style({
            fill: color,
            stroke: echarts.color.lift(color)
      })
    };
}

const objPolygonSeries = {
    type: 'custom',
    coordinateSystem: 'bmap',
    renderItem: renderItem,
    tooltip: '这是提示文本',
    itemStyle: {
      opacity: 0.5
    },
    data: ,
    z: -10
}

如果我要绘制多个,理论上就是修改coords,复用renderItem函数就行。


正常来说,我们可以在调用是加上coords参数,大概是这样:
const coords = [...]
renderItem(coords)
但renderItem有两个默认参数,我就不知道应该怎么写了?


所以,如果我有多个多边形的数据,需要绘制多个多边形,应该怎么写?
请各位大佬指教,感谢。

mirs 发表于 2022-12-14 11:47

本帖最后由 mirs 于 2022-12-14 11:49 编辑

const renderItem = (coords, params, api) => {
    let points = [];
    for (let i = 0; i < coords.length; i++) {
      points.push(api.coord(coords));
    }
    let color = api.visual('color');
    return {
      type: 'polygon',
      shape: {
            points: echarts.graphic.clipPointsByRect(points, {
                x: params.coordSys.x,
                y: params.coordSys.y,
                width: params.coordSys.width,
                height: params.coordSys.height
            })
      },
      style: api.style({
            fill: color,
            stroke: echarts.color.lift(color)
      })
    };
}

const objPolygonSeries = {
    type: 'custom',
    coordinateSystem: 'bmap',
    renderItem: renderItem,
    tooltip: '这是提示文本',
    itemStyle: {
      opacity: 0.5
    },
    data: ,
    z: -10
}
const coords = [
    ,
    ,
    ,
    ,
   
];
renderItem(coords)

这个意思么?


cqwcns 发表于 2022-12-14 12:03

mirs 发表于 2022-12-14 11:47
const renderItem = (coords, params, api) => {
    let points = [];
...
测试了一下,这样应该是不行的。

因为renderItem的默认参数params, api在第一和第二位。

如果将自定义参数放到第一位,会直接替换掉默认参数params。

pjy612 发表于 2022-12-14 12:38

本帖最后由 pjy612 于 2022-12-14 12:41 编辑

你能改的话 先试试

const renderItem = (params, api) => {
console.log(params);
........原始逻辑
}
const objPolygonSeries = {
    type: 'custom',
    coordinateSystem: 'bmap',
    renderItem: renderItem,
    tooltip: '这是提示文本',
    itemStyle: {
      opacity: 0.5
    },
    data: ,
    z: -10,
    coords: 123456
}


然后 正常调用下 看看 params 打印的内容是啥 能不能拿到一些 自定义的 参数。比如 coords 123456。
然后就是 那个函数肯定不是给你直接用的,一定有别的地方通过 objPolygonSeries 去调用
不行的话 那你就只能弄个全局的字典辅助传参了。

cqwcns 发表于 2022-12-14 13:08

pjy612 发表于 2022-12-14 12:38
你能改的话 先试试

const renderItem = (params, api) => {


测试了一下,按照你的代码,无法将coords传到renderItem。

但在全局定义coords变量,再在renderItem引用该变量,其实是一种解决方法。

感谢交流。

cqwcns 发表于 2022-12-14 13:09

测试了一下,这样也无法传自定义参数。
const renderItem = (params, api, myParam) => {
    console.log('myParam', myParam)
    // myParam undefined
    const coords = [
      ,
      ,
      ,
      ,
      
    ];
    let points = [];
    for (let i = 0; i < coords.length; i++) {
      points.push(api.coord(coords));
    }
    let color = api.visual('color');
    return {
      type: 'polygon',
      shape: {
            points: echarts.graphic.clipPointsByRect(points, {
                x: params.coordSys.x,
                y: params.coordSys.y,
                width: params.coordSys.width,
                height: params.coordSys.height
            })
      },
      style: api.style({
            fill: color,
            stroke: echarts.color.lift(color)
      })
    };
}

const objPolygonSeries = {
    type: 'custom',
    coordinateSystem: 'bmap',
    myParam: 'myParam',
    renderItem: renderItem,
    tooltip: '这是提示文本',
    itemStyle: {
      opacity: 0.5
    },
    data: ,
    z: -10
}

mirs 发表于 2022-12-14 13:18

cqwcns 发表于 2022-12-14 12:03
测试了一下,这样应该是不行的。

因为renderItem的默认参数params, api在第一和第二位。


按照你的要求是没问题的,函数是什么顺序,传参是什么顺序就行了。我们并不知道params和api传的是什么

cqwcns 发表于 2022-12-14 15:19

mirs 发表于 2022-12-14 13:18
按照你的要求是没问题的,函数是什么顺序,传参是什么顺序就行了。我们并不知道params和api传的是什么

你好。params和api两个参数不是手动传的,是ECharts默认的参数。

好像没有办法修改参数的顺序,只是考虑有没有办法跳过前面两个参数,直接把第三个参数作为自定义参数。

sgvvvv 发表于 2022-12-14 17:33

需要绘制多个多边形 要修改的是下面option函数里面的series

mirs 发表于 2022-12-14 18:29

const renderItem = (params, api, coords) => {
    let points = [];
    for (let i = 0; i < coords.length; i++) {
      points.push(api.coord(coords));
    }
    let color = api.visual('color');
    return {
      type: 'polygon',
      shape: {
            points: echarts.graphic.clipPointsByRect(points, {
                x: params.coordSys.x,
                y: params.coordSys.y,
                width: params.coordSys.width,
                height: params.coordSys.height
            })
      },
      style: api.style({
            fill: color,
            stroke: echarts.color.lift(color)
      })
    };
}
let res = renderItem(params, api, [
    ,
    ,
    ,
    ,
   
]);
console.log(res)
页: [1]
查看完整版本: JS传参的问题(函数默认有参,想添加自定义参)