【发布时间】:2021-06-06 21:23:39
【问题描述】:
这是一个我想在 JSX 中更好地理解语法的例子。
问题:
这行得通:
<button
onClick={ !isRecording ? beginRecording : endRecording } >
</button>
这很有效:
<button
onClick={ () => { modalPortal.current.open() } } >
</button>
<Modal ref={modalPortal}>
<h1>Congratulations!</h1>
<p>If this modal opened, you find javascript syntax seamless and intuitive</p>
</Modal>
在一起,没有bueno。
<button
onClick={!isRecording ? () => {modalPortal.current.open();beginRecording} : endRecording } >
</button>
错误:
react-expected-an-assignment-or-function-call-and-instead-saw-an-expression
详情:
这是在函数组件内部。 isRecording & endRecording 等是定义我在应用程序中所在页面的功能组件范围内的对象中的状态,modalPortal 是参考:
export default function RecordPage()
{
let [audioURL, isRecording, beginRecording, endRecording, timer] = RecorderContext();
const modalPortal = useRef(null);
...
}
我还尝试了将其传递给执行条件评估等的单个函数的各种排列
onClick={ doManyThings() } >
无论有无箭头,无论是括号还是传入参数,如果没有,似乎都不起作用。我希望有知识的人给出明确的答案!
对我尝试过但不起作用的事情的引用:
Conditional onClick from ternary
Call multiple functions onClick ReactJS
Setting conditional onClick behaviour in React Component
React: Expected an assignment or function call and instead saw an expression
【问题讨论】:
-
如果要使用第二种语法,请使用
beginRecording()和endRecording()。您不能像这样混合和匹配函数调用和函数引用。或者,只是有一个封装三元的函数,并停止在视图中执行条件逻辑。 -
你只需要做
onClick={ () => doManyThings() } -
@Yadab - 试过了 - 不,确实是缺少括号。我还不明白为什么将它们放在一个上下文中并在另一个上下文中神秘地停止编译器在语法上是有效的
-
函数名只是对该函数的引用,即
doManyThings,当您添加括号doManyThings()时,您正在调用该函数。onClick={doManyThings}在功能上几乎等同于onClick={() => doManyThings()}。在 React 中的许多情况下,你会看到括号被丢弃有几个原因:(1) onClick 回调不关心点击事件,(2) 回调不需要传递任何参数。跨度>
标签: javascript reactjs jsx