1. Giả sử có 1 chương trình rất nặng như sau
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 |
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>ReactJS</title> </head> <body> <div id="app"></div> <script crossorigin src="https://unpkg.com/react@17/umd/react.development.js"></script> <script crossorigin src="https://unpkg.com/react-dom@17/umd/react-dom.development.js"></script> <script src="https://unpkg.com/babel-standalone@6/babel.min.js"></script> <script type="text/babel"> const { useState, useEffect, useMemo } = React; // Mình giả sử có 1 function rất nặng cần khởi chạy như sau const expensiveFunction = (number) => { const start = new Date(); console.log("Start expensiveFunction", start.getTime()); while (new Date() - start < 500); console.log("End expensiveFunction", new Date().getTime()); return number * 2; } function App(props) { const [count, setCount] = useState(0); const [number, setNumber] = useState(0) // Như vậy, mỗi lần re-render lại, expensiveFunction lại tiếp tục chạy lại const square_number = expensiveFunction(number); // Và ta đã thấy, chương trình nặng khủng khiếp. // Khi thay đổi giá trị count (mặc dù ko liên quan) ==> vẫn phải run lại hàm expensiveFunction return ( <div> <p>Count: {count}</p> <button onClick={() => { setCount(count + 1) }}>Increase Count</button> <p>Count: {number}</p> <p>Square_number: {square_number}</p> <button onClick={() => { setNumber(number + 1) }}>Increase Number</button> </div> ) } ReactDOM.render( <App />, document.getElementById('app') ); </script> </body> </html> |
2. Sử dụng useMemo()
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 |
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>ReactJS</title> </head> <body> <div id="app"></div> <script crossorigin src="https://unpkg.com/react@17/umd/react.development.js"></script> <script crossorigin src="https://unpkg.com/react-dom@17/umd/react-dom.development.js"></script> <script src="https://unpkg.com/babel-standalone@6/babel.min.js"></script> <script type="text/babel"> const { useState, useEffect, useMemo } = React; // Mình giả sử có 1 function rất nặng cần khởi chạy như sau const expensiveFunction = (number) => { const start = new Date(); console.log("Start expensiveFunction", start.getTime()); while (new Date() - start < 500); console.log("End expensiveFunction", new Date().getTime()); return number * 2; } function App(props) { const [count, setCount] = useState(0); const [number, setNumber] = useState(0); // Khi dùng useMemo ==> square_number chỉ phải lại hàm expensiveFunction(number) khi [number] có sự thay đổi const square_number = useMemo( () => expensiveFunction(number), [number] ); // Khi thay đổi giá trị count (giá trị ko liên quan) ==> chương trình chạy rất ngon // Chỉ khi thay đổi giá trị number ==> mới cần phải run lại hàm expensiveFunction ==> lúc này chương trình mới nặng trở lại return ( <div> <p>Count: {count}</p> <button onClick={() => { setCount(count + 1) }}>Increase Count</button> <p>Count: {number}</p> <p>Square_number: {square_number}</p> <button onClick={() => { setNumber(number + 1) }}>Increase Number</button> </div> ) } ReactDOM.render( <App />, document.getElementById('app') ); </script> </body> </html> |