道具的变化(终极版)使用useState时重置本地状态 - 更新(Props change (red

2019-10-29 03:09发布

我重写我的类组件到功能组件。 单组分同时使用终极版和本地状态,我注意到,每一次的道具(Redux的状态)的变化, useState钩被执行,重置本地状态。 这是预期的行为,以及如何保持本地状态?

老(简体)

class MyComponent extends React.Component {
  constructor(props) {
    super(props);
    this.state = {
      count: 0
    }
  }

// Count gets reset to 0 every time reduxState changes
const MyComponent = ({reduxState}) => {

  const [count, setCount] = useState(0)

UPDATE - 这个问题的原因是没有在重构到功能组件。 我有一个父(高阶成分)重新创建上改变Redux的状态下缠绕组件。 为了清楚起见,这里是稍微简化HOC

import React, {useEffect} from 'react'
import { connect } from 'react-redux'

import { fetchObject } from '../actions/objects'
import { fetchIfNeeded } from '../utils'

const withObject = ({element}) => WrappedComponent => ({id, ...rest}) => {
  const Fetcher = ({status, object, fetchObject}) => {
    useEffect(() => {
      fetchIfNeeded(
        status,
        ()=>fetchObject(element, id),
      )
    })

    // THIS SECTION IS THE CAUSE OF MY PROBLEM
    // Handle loading and error status
    if (status && status.error) return <>error loading: {status.error.message}</>
    if (status === undefined || object === undefined || status.isFetching) return <>loading</>
    // END OF SECTION

    // Pass through the id for immediate access
    return <WrappedComponent {...{object, status, id}} {...rest} />
  }

  const mapStateToProps = state => ({
    object: state.data[element][id],
    status: state.objects[element][id]
  })

  const mapDispatchToProps = {
    fetchObject
  }

  const WithConnect = connect(mapStateToProps, mapDispatchToProps)(Fetcher)
  return <WithConnect/>
}

export default withObject

UPDATE2:代码样品上方已被更新以突出问题的部分。 每次状态改变(如isFetching: true )时,专门返回不同的组件,以反映这一点。 当它再次更改为isFetching: false ,创建包裹组件的一个实例,并返回,失去了它原来的状态。

总之,这是一个坏主意,从依赖于终极版状态的HOC返回不同的组件。 这应该在常规组件来处理。

文章来源: Props change (redux) resets the local state when using useState - updated