反应|如何停止在React组件中重新渲染
#javascript #教程 #react #性能

如何避免React组件中不必要的重新租赁

React从早期阶段已经走了很长一段路。我们中的许多人仍然发现很难修复不必要的重新租赁。

有许多方法可以避免重新租赁。在这里,我正在讨论一些方法和方法,以避免在React中进行不必要的重新订阅。

用useref()挂钩替换usestate()。
使用重新选择库创建回忆的选择器
使用SWR A React Hooks库进行数据获取。
使用usememo()和usecallback()挂钩的备忘录。

* 1。用useref()挂钩替换usestate()。
*

usestate()是钩子在反应功能组件中常用的钩子,以重新渲染状态变化的组件。但是在某些情况下,我们需要跟踪更新而不重新渲染组件。为了解决这个问题,我们可以使用useref()挂钩,当我们使用useref()进行更新时,它不会重新渲染与usestate()

usestate()的示例:

function inputWithState() {
  const [value, setValue] = useState("");
  return (
    <input 
      value={value} 
      onChange={e => setValue(e.target.value)} 
      type={type} 
    />
  );
}

在此示例中

with useref()示例:

function inputWithRef() {
  const inputEl = useRef(null);
  console.log(inputEl?.current?.value);
  return (
    <input ref={inputEl} type="text" />
  );
}

在此示例中,您输入输入的内容,您都可以使用输入参考读取该输入。这种方法避免在每次击键上进行不必要的重新渲染。

2。使用重新选择库创建回忆的选择器

React组件具有快速的生命周期,由于如此多的重新渲染,它们总是遭受损失,从而导致生产时间和性能。为此,开发人员创建了一个第三方性能库重新选择,这是一个流行库的包装器重新选择,该包装库与Redux一起使用,通过编码回忆的选择器来改善性能。

选择器可以计算派生的数据,从而允许Redux存储最小可能的状态。
选择器是有效的。除非其参数之一更改,否则不会重新计算选择器。
选择器是可以组合的。它们可以用作其他选择器的输入。

示例:

import { createSelector } from 'reselect'
const selectShopItems = state => state.shop.items
const selectTaxPercent = state => state.shop.taxPercent
const selectSubtotal = createSelector(selectShopItems, items =>
  items.reduce((subtotal, item) => subtotal + item.value, 0)
)
const selectTax = createSelector(
  selectSubtotal,
  selectTaxPercent,
  (subtotal, taxPercent) => subtotal * (taxPercent / 100)
)
const selectTotal = createSelector(
  selectSubtotal,
  selectTax,
  (subtotal, tax) => ({ total: subtotal + tax })
)
const exampleState = {
  shop: {
    taxPercent: 8,
    items: [
      { name: 'apple', value: 1.2 },
      { name: 'orange', value: 0.95 }
    ]
  }
}
console.log(selectSubtotal(exampleState)) // 2.15
console.log(selectTax(exampleState)) // 0.172
console.log(selectTotal(exampleState)) // { total: 2.322 }

在这里,CreateSelector将2个选择器作为输入,并返回回忆版。在值不同之前,将不再使用此记忆版本重新计算选择器。

虽然重新选择不是redux独有的,但默认情况下它已包含在官方的redux工具包软件包中 - 不需要进一步安装。

3。使用SWR A React Hooks库进行数据获取
SWR是用于数据获取的React Hooks库。

这个名称swr swr源自陈旧的重新值。 SWR首先返回来自CACH(陈旧)的数据,然后发送请求(重新验证),最后再次带有最新数据。它将阻止组件重新渲染多次。

只需一个钩子,您就可以显着简化项目中的数据获取逻辑。它还涵盖了速度,正确性和稳定性的各个方面,以帮助您更好地建立。

示例:

function Profile() {
  const { data, error } = useSWR('/api/user', fetcher)

  if (error) return <div>failed to load</div>
  if (!data) return <div>loading...</div>
  return <div>hello {data.name}!</div>
}

请参阅此处的更多信息和示例:https://swr.vercel.app/

4。使用usememo()和usecallback()挂钩
备忘录 仅当道具中有更新时,备忘录才能使我们的React代码重新渲染组件。通过这种方法,开发人员可以避免不必要的重新渲染并减少应用程序中的计算负载。

React提供了两个钩子来创建回忆:

usememo()
usecallback()
这些钩子通过缓存并返回相同输出的情况下的重新渲染,如果输入相同,没有任何计算。当输入更新时,缓存将无效并渲染新组件状态。

usememo()
此挂钩用于记忆函数调用和渲染之间的计算结果。

示例:

const expensiveFunction = (inputValue) => {
  let expensiveValue = inputValue * 42;
  //... lots and lots of computing including inputValue ...
  expensiveValue = 'World';
  return expensiveValue;
};
const MyComponent = ({ something }) => {
  const [inputValue, setInputValue] = useState('');  
  const expensiveValue = useMemo(
    () => expensiveFunction(inputValue), 
    [ inputValue ]
  );  
  return <h1>Hello {expensiveValue}</h1>;
};

2。 usecallback()

这是实现纪念的另一个反应钩。但是,与usememo()不同,它不会缓存结果。相反,它记忆了提供给它的回调函数。

示例:

function item() {
  const onClick = useCallback(event => {
    console.log('Clicked Item : ', event.currentTarget);
  }, [item]);
 return (
    <li={item} onClick={onClick} />
  );
}

例如,usecallback()记忆了OnClick回调。因此,如果用户一次又一次单击同一项目,则不会重新渲染组件。

希望本文可以帮助开发人员解决React组件中的重新汇总问题。请帮助您学习是否有其他方法或技术可以避免在React中重新呈现React。请在评论中添加。

感谢您的阅读。欢呼!!!。

你很棒!