目录

重复渲染

简介:在 react 中 props 和state改变时,子组件会重新渲染

React.memo()

简介:子组件不操作props和state 使用 React.memo() 控制子组件重复渲染
  • React v16.6引进来的新属性,用来控制函数组件的重新渲染
  • 将组件作为函数(memo)的参数,函数的返回值(Child)是一个新的组件

例子

import * as React from "react";
import { View, Button, Text } from "@tarojs/components"; const UseChild: React.FC = React.memo(() => {
console.log("渲染了11111");
return <View>子1</View>;
}); const UseChild2: React.FC = React.memo(() => {
console.log("渲染了2222");
return <View>子2</View>;
}); const UseTest: React.FC = () => {
const [state, setState] = React.useState(0);
const add = () => {
// 只会渲染一次
setState(val => val + 1);
};
return (
<View>
<Text>{state}</Text>
<Button onClick={add}>支付</Button>
<UseChild></UseChild>
<UseChild2></UseChild2>
</View>
);
}; export default UseTest;

React.useMemo

简介:如果参数是对象,使用 React.useMemo 控制子组件重复渲染

例子

import * as React from "react";
import { View, Button, Text } from "@tarojs/components"; // === 父组件 ===
const UseTest: React.FC = () => {
const [count, setCount] = React.useState(0);
const increment = () => {
setCount(count + 1);
}; // 备注:如果是 useState 解构的 子组件不会重复渲染
// const [userInfo, setUserInfo] = useState({ name: "小明", age: 18 }); // const userInfo = { name: "小明", age: 18 }; 子组件会重复渲染
const userInfo = React.useMemo(() => ({ name: "小明", age: 18 }), []);
return (
<View>
<Button onClick={increment}>点击次数:{count}</Button>
<UseChild userInfo={userInfo}></UseChild>
</View>
);
}; // === 子组件 ===
const UseChild: any = React.memo((props: any) => {
const { userInfo } = props;
console.log("渲染了11111", userInfo);
return (
<View>
<View>{userInfo.name}</View>
<View>{userInfo.age}</View>
</View>
);
}); export default UseTest;

React.useMemo 也可以绑定 jsx和tsx对象

const TestChild: React.FC = React.memo(props => {
console.log("渲染 1111");
return (
<View>
<Text>child 组件 </Text>
{props.children}
</View>
);
}); const TestParent: React.FC = () => {
const [state, setState] = React.useState(0);
// 子组件只会渲染一次
const el = React.useMemo(() => {
return <View>22222</View>;
}, []);
return (
<View>
<Button onClick={() => setState(state + 1)}>点击次数{state}</Button>
<TestChild>{el}</TestChild>
</View>
);
};

React.useCallback()

  • 改变父元素的state值,近而渲染父组件
  • 父组件渲染时,会重新渲染onclick事件,近而连锁反应,被动传值给子组件,导致子组件渲染
  • 如果props传入的是 基础数据类型,子组件不会渲染

例子

import * as React from "react";
import { View, Button, Text } from "@tarojs/components"; // === 父组件 ===
const UseTest: React.FC = () => {
const [name, setName] = React.useState("zhangds"); // 会重复渲染子组件
// const click = () => {
// setName(name);
// }; // 只会渲染一次
const click = React.useCallback((name: string) => {
setName(name);
}, []); return (
<View>
<Text>{name}</Text>
<UseChild name="zhangds" click={click}></UseChild>
</View>
);
}; // === 子组件 ===
const UseChild: any = React.memo((props: any) => {
const { name, click } = props;
console.log("渲染了11111", name);
return (
<View>
<Button onClick={() => click("zhudachang")}>sss</Button>
</View>
);
}); export default UseTest;

