iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >React useMemo和useCallback的使用情景
  • 802
分享到

React useMemo和useCallback的使用情景

2023-06-14 11:06:15 802人浏览 独家记忆
摘要

这篇文章主要讲解了“React useMemo和useCallback的使用情景”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“React useMemo和useCallback的使用情景”吧

这篇文章主要讲解了“React useMemo和useCallback的使用情景”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“React useMemo和useCallback的使用情景”吧!

useMemo

我们知道当父组件发生重新渲染时,其所有(状态、局部变量等)都是新的。一旦子组件依赖于父组件的某一个对象变量,那么无论对象是否发生变化,子组件拿到的都是新的对象,从而使子组件对应的 diff 失效,依旧会重新执行该部分逻辑。在下面的例子中,我们的副作用依赖项中包含了父组件传入的对象参数,每次父组件发生更新时,都会触发数据请求。

function Info({  style,}) {  console.log('Info 发生渲染');  useEffect(() => {    console.log('重新加载数据'); // 每次发生重新渲染时,都会重新加载数据  }, [style]);  return (    <p style={style}>      这是 Info 里的文字    </p>  );}function Page() {  console.log('Page 发生渲染');  const [count, setCount] = useState(0);  const style = { color: 'red' };  // 计数器 +1 时,引发 Page 的重新渲染,进而引发 Info 的重新渲染  return (    <div>      <h5>计数值为:{count}</h5>      <button onClick={() => setCount(count + 1)}> +1 </button>      <Info style={style} />    </div>  );}

React Hooks 给我们提供了解决方案,useMemo 允许我们缓存传入的对象,仅当依赖项发生变化时,才重新计算并更新相应的对象。

function Page() {  console.log('Page 发生渲染');  const [color] = useState('red');  const [count, setCount] = useState(0);  const style = useMemo(() => ({ color }), [color]); // 只有 color 发生实质性改变时,style 才会变化  // 计数器 +1 时,引发 Page 的重新渲染,进而引发 Info 的重新渲染  // 但是由于 style 缓存了,因此不会触发 Info 内的数据重新加载  return (    <div>      <h5>计数值为:{count}</h5>      <button onClick={() => setCount(count + 1)}> +1 </button>      <Info style={style} />    </div>  );}

useCallback

React Hooks 在数据流上带来的变化有两点:一是支持更友好的使用 context 进行状态管理,避免层级过多时向中间层承载无关参数;二是允许函数参与到数据流中,避免向下层组件传入多余的参数。

useContext 作为 hooks 的核心模块之一,可以获取到传入 context 的当前值,以此达到跨层通信的目的。React 官网有着详细的介绍,需要关注的是一旦 context 值发生改变,所有使用了该 context 的组件都会重新渲染。为了避免无关的组件重绘,我们需要合理的构建 context ,比如从第一节提到的新思维模式出发,按状态的相关度组织 context,将相关状态存储在同一个 context 中。

在过去,如果父子组件用到同一个数据请求方法 getData ,而该方法又依赖于上层传入的 query 值时,通常需要将 query 和 getData 方法一起传递给子组件,子组件通过判断 query 值来决定是否重新执行 getData。

class Parent extends React.Component {   state = {    query: 'keyWord',  }  getData() {    const url = `https://mocks.alibaba-inc.com/mock/fO87jdfKqX/demo/queryData.JSON?query=${this.state.query}`;    // 请求数据...    console.log(`请求路径为:${url}`);  }  render() {    return (      // 传递了一个子组件不渲染的 query 值      <Child getData={this.getData} query={this.state.query} />    );  }}class Child extends React.Component {  componentDidMount() {    this.props.getData();  }  componentDidUpdate(prevProps) {    // if (prevProps.getData !== this.props.getData) { // 该条件始终为 true    //   this.props.getData();    // }    if (prevProps.query !== this.props.query) { // 只能借助 query 值来做判断      this.props.getData();    }  }  render() {    return (      // ...    );  }}

在 React Hooks 中 useCallback 支持我们缓存某一函数,当且仅当依赖项发生变化时,才更新该函数。这使得我们可以在子组件中配合 useEffect ,实现按需加载。通过 hooks 的配合,使得函数不再仅仅是一个方法,而是可以作为一个值参与到应用的数据流中。

function Parent() {  const [count, setCount] = useState(0);  const [query, setQuery] = useState('keyword');  const getData = useCallback(() => {    const url = `Https://mocks.alibaba-inc.com/mock/fO87jdfKqX/demo/queryData.json?query=${query}`;    // 请求数据...    console.log(`请求路径为:${url}`);  }, [query]);  // 当且仅当 query 改变时 getData 才更新  // 计数值的变化并不会引起 Child 重新请求数据  return (    <>      <h5>计数值为:{count}</h5>      <button onClick={() => setCount(count + 1)}> +1 </button>      <input onChange={(e) => {setQuery(e.target.value)}} />      <Child getData={getData} />    </>  );}function Child({  getData}) {  useEffect(() => {    getData();  }, [getData]); // 函数可以作为依赖项参与到数据流中  return (    // ...  );}

感谢各位的阅读,以上就是“React useMemo和useCallback的使用情景”的内容了,经过本文的学习后,相信大家对React useMemo和useCallback的使用情景这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是编程网,小编将为大家推送更多相关知识点的文章,欢迎关注!

--结束END--

本文标题: React useMemo和useCallback的使用情景

本文链接: https://www.lsjlt.com/news/270323.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作