javascript - 正确定义的 Javascript 函数有时会导致 TypeError:“X”不是函数
问题描述
我有一个 React (^16.12.0) 应用程序。我使用 Chrome,但使用 Firefox 和其他机器也会出现同样的错误。
这是应用程序的链接:resume-designer.com。几次点击蓝色的大添加按钮后,您最终会在控制台中看到以下错误:
Uncaught TypeError: r[t] is not a function
这是有问题的代码:
// src/defaults/content.js
export const education = () => ({
city: '',
country: '',
degree: '',
description: emptyDesc(),
id: shortid.generate(),
school: '',
});
export const experiences = () => ({
city: '',
country: '',
description: emptyDesc(),
employer: '',
id: shortid.generate(),
position: '',
});
// src/actions/content.js
import * as defaults from '../defaults/content';
export const addItem = (event) => {
const { section } = event.target.dataset;
return {
newItem: defaults[section](), // <-- This causes the problem (sometimes)
path: section,
type: 'ADD_ITEM',
};
};
为了查看发生了什么,我在第 7 行添加了console.log(defaults[section]);
语句src/actions/content.js
,就在return
语句之前。在提到的按钮上单击四次(并不总是四次)最终导致了预期的错误。在下面的屏幕截图中,我们看到,对于前三次单击,该函数被正确定义和调用,但对于第四次,它现在是 undefined () 并导致错误。请注意,如果您继续单击,它会再次开始工作,然后崩溃,然后工作,等等。
我尝试将education()
andexperiences()
函数从src/defaults/content.js
to移动src/actions/content.js
,但仍然出现相同的错误。
任何想法?会不会是内存不足的问题?
- 应用程序链接:https ://resume-designer.com/ 。
解决方案
您正在收听有孩子的按钮上的点击事件。孩子们也通过事件冒泡来触发监听器。在您的情况下,您拥有data-section
“外部元素”的数据集信息。但是因为有时孩子触发事件,你event.target
不是你预期的“外部元素”(尝试点击文本,你的错误总是会出现)
你的问题是在线const { section } = event.target.dataset;
您可以将 CSS 添加到外部元素的子元素中,这样子元素的pointer-events: none;
点击就会被忽略。或者,您可以通过调用确保取消对孩子的事件冒泡event.stopPropagation()
推荐阅读
- facebook - 在 Spark AR Studio 中使用本机 UI 选择器在双语过滤器中切换语言
- xslt - XSLT 1.0 - 在 sum 之前格式化数字
- c# - 如何在 Identity 3.1 中自定义用户?
- arangodb - arango shell 不包含在 ArangoDB 3.6.3 for macos 中
- ruby-on-rails - 在不触摸/保存标记记录的情况下修改作为可标记的标记
- neo4j - 如何使用 Neo4j 变量,不使用变量/标识符的查询行为不同
- javascript - 如何在 JS 中访问另一个文件中的函数对象
- sql - SQL 查询执行了多次而不是一次
- javascript - 仅授权订阅的 Web 推送唯一设备 ID
- multithreading - JavaFX 线程和并发