代码之家  ›  专栏  ›  技术社区  ›  rb612

没有大括号的单行箭头函数-不能有分号?

  •  0
  • rb612  · 技术社区  · 8 年前

    我不熟悉React和ES6语法,我发现有趣的是,如果我写:

    return <input onChange={event => console.log(event.target.value);} />;
    

    这行不通。我得到一个“找不到模块”错误。

    但如果我删除arrow函数中的分号:

    return <input onChange={event => console.log(event.target.value)} />;
    

    它工作得很好。如果我保留分号,但添加了大括号,那么:

    return <input onChange={event => { console.log(event.target.value); }} />;
    

    这也行。上面第一个例子不起作用的原因是什么?

    1 回复  |  直到 8 年前
        1
  •  4
  •   kingdaro    8 年前

    为了正确理解这种情况的原因,让我们确保我们知道 表达 ,和 .

    在最基本的层面上, 表达 是表示某种类型的值的代码位。所以 123 , a + b + c , calculateSomething() ,这些都是表达式。表达式中不包含分号。

    在JS中是表达式列表。这些表达式由大括号包围 { } ,并用分号分隔。

    现在,回到箭头函数。箭头函数可以有两种形式:

    (some, args) => <an expression>
    (some, args) => { <an expression>; <an expression>; ... }
    

    注意,第一个表单采用 表达 一个。如果使用的是分号, 就像第二种形式。

    JSX的工作原理如下:

    <input onChange={ <an expression> } />
    

    你把你想要的道具的名字,一个等号,然后一个单独的表达式放在大括号里。记住,单个表达式没有分号。

    箭头函数是表达式。所以,如果你在这里放一个分号…

    <input onChange={ () => 'hello' ; } />
    

    JS将看到表达式,然后在表达式后面看到分号,然后崩溃,因为它不应该在那里。