javascript - 为什么两个按钮都会重新渲染?
问题描述
在下面的程序中,只要我单击任何按钮,即使我使用了React.memo()
. 也只有其他按钮会重新渲染而不是其他计数。为什么?我有一个这样的父组件:
import React, { useState } from 'react'
import Count from './Count'
import Button from './Button'
import Title from './Title'
function ParentComponent() {
const [age, setAge] = useState(25)
const [salary, setSalary] = useState(50000)
const incrementAge = () => {
setAge(age + 1)
}
const incrementSalary = () => {
setSalary(salary + 1000)
}
return (
<div>
<Title />
<Count text="Age" count={age} />
<Button handleClick={incrementAge}>Increment Age</Button>
<Count text="Salary" count={salary} />
<Button handleClick={incrementSalary}>Increment Salary</Button>
</div>
)
}
export default ParentComponent
具有如下定义的 3 个子组件:
标题.js
import React from 'react'
function Title() {
console.log('Rendering Title')
return (
<h2>
useCallback Hook
</h2>
)
}
export default React.memo(Title)
计数.js
import React from 'react'
function Count({ text, count }) {
console.log(`Rendering ${text}`)
return <div>{text} - {count}</div>
}
export default React.memo(Count)
按钮.js
import React from 'react'
function Button({ handleClick, children }) {
console.log('Rendering button - ', children)
return (
<button onClick={handleClick}>
{children}
</button>
)
}
export default React.memo(Button)
解决方案
我会在这里解释
首先,每当您更新本地状态时,您的渲染函数都会重新运行,因此您的所有子组件都将重新渲染
当您单击年龄按钮时,年龄按钮会重新渲染,因为道具发生变化,工资按钮会重新渲染,因为incrementSalary
如果您不使用 a 包装,则将其视为新功能useCallback
,因此新道具被传递给Button
因此重新渲染
但是,您的工资计数组件的道具count={salary}
从未改变,因此react.memo
将阻止它重新渲染。
推荐阅读
- scala - 函数定义中的“简单表达式的非法开始”
- uwp - 如何在 UWP 中导入会话密钥(RSA 公钥交换)
- python-3.x - 关于回文序列的 Python 代码
- javascript - 如何在完整日历中的所有单元格日显示文本
- scala - 如何过滤类型为(String,Seq(String,String,...))的元组中的'@'字符?
- python-3.x - 如何在 python 中为 request.get() 传递 Jwt 令牌
- python-3.x - 给定网格点查找对应的矩形坐标
- flutter - 在另一个选项卡视图内的选项卡视图内的小部件树中检测到重复的 GlobalKey
- spring-webflux - 如何在 Spring Boot 中配置嵌入式 Reactive Netty 以便能够使用“|”处理获取请求 在查询中
- jsf - 使用 ui:params 初始化 JSF 控制器的正确方法