Reactjs 在REACT中,是否有更好的方法来确定组件是否已卸载?

Reactjs 在REACT中,是否有更好的方法来确定组件是否已卸载?,reactjs,Reactjs,我知道通常的想法是在didMount/didmunmount中设置一个指示器。但这意味着我必须保卫每一个州。太冗长了 旋转按钮: const SpinningButton = props => { const [spinning, setSpinning] = useState(false) const handleClick = useCallback((evt) => { setSpinning(true) props.onClick().then

我知道通常的想法是在didMount/didmunmount中设置一个指示器。但这意味着我必须保卫每一个州。太冗长了

旋转按钮

const SpinningButton = props => {

  const [spinning, setSpinning] = useState(false)

  const handleClick = useCallback((evt) => {

    setSpinning(true)

    props.onClick().then(() => {
      setSpinning(false)
    }, err => {
      setSpinning(false)
    })
  })

  return <Button onClick={handleClick} loading={spinning}>Spinning</Button>
}
const SpinningButton=props=>{
常数[旋转、固定]=useState(假)
const handleClick=useCallback((evt)=>{
固定(真)
props.onClick()然后(()=>{
固定(假)
},err=>{
固定(假)
})
})
回程纺纱
}
我使用它的地方:

const Page = props => {
  const [hidden, setHidden] = useState(false)
  if (hidden) return null
  return <SpinningButton onClick={() => {
    return fetch("https://...").then(d => {
      setHidden(true)
    })
  }} />
}
const Page=props=>{
const[hidden,setHidden]=useState(false)
如果(隐藏)返回null
返回{
返回取回(“https://...)然后(d=>{
setHidden(真)
})
}} />
}

如果您在继续之前必须检查您的组件是否已卸载,那么您就做错了。 但是,如果没有代码,任何人都无法告诉您出了什么问题

但是,您可以通过将它包装到另一个函数来保护您的
setState

componentDidMount() {
   this.mounted = true;
}

setStateSafe(obj) {
   if (this.mounted) {
      this.setState({obj})
   }
}
// and use setStateSafe insdead of setState in your code everywhere
话虽如此。这是一个反模式,您应该尽量避免它


阅读更多有关它的信息

如果它已经到了必须检查组件是否已卸载的地步,则说明您做错了什么。 但是,如果没有代码,任何人都无法告诉您出了什么问题

但是,您可以通过将它包装到另一个函数来保护您的
setState

componentDidMount() {
   this.mounted = true;
}

setStateSafe(obj) {
   if (this.mounted) {
      this.setState({obj})
   }
}
// and use setStateSafe insdead of setState in your code everywhere
话虽如此。这是一个反模式,您应该尽量避免它


阅读更多关于它的信息

必须保卫每一个州吗?你是什么意思?我的意思是在卸载组件后可以调用每个setState。我不介意确保其中一些是安全的。所以我保护他们所有人。这就是我所说的。唯一重要的是,如果你正在做一些异步的事情,比如API调用,并且你想在
setState
有响应时检查它是否被装载。我能想到的使用
componentDidUnmount
的唯一其他时间是清除超时、间隔或分离事件侦听器。所有这些东西都应该是非常罕见的,最多只在少数几个组件中。如果你在任何情况下都在为每一个
setState
这样做,那是完全没有必要的。你必须保护每一个serState吗?你是什么意思?我的意思是在卸载组件后可以调用每个setState。我不介意确保其中一些是安全的。所以我保护他们所有人。这就是我所说的。唯一重要的是,如果你正在做一些异步的事情,比如API调用,并且你想在
setState
有响应时检查它是否被装载。我能想到的使用
componentDidUnmount
的唯一其他时间是清除超时、间隔或分离事件侦听器。所有这些东西都应该是非常罕见的,最多只在少数几个组件中。如果您在任何情况下都要对每个
setState
执行此操作,则完全没有必要。我确实在Promise中调用了setState。然后在click事件处理程序中调用了。我应该使用makecancelablepromise吗?@SinghiJohn是的,你应该!我确实在Promise中调用了setState,然后在click事件处理程序中调用了setState。我应该使用makecancelablepromise吗?@SinghiJohn是的,你应该!