有没有办法从同一个函数设置多个属性?
export function receiveWines(wines) {
return {
type: 'FETCH_WINES_SUCCESS',
wines
};
}
export function fetchWines() {
return function(dispatch) {
return fetch(`https://sb-challenge-provo17.c9users.io/api/v1/wines`)
.then(response => {
var resp = response.json();
return resp;
})
.then(json => {
dispatch(receiveWines(json.wines)
);
});
};
}
我想同时计算d3.selectAll('.myshape')
.attr('y',function(d,i) { ... calculates something ... })
.attr('height',function(d,i) { ... calculates something very similar... })
和y1
,然后设置y2
和y = y1
。但是在d3中执行此操作的标准方法似乎是每个属性具有单独的功能。还有更好的方法吗?
答案 0 :(得分:3)
如果我正确理解了您的问题,那么您需要进行密集计算,只想计算一次每个元素,无论您设置的属性数量是多少。
在这种情况下,如果您需要,可以使用each
传递当前元素(this
)以及基准,索引和组:
d3.selectAll(".myShape").each(function(d,i,n){
//Here you put the complex calculation
//which will assign the values of y1 and y2.
//This calculation runs only once per element
d3.select(this).attr("y", y1).attr("height", y2 - y1)
});
答案 1 :(得分:0)
不完全是。但是你可以间接地解决这个问题。这增加了稍微增加的开销但值得imo。 JS没有很好的“编译时”(就js引擎而言)像C系列那样的宏,它可以在没有运行时成本的情况下为你提供很好的扩展。
像这样(你可能已经知道):let myshape = d3.selectAll('.myshape')
['y', 'height', ...].forEach(attr => myshape.attr(attr, calcAttr));
function calcAttr(a, i) {
// shared code
switch (a) {
case 'y':
//attr specific
break;
}
}