📜  React JS 使用Memo Hook

📅  最后修改于: 2022-05-13 01:56:23.598000             🧑  作者: Mango

React JS 使用Memo Hook

useMemo 是在 react 的功能组件中使用的钩子,它返回一个 memoized 值。在计算机科学中,记忆化是一个普遍使用的概念,当我们下次不需要使用给定参数重新计算函数时,它会返回缓存的结果。记忆函数会记住给定输入集的输出结果。例如,如果有一个函数要添加两个数字,并且我们第一次将参数设置为 1 和 2,该函数会将这两个数字相加并返回 3,但是如果再次输入相同的输入,则我们将返回缓存的值即 3 并且不再使用 add函数计算。在 react 中,我们也使用了这个概念,只要在 React 组件中,状态和 props 不会改变组件并且组件不会重新渲染,它会显示相同的输出。 useMemo 钩子用于提高我们的 React 应用程序的性能。

句法:

const memoizedValue = useMemo(functionThatReturnsValue, 
                                   arrayDepencies)

示例:当我们不使用 useMemo Hook 时。

Javascript
import React, {useState} from 'react';
  
function App() {
  const [number, setNumber] = useState(0)
  const squaredNum =  squareNum(number);
  const [counter, setCounter] = useState(0);
  
 // Change the state to the input
  const onChangeHandler = (e) => {
    setNumber(e.target.value);
  }
    
  // Increases the counter by 1
  const counterHander = () => {
    setCounter(counter + 1);
  }
  return (
    
      

Welcome to Geeksforgeeks

                             
OUTPUT: {squaredNum}
             
Counter : {counter}
    
  ); }    // function to square the value function squareNum(number){   console.log("Squaring will be done!");   return Math.pow(number, 2); }    export default App;


Javascript
import React, {useState} from 'react';
  
function App() {
  const [number, setNumber] = useState(0)
  // Using useMemo
  const squaredNum = useMemo(()=> {
    return squareNum(number);
  }, [number])
  const [counter, setCounter] = useState(0);
  
 // Change the state to the input
  const onChangeHandler = (e) => {
    setNumber(e.target.value);
  }
    
  // Increases the counter by 1
  const counterHander = () => {
    setCounter(counter + 1);
  }
  return (
    
      

Welcome to Geeksforgeeks

                             
OUTPUT: {squaredNum}
             
Counter : {counter}
    
  ); }    // function to square the value function squareNum(number){   console.log("Squaring will be done!");   return Math.pow(number, 2); }    export default App;


输出:在上面的示例中,我们有一个 App 组件,该组件正在做两件事,一是在给定输入上对数字进行平方,然后递增计数器。我们这里有两个状态 number 和 counter,每当任何状态更改组件重新渲染时。例如,如果我们改变数字的输入值,函数squareNum 运行,如果再次增加计数器,函数squareNum 运行。我们可以在控制台上看到这一点。

在这种情况下,我们可以看到,即使我们更改了一次输入数字,但多次单击增量计数器,每当我们多次单击增量计数器按钮时,我们的函数squareNum 都会执行。发生这种情况是因为每当我们更改计数器的状态时,App 组件都会重新渲染。

现在让我们使用 useMemo 钩子来解决这个问题。

示例:当我们使用 useMemo Hook

Javascript

import React, {useState} from 'react';
  
function App() {
  const [number, setNumber] = useState(0)
  // Using useMemo
  const squaredNum = useMemo(()=> {
    return squareNum(number);
  }, [number])
  const [counter, setCounter] = useState(0);
  
 // Change the state to the input
  const onChangeHandler = (e) => {
    setNumber(e.target.value);
  }
    
  // Increases the counter by 1
  const counterHander = () => {
    setCounter(counter + 1);
  }
  return (
    
      

Welcome to Geeksforgeeks

                             
OUTPUT: {squaredNum}
             
Counter : {counter}
    
  ); }    // function to square the value function squareNum(number){   console.log("Squaring will be done!");   return Math.pow(number, 2); }    export default App;

输出:现在在上面的例子中,我们使用了用户备忘录挂钩,这里返回值的函数即 squareNum 在 useMemo 和数组依赖项中传递,我们使用了数字,因为 squareNum 仅在数字变化。如果我们增加计数器并且输入字段中的数字保持不变,则 squareNum 不会再次运行。让我们看看下面的输出。

现在我们可以在控制台中看到 squareNum 仅在输入框发生变化时才运行,而不是在单击增量计数器的按钮时运行。

注意:记忆从来都不是免费的,我们是在用空间换时间。