先来看一段代码

    1. import React from "react";
    2. import ReactDOM from "react-dom";
    3. import "./styles.css";
    4. const GrandSon = () => {
    5. const [n, setN] = React.useState(0);
    6. return (
    7. <div className="grand-son">
    8. 孙子,n:{n}
    9. <button onClick={() => setN(n + 1)}>+1</button>
    10. </div>
    11. );
    12. };
    13. class Son extends React.Component {
    14. constructor() {
    15. super();
    16. this.state = { n: 0 };
    17. }
    18. add() {
    19. this.setState({ n: this.state.n + 1 });
    20. }
    21. render() {
    22. return (
    23. <div className="son">
    24. 我是儿子,n:{this.state.n}
    25. <button onClick={() => this.add()}>+1</button>
    26. <GrandSon />
    27. </div>
    28. );
    29. }
    30. }
    31. function App() {
    32. return (
    33. <div className="app">
    34. <p>我是爸爸</p>
    35. <Son />
    36. </div>
    37. );
    38. }
    39. const rootElement = document.getElementById("root");
    40. ReactDOM.render(<App />, rootElement);

    为什么函数组件和类组件的事件绑定都要传一个函数呢?想这个问题之前,我们可以再看一个点,为什么react中的类名的设置要用className而不是正常的html属性class

    原因是react的所有dom操作都是在js中完成的,我们看到的标签,只是React为了方便书写而存在的,真实的代码都会被babel.js自动转换为 React.createElement 的方式去创建真实的html标签,那么js中操作类名的属性是什么?是className ,而事件的绑定呢?是一个函数。

    原始的js事件绑定的方式:

    1. var div = document.querySelector('div')
    2. div.onClick = () => {}
    3. div.onClick = function() {}

    看了上述代码,就能明白为什么React的jsx中要那么写事件绑定了吧?

    总结: React本身就是一个js框架,它就是封装了js且方便了代码的编写。很多东西,React还是依然沿用了js的东西。至于为什么jsx中事件绑定的代码用大括号包裹,那是因为jsx中的js代码都要用大括号包裹才行。

    如果对这个还是不够理解,那就拷贝下面的代码到babelOnline上,看是怎么被转换的就一切了然了。

    1. // function App(){
    2. // cosnt [n,setN] = React.useState(0)
    3. // return (
    4. // <div>n:{n}
    5. // <button onClick={() => setN(n + 1)}>+1</button>
    6. // </div>
    7. // )
    8. // }
    9. // <App />
    10. class Son extends React.Component {
    11. constructor() {
    12. super()
    13. this.state = {n: 0}
    14. }
    15. render() {
    16. return (
    17. <div>
    18. n:{this.state.n}
    19. <button onClick={() => this.setState({n: this.state.n + 1})}>+1</button>
    20. </div>
    21. )
    22. }
    23. }
    24. <Son />