Это занимает более 30 секунд (вместо 1 секунды), поэтому я не думаю, что он правильно использует useMemo
:
<body>
<script src="https://unpkg.com/react@16.12.0/umd/react.development.js" crossorigin></script>
<script src="https://unpkg.com/react-dom@16.12.0/umd/react-dom.development.js" crossorigin></script>
<script src="https://unpkg.com/@babel/standalone@7.8.4/babel.min.js" crossorigin></script>
<div id="root"></div>
<script type="text/babel">
function Fib({n}) {
const m = Number(n)
console.log("Fib", m);
const fib = (n) => {
if (n <= 1) return n;
else return fib(n-1) + fib(n-2);
}
const result = React.useMemo(() => fib(m), [m]);
return <li key={m}>Fibonacci({m}) is {result}</li>;
}
function App() {
return (
<ul>
{ Array.from({length: 41}).map((e,i) =>
<Fib key={i} n={i} />
)}
</ul>
)
}
ReactDOM.render(<App />, document.querySelector("#root"));
</script>
</body>
Кажется, на самом деле это должно быть:
const fib = (n) => {
if (n <= 1) return n;
else return React.useMemo(() => fib(m - 1), [m - 1]) + React.useMemo(() => fib(m - 2), [m - 2]);
}
const result = React.useMemo(() => fib(m), [m]);
, но useMemo()
должен использоваться в функции "верхнего уровня". Можно ли заставить его работать?