【发布时间】:2019-03-23 15:37:03
【问题描述】:
我正在寻找有关我使用 Hooks 构建 React 树视图应用程序的方法的意见。
这是代码,使用 useCallback、React.memo 和 useState。请注意,一次只能打开一个 1 级项目,其余级别可能同时打开多个项目。
Branch.js:
import React, { useState, useCallback} from 'react'
import Leaf from './Leaf'
const Branch = ({ items }) => {
const [expanded, setExpanded] = useState([])
const clickHandler = useCallback(
({ categoryId, level }) => {
let result
if (level === 1) {
result = expanded.includes(categoryId) ? [] : [categoryId]
} else {
result = expanded.includes(categoryId) ? expanded.filter(item => item !== categoryId) : [ ...new Set([ categoryId, ...expanded])]
}
setExpanded(result)
},[expanded])
return (
<ul>
{items && items.map(item => {
const { categoryId, categoryName, level, eventsCount, children } = item
return (
<Leaf
key={categoryId}
categoryId={categoryId}
name={categoryName}
level={level}
eventsCount={eventsCount}
children={children}
isOpen={expanded.includes(categoryId)}
onClick={clickHandler}
/>
)})}
</ul>
)
}
export default Branch
Leaf.js:
import React from 'react'
import Branch from './Branch'
const Leaf = React.memo(({ name, categoryId, level, children, eventsCount, onClick, isOpen }) => {
const _onClick = () => {
onClick({ categoryId, level })
}
return (
<li className={!isOpen && 'hidden'}>
<button onClick={_onClick}>
<span>{name}</span>
</button>
{children.length ? <Branch items={children}/> : ''}
</li>
)
})
export default Leaf
我希望有人检查代码以了解可能发生的性能(即不必要的重新渲染次数)。我对您对我使用 React.memo 和单击事件处理程序 (useCallback) 的意见感兴趣。
我传递clickHandler 然后接收并触发该处理程序的方式是否会导致或阻止额外的重新渲染?
【问题讨论】:
标签: reactjs react-hooks