【发布时间】:2020-05-16 23:07:47
【问题描述】:
我的状态宽度随着窗口调整大小和 showFilters 的变化而变化,作为道具从 true 变为 false。我想在卸载时删除监听器。因此,我为每个这些条件使用了三个 useState。 那么,我可以做任何重构以在单个 useEffect 中使用所有这些吗?
import React, { useEffect, useRef, useState } from 'react'
import PropTypes from 'prop-types'
import { Icon } from 'antd'
import TrendsChart from './trendsChart'
import styled from '../styled-components'
const Chart = ({ showFilters }) => {
const [width, setWidth] = useState(null)
useEffect(() => {
window.addEventListener('resize', handleWindowResize)
updateWidth()
}, [width])
useEffect(() => {
setTimeout(updateWidth, 200)
}, [showFilters])
useEffect(() => () => {
window.removeEventListener('resize', handleWindowResize)
})
const updateWidth = () => {
const containerWidth = chartRef.current.clientWidth
setWidth(Math.floor(containerWidth))
}
const handleWindowResize = () => {
updateWidth()
}
const chartRef = useRef()
function render() {
return (
<styled.chart>
<styled.chartHeader>
Daily
</styled.chartHeader>
<styled.trendsChart id="chartRef" ref={chartRef}>
<TrendsChart width={width} showFilters={showFilters}/>
</styled.trendsChart>
<div>
<Icon type="dash" /> Credit Trend
</div>
</styled.chart>
)
}
return (
render()
)
}
Chart.propTypes = {
showFilters: PropTypes.bool.isRequired
}
export default Chart
【问题讨论】:
-
你能重构吗?是的,你可以。 你应该重构吗?不。问题是,为什么?你为什么要这样做?
-
钩子的全部意义在于“订阅”/“收听”您想要的那些依赖项(道具)。所以保持它们小而简洁。您唯一可以重构的是您的
removeEventListener挂钩,而是从您添加事件侦听器的useEffect返回一个函数。这将在卸载时调用。这被称为“清理效果”:reactjs.org/docs/hooks-effect.html#effects-with-cleanup
标签: javascript reactjs react-hooks