目录

重复渲染

简介:在 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. 面试官:说说volatile应用和实现原理?

    volatile 是并发编程中的重要关键字,它的名气甚至是可以与 synchronized.ReentrantLock 等齐名,也是属于并发编程五杰之一. 需要注意的是 volatile 并不能保证原 ...

  2. Ynoi2016镜中的昆虫

    [Ynoi 2016] 镜中的昆虫 简化题意 给定长为 \(n\) 序列 \(a\) , 两种操作 \(m\) 次: 1 l r x : 将 \([l , r]\) 修改为 \(x\) 2 l r : ...

  3. Python新手爬虫四:爬取视频

    老样子,先上最后成功源码(在D盘下创建'好看视频'文件夹,直接运行即可获取视频): import sys import re,os import requests from you_get impor ...

  4. C# WinForm避免程序重复启动,限制程序只能运行一个实例【转】

    记录一下,原文:https://blog.csdn.net/xggbest/article/details/104231935 禁止多个进程运行,当重复运行时激活以前的进程 Program.cs: u ...

  5. RabbitMQ核心概念以及工作原理【转】

    RabbitMQ核心概念以及工作原理 我们来看看流行的RabbitMQ消息系统以及它是如何让你的系统之间进行解耦的. 英文原文   RabbitMQ 在这篇短文里,我们会介绍什么是RabbitMQ,它 ...

  6. Coursera, Big Data 5, Graph Analytics for Big Data, Week 5

    Computing Platforms for Graph Analytics programming models for Graphs Giraph and GraphX 其中讲 GraphX 的 ...

  7. ES7学习笔记(四)字段类型(mapping)

    在上一节中,我们创建了索引,在创建索引的时候,我们指定了mapping属性,mapping属性中规定索引中有哪些字段,字段的类型是什么.在mapping中,我们可以定义如下内容: 类型为String的 ...

  8. 【JS设计模式笔记】神奇的魔术师-简单工厂模式(创建型)

    简单工厂模式(Simple Factory):又叫静态工厂方法,由一个工厂对象决定创建某一种产品对象类的实例.主要用来创建同一类对象. 第一次需求 开发一个登录模块的需求,用户名输入框如果输入的内容不 ...

  9. chainLink vrf实验

    目标 用vrf写一个随机红包 数据结构 红包: struct Envelope { Type t; // 类型,只是erc20 和eth红包 ERC20 token; // erc20 ,如果是erc ...

  10. 面试被问到:fiddler 在工作中有哪些应用?怎么破?

    作为软件测试工程师,如果你的简历中有涉及到 fiddler 这款工具,出去面试可能会被问到:fiddler 在工作中有哪些应用? 我们都知道 fiddler 是一款非常优秀的调试代理工具,用于记录客户 ...