javascript - 为什么 HTML 不允许我以与 JSX 相同的方式添加事件处理程序?

标签 javascript reactjs function

为什么这段代码在 React JSX 中有效但在 HTML 中无效:

下面的代码只是标签的一个属性。 handleClick 函数仅显示 console.log

此代码适用于 React JSX 代码:

onClick={() => this.props.handleClick(1)}

这在 HTML 中不起作用:

onclick={() => handleClick(1)}
  1. 为什么我应该将 handleClick 函数放在 React JSX 的另一个函数中?
  2. 为什么它在 HTML 中不起作用?

最佳答案

  • ReactJS 有自己的 JSX 解释器/编译器,这就是它的工作方式。
  • 在“VanillaJS”(实际上,只是 JavaScript)中,您无法获得这种好处。
    • 除非您想将 JSX 引擎导入您的 JS 项目并处理这些依赖项。

Why I should put handleClick function in another function in React JSX?

我需要更多上下文来回答这个问题。

Why it doesn't work in HTML?

onclick={() => handleClick(1)}

这在 VanillaJS 中不起作用,因为 onclick 是一个函数属性,但是您可以简单地覆盖 onclick 函数属性一个新功能:

someButton.onclick = () => handleClick(1); // Warning: this will replace any existing `onclick` function property.

事实上,在 addEventListener 被添加到 DOM 并且支持变得广泛之前(大约在 2000 年代后期),JavaScript 程序员过去常常将多个事件处理程序添加到同一事件:

p>
var currentOnClick = someButton.onclick;
someButton.onclick = function( e ) {
    if( currentOnClick ) currentOnClick( e );
    // do stuff 
};

当然官方的方式是使用DOM的addEventListener函数:

someButton.addEventListener( 'click', handleClick.bind(this) );
// or:
someButton.addEventListener( 'click', () => handleClick(1) );
// or:
someButton.addEventListener( 'click', e => handleClick(1) );

如果你想让 JavaScript 的事件处理代码更简洁,那么修补 EventTarget(addEventListener 的父类型):

Object.defineProperty( EventTarget.prototype, 'onclick2', {

    get() {
        if( typeof this.onclickHandlers == 'undefined' ) {
           this.onclickHandlers = [];
        }
        return this.onclickHandlers;
    }

    set( handlerFunc ) {

        if( typeof this.onclickHandlers == 'undefined' ) {
           this.onclickHandlers = [];
        }

        this.onclickHandlers.push( handlerFunc );

        this.addEventListener( 'click', handlerFunc );
    }

} );

用法:

someButton.onclick2 = () => doSomething();

关于javascript - 为什么 HTML 不允许我以与 JSX 相同的方式添加事件处理程序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59534204/

相关文章:

javascript - JavaScript 中的 <% 和 %> 是什么意思?

javascript - 使用绝对定位更改另一个 div 悬停时的 div 外观(不重复)

css - ReactJS + Heroku : Why doesn't my website become mobile responsive?

css - 样式不适用于使用 react-css-modules

javascript - 在 Firefox 中首次单击时,React.js 组件中的选择元素不会更新

ios - 如何在 swift 3 中按下按钮时转到另一个 View Controller

javascript - AngularJS 中的动态表单字段

JavaScript 正则表达式语法错误

function - 快速从一个函数返回多个值

javascript - php和javascript如何执行嵌套函数的区别