ResizeObserver 调用期间未捕获的类型错误:chartObj.width 不是函数
Uncaught TypeError during ResizeObserver Call: chartObj.width is not a function
我正在关注 this example,使用以下代码
// resizable chart function
const callback = (chartObj: DCGraphicType) => () => {
redrawChartNoTransitions(chartObj.width(null).rescale()); // @typeerror
};
// watch for resize and call callback when resize occurs
React.useEffect(() => {
new ResizeObserver(callback(chart)).observe(
d3.select(div.current!).node()!
);
}, [chart]);
并出现此错误:
ChartTemplate.tsx:77 Uncaught TypeError: chartObj.width is not a function
at ResizeObserver.<anonymous> (ChartTemplate.tsx:77)
(anonymous) @ ChartTemplate.tsx:77
注意:辅助函数是
const restoreGetset = (property, value) => f => c => {
if (Array.isArray(c)) c.forEach(restoreGetset(property, value)(f));
else {
const cs = c.children ? [c].concat(c.children()) : [c];
const last = cs.map(c => c[property]());
cs.forEach(ch => ch[property](value));
f(c);
cs.forEach(ch => ch[property](last));
}
return c;
};
// specifically, turn off transitions for a chart or charts
const noTransitions = restoreGetset("transitionDuration", 0);
// specifically, turn off transitions for a chart or charts and redraw
export const redrawChartNoTransitions = noTransitions(c => c.redraw());
这适用于我的本地应用程序(因错误而被迫),但我想了解并摆脱它...这是一个 Stackblitz 的错误
我还没有学过Hooks,所以我不确定它在React中到底来自哪里,但是在页面初始化时chart
似乎是一个空对象,并且变成了以后有效。
在你的chartTemplate.tsx
中:
React.useEffect(() => {
new ResizeObserver(callback(chart)).observe(
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
d3.select(div.current!).node()!
);
}, [chart]);
可能不是解决这个问题的正确位置,但请忽略空白对象:
if (!Object.keys(chart).length) return;
使用 Chrome DevTools 进行调试
在 Chrome DevTools 中,显示浏览器控制台并单击错误中的代码 link。
在回调中的违规行上设置断点,注意 chart
第一次命中该行时是一个空对象,但如果继续,它就会有效。
使用console.log()
调试
添加,在错误前一行,
console.log(chartObj);
在浏览器调试控制台中产生以下输出:
空对象打印了两次,每次都跟在错误后面。然后实例化的图表对象打印了两次,没有报错。
我正在关注 this example,使用以下代码
// resizable chart function
const callback = (chartObj: DCGraphicType) => () => {
redrawChartNoTransitions(chartObj.width(null).rescale()); // @typeerror
};
// watch for resize and call callback when resize occurs
React.useEffect(() => {
new ResizeObserver(callback(chart)).observe(
d3.select(div.current!).node()!
);
}, [chart]);
并出现此错误:
ChartTemplate.tsx:77 Uncaught TypeError: chartObj.width is not a function
at ResizeObserver.<anonymous> (ChartTemplate.tsx:77)
(anonymous) @ ChartTemplate.tsx:77
注意:辅助函数是
const restoreGetset = (property, value) => f => c => {
if (Array.isArray(c)) c.forEach(restoreGetset(property, value)(f));
else {
const cs = c.children ? [c].concat(c.children()) : [c];
const last = cs.map(c => c[property]());
cs.forEach(ch => ch[property](value));
f(c);
cs.forEach(ch => ch[property](last));
}
return c;
};
// specifically, turn off transitions for a chart or charts
const noTransitions = restoreGetset("transitionDuration", 0);
// specifically, turn off transitions for a chart or charts and redraw
export const redrawChartNoTransitions = noTransitions(c => c.redraw());
这适用于我的本地应用程序(因错误而被迫),但我想了解并摆脱它...这是一个 Stackblitz 的错误
我还没有学过Hooks,所以我不确定它在React中到底来自哪里,但是在页面初始化时chart
似乎是一个空对象,并且变成了以后有效。
在你的chartTemplate.tsx
中:
React.useEffect(() => {
new ResizeObserver(callback(chart)).observe(
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
d3.select(div.current!).node()!
);
}, [chart]);
可能不是解决这个问题的正确位置,但请忽略空白对象:
if (!Object.keys(chart).length) return;
使用 Chrome DevTools 进行调试
在 Chrome DevTools 中,显示浏览器控制台并单击错误中的代码 link。
在回调中的违规行上设置断点,注意 chart
第一次命中该行时是一个空对象,但如果继续,它就会有效。
使用console.log()
调试
添加,在错误前一行,
console.log(chartObj);
在浏览器调试控制台中产生以下输出:
空对象打印了两次,每次都跟在错误后面。然后实例化的图表对象打印了两次,没有报错。