8

所以现在我们不能将钩子用作旧样式的事件函数,除了禁用警告之外,调用不违反规则的事件函数的最佳方法是什么

import React, { useState } from 'react';

function Example() {
  // Declare a new state variable, which we'll call "count"
  const [count, setCount] = useState(0);

  return (
    <div>
      <p>You clicked {count} times</p>
      <button onClick={() => setCount(count + 1)}> // Lambdas are forbidden in JSX attributes due to their rendering performance impact (jsx-no-lambda)
        Click me
      </button>
    </div>
  );
}
4

1 回答 1

19

使用钩子创建内联箭头函数的性能损失可以忽略不计,它比类组件具有的好处可以忽略不计,因此您不必担心渲染中的箭头函数。

您可以禁用此 eslint 规则。

但是,您仍然可以通过编写一个increment方法并使用useCallback钩子对其进行记忆来改进您的代码。当您尝试将处理程序传递给嵌套组件时,这特别有用,然后您可以通过使用优化重新渲染React.memo

const Button = React.memo(function Btn({increment}) {
    return (
       <button onClick={increment}>
          Click me
      </button>
    )
})
function Example() {
  // Declare a new state variable, which we'll call "count"
  const [count, setCount] = React.useState(0);
  const increment = React.useCallback(() => {
      setCount(prev => prev+1);
  }, [])
  return (
    <div>
      <p>You clicked {count} times</p>
      <Button increment={increment}/>
    </div>
  );
}

ReactDOM.render(<Example />, document.getElementById('app'));
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/16.8.3/umd/react.production.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/16.8.3/umd/react-dom.production.min.js"></script>
<div id="app"/>

于 2019-03-04T12:53:47.407 回答