react hooks 渲染性能的更多相关文章

  1. react+redux渲染性能优化原理

    大家都知道,react的一个痛点就是非父子关系的组件之间的通信,其官方文档对此也并不避讳: For communication between two components that don't ha ...

  2. useMemo优化React Hooks程序性能(九)

    useMemo主要用来解决使用React hooks产生的无用渲染的性能问题.使用function的形式来声明组件,失去了shouldCompnentUpdate(在组件更新之前)这个生命周期,也就是 ...

  3. React + Reflux 渲染性能优化原理

    作者:ManfredHu 链接:http://www.manfredhu.com/2016/11/08/23-reactRenderingPrinciple 声明:版权所有,转载请保留本段信息,否则请 ...

  4. reselect是怎样提升react组件渲染性能的?

    reselect是什么? reselect是配合redux使用的一款轻量型的状态选择库,目的在于当store中的state重新改变之后,使得局部未改变的状态不会因为整体的state变化而全部重新渲染, ...

  5. 相当有用的react+redux渲染性能优化原理

    学习地址:http://foio.github.io/react-redux-performance-boost/

  6. React爬坑秘籍(一)——提升渲染性能

    React爬坑秘籍(一)--提升渲染性能 ##前言 来到腾讯实习后,有幸八月份开始了腾讯办公助手PC端的开发.因为办公助手主推的是移动端,所以导师也是大胆的让我们实习生来技术选型并开发,他来做code ...

  7. 你真的会用react hooks?看看eslint警告吧!(如何发请求、提升代码性能等问题)

    前言 看过几个react hooks 的项目,控制台上几百条警告,大多是语法不规范,react hooks 使用有风险,也有项目直接没开eslint.当然,这些项目肯定跑起来了,因为react自身或者 ...

  8. react新特性 react hooks

    本文介绍的是react新特性react hooks,本文面向的是有一定react开发经验的小伙伴,如果你对react还不是很熟悉的话我建议你先学习react并多多联系. 首先我们都知道react有3种 ...

  9. 30分钟精通React今年最劲爆的新特性——React Hooks

    你还在为该使用无状态组件(Function)还是有状态组件(Class)而烦恼吗? --拥有了hooks,你再也不需要写Class了,你的所有组件都将是Function. 你还在为搞不清使用哪个生命周 ...

  10. React Hooks 你不来了解下?

    前言 最近在看 React 的新语法-- React Hooks,只能一句话概括:React 语法真的是越来越强大,越写代码越少. 强烈推荐还没看 React Hooks 的同学去学习下,这会让你写r ...

随机推荐

  1. SMU 2024 spring 天梯赛自主训练2

    SMU 2024 spring 天梯赛自主训练2 7-1 I Love GPLT - SMU 2024 spring 天梯赛自主训练2 (pintia.cn) PHP 点击查看代码 I L o v e ...

  2. WPF控件结构与Content理解

    WPF控件结构 WPF中控件继承图 我们平时所用的容器如Grid.StackPanel等都是继承Panel 控件类型分为3组:内容控件.Items控件.TextBoxBase 如何理解Content? ...

  3. .netcore生命周期、消息管道

    .NET Core 的初始化过程涉及多个步骤,这些步骤从应用程序的启动开始,一直到应用程序准备好处理请求.下面是一个简化的概述,描述了 .NET Core 应用程序(特别是 ASP.NET Core ...

  4. C++开发分类

    1.基础架构 2.音视频领域 3.安全方向 4.Linux虚拟化 5.Qt客户端.上位机 6.游戏领域 7.嵌入式 8.量化券商 暂时对基础架构.音视频和安全方向较为感兴趣.

  5. Diskpart 操作

    DiskPart 是 Windows 操作系统中的一个命令行工具,用于管理磁盘分区.它可以创建.删除.格式化和调整分区大小,还可以设置活动分区等.以下是一些常用的 DiskPart 命令和操作步骤. ...

  6. 一个故事讲解https

    1   序言 今天来聊一聊https 安全传输的原理. 在开始之前,我们来虚构两个人物, 一个是位于中国的张大胖(怎么又是你?!), 还有一个是位于米国的Bill (怎么还是你?!). 这俩哥们隔着千 ...

  7. 《放弃繁琐的if-else》开启Assert断言的新时代

    一.场景再现 我们平时在service操作数据库,难免会出现这种情况: if(null == result){ }else{ } 这样的代码会吞噬掉你有限的代码空间,虽然通俗易懂,但一旦爆炸式的袭来, ...

  8. postgresql数据库中 JSON 字段 replace

    一.需求 postgresql 数据库,需要将某些表中的json字段的数据进行替换. 二.做法 思路:将json字段转为text,然后调用replace函数后,将text再转为json update ...

  9. 论文阅读翻译之Deep reinforcement learning from human preferences

    论文阅读翻译之Deep reinforcement learning from human preferences 关于 首次发表日期:2024-09-11 论文原文链接:https://arxiv. ...

  10. 小tips: HTTP 请求过程示例图及名称解释

    一个 HTTP 请求过程示例图: 一个 HTTP 请求需要经历以上过程,接下来看一个具体的例子: 名词解释: Queueing: 在请求队列中的时间. Stalled: 从TCP 连接建立完成,到真正 ...