目录

重复渲染

简介:在 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. 7E头的那些事儿(帧格式分析实例)

    0. 前言 作为一名嵌入式工程师,经常需要通过UART与外设打交道,而对于串行总线来说,往往我们必须要进行帧同步.通常的做法是把信令包含在2个0x7E的中间. 除此之外还有HDLC.PPP等协议也会到 ...

  2. B2B进销存ERP后台管理系统的逻辑架构与设计,AxureRP原型产品经理实战案例

    模块分析: 进销存系统是一种用于企业管理库存.销售和采购活动的信息系统.它的主要作用包括但不限于以下几个方面: 1.库存管理 实时库存跟踪:准确记录每种商品的库存数量,确保数据的实时性和准确性. 库存 ...

  3. .NET 8 Moq mock GetRequiredKeyedService Setup报错

    .NET 8 Moq mock GetRequiredKeyedService Setup报错 代码有地方用到了IServiceProvider.GetRequiredKeyedService来解析服 ...

  4. Docker学习11-Docker常规方式安装软件

    本文咱们将通过按照Tomcat.按照MySQL.安装Redis这三个实战安装,来熟悉在docker中怎么安装软件,咱们使用端口映射,及数据卷的使用场景 安装的总体步骤: 1:搜索镜像: 2:拉取镜像: ...

  5. 【Docker教程系列】Docker学习5-Docker镜像理解

    通过前面几篇文章的学习,我们已经安装好了Docker,也学会使用一些常用的命令.比如启动命令.镜像命令.容器命令.常用命令分类后的第二个就是镜像命令.那么镜像是什么?拉取镜像的时候为什么是一层一层的? ...

  6. mysql 死锁原因及解决办法

    Mysql 锁类型 一.锁类型介绍: MySQL 有三种锁的级别:页级.表级.行级. 表级锁:开销小,加锁快:不会出现死锁:锁定粒度大,发生锁冲突的概率最高,并发度最低. 行级锁:开销大,加锁慢:会出 ...

  7. Email 关于 POP3 IMAP SMTP office365 Outlook Gmail G-Suit shared mailbox小小理解

    Outlook 是微软的一个 email 软件, 管理 email 的 UI. Gmail 是 google 的 office365 是一个配套, 里面有 email, one drive, exce ...

  8. java_day2_常量,变量,数据类型,运算符

    一.常量 常量:在Java程序运行过程中其值不能发生改变的量 分类: 1.字面值常量: 整数常量 表示所有的整数,包括负数 10 -8 小数常量 表示所有的小数 1.23 -3.14 布尔常量 tru ...

  9. 微信小程序上拉加载

    下面是一个示例,在个人使用的过程中按自己需求进行更改 创建一个DataController控制器 php artisan make:controller DataController 创建一个Data ...

  10. Linux进程调度-组调度及带宽控制

    1. 概述 组调度(task_group)是使用Linux cgroup(control group)的cpu子系统来实现的,可以将进程进行分组,按组来分配CPU资源等. 比如,看一个实际的例子: A ...