如何访问DOM事件
我使用React构建了一个简单的静态视图引擎,其目标是呈现静态HTML标记并生成一个填充了组件DOM事件(onClick等)的js文件。
我做第一部分的方式是需要一个指定的JSX文件,例如,看起来像这样:
import React from 'React';
export default class Test extends React.Component {
clicked() {
alert('Clicked the header!');
}
render() {
return (
<html>
<head>
<title>{this.props.title}</title>
</head>
<body>
<h1 onClick={this.clicked}>click me!!!</h1>
</body>
</html>
);
}
}
然后我通过NodeJS后端渲染JSX文件,如下所示:
let view = require('path-to-the-jsx-file');
view = view.default || view;
const ViewElement = React.createFactory(view);
let output = ReactDOMServer.renderToStaticMarkup(ViewElement(props));
它适用于静态HTML。 但是我想知道是否有一种方法可以访问数组中的JSX文件中使用的所有组件,然后我可以使用它来检查绑定了哪些事件以及哪些处理程序。
那么在这个例子中,能够得到<h1>
-tag的onClick
-handler? 这甚至有可能做些什么?
为了能够从onClick事件中以字符串形式获取函数,我们需要以下内容:
import React from 'React';
export default class Test extends React.Component {
componentDidMount() {
// Gets the name of the function passed inside onClick()
const nameBound = this.element.props.onClick.name;
// Removes 'bound ' from the function name (-> clicked)
const nameString = nameBound.replace('bound ', '');
// Gets the function from the function name as a string
const convertedFunction = this[nameString];
// Converts the function into string
const stringifiedFunction = convertedFunction.toString();
console.log(functionString);
}
clicked() {
alert('Clicked the header!');
}
render() {
return (
<html>
<head>
<title>{this.props.title}</title>
</head>
<body>
<h1 ref={(element) => { this.element = element; }} onClick={this.clicked}>click me!!!</h1>
</body>
</html>
);
}
}
经过大量搞乱之后,我想出了一个很好的解决方案。
如果我创建自己的ReactElement
实例(在示例ViewElement(props)
)中,我可以使用它的标准render
函数渲染元素:
let element = ViewElement(props);
let instance = new element.type();
let render = instance.render();
从这里我可以通过这个元素的所有道具,所以, onClick
handlers将在render.props
。
因此,我所做的是检查每个prop是否匹配react-event-name(例如,onClick,onDragEnd,onDragEnter等)。 如果是这样,并且该属性的值是类型函数 - 我有事件名称和它的处理函数:
Object.keys(render.props).map((key) => {
if (bigArrayOfAllTheEventNames.indexOf(key) !== -1) {
item.events[key] = render.props[key];//check if type is function.
}
});
然后,我还通过render.props.children
递归地遍历所有它的子组件,并将包含事件的每个组件添加到数组中。
剩下的唯一问题是我需要一种方法将呈现的DOM字符串绑定到我现在拥有的JavaScript处理程序。 为此,我添加了一个需要使用自定义的DOM属性,然后可以使用这样的东西来识别组件
$("[data-id=value]").on({event-name}, {it's JS-handler})
。
它可能还不完美,但我认为这是最好的解决方案。
链接地址: http://www.djcxy.com/p/52151.html下一篇: Not being able to pass props from a parent component to a child component