【问题标题】:Can i pass component state to HoC?我可以将组件状态传递给 HoC 吗?
【发布时间】:2019-02-22 09:39:08
【问题描述】:

有没有办法将数据从组件的状态发送到 HoC?

我的组件

import React, { Component } from 'react';
import withHandleError from './withHandleError';

class SendScreen extends Component {

  contructor() {
    super();
    this.state = {
      error: true
    }
  }

  render() {
    return (
    <div> Test </div>
    )
  }
};


export default withHandleError(SendScreen)

我的 HoC 组件:

import React, { Component } from 'react';
import { ErrorScreen } from '../../ErrorScreen';
import { View } from 'react-native';

export default Cmp => {
  return class extends Component {
    render() {
      const { ...rest } = this.props;
      console.log(this.state.error)  //// Cannot read property 'error' of null
      if (error) {
        return <ErrorScreen />
      }

      return <Cmp { ...rest } />
    }
  }
}

有没有办法做到这一点?

是否唯一的选择是提供必须从外部到 SendScreen 组件的道具??

【问题讨论】:

标签: javascript reactjs react-native redux high-order-component


【解决方案1】:
import React, { Component } from 'react';
import withHandleError from './withHandleError';

class SendScreen extends Component {

  contructor() {
    super();
    this.state = {
      error: true
    }
  }

  render() {
    return (
    <div state={...this.state}> Test </div>
    )
  }
};


export default withHandleError(SendScreen)

您可以在组件中将状态作为道具传递。

【讨论】:

    【解决方案2】:

    父母不知道孩子的状态。虽然它可以获取一个带有 ref 的子实例并访问 state,但它不能监视状态更新,这样做的必要性表明存在设计问题。

    lifting up the state 就是这种情况。需要通知家长有错误:

    export default Cmp => {
      return class extends Component {
        this.state = {
          error: false
        }
    
        onError() = () => this.setState({ error: true });
    
        render() {
          if (error) {
            return <ErrorScreen />
          }
    
          return <Cmp onError={this.onError} { ...this.props } />
        }
      }
    }
    

    【讨论】:

      【解决方案3】:
      export default withHandleError(data)(SendScreen)
      

      data中你可以将你想要传递的值发送给HOC,并且可以作为prop访问。

      【讨论】:

        【解决方案4】:

        我知道我回答晚了,但我的回答可以帮助其他人

        这很容易做到。

        1. WrappedComponent
        
        import React, {Component} from 'react';
        import PropTypes from 'prop-types';
        import HocComponent from './HocComponent';
        
        const propTypes = {
          passToHOC: PropTypes.func,
        };
        
        class WrappedComponent extends Component {
          constructor(props) {
            super(props);
            this.state = {
              error: true,
            };
          }
        
          componentDidMount() {
            const {passToHOC} = this.props;
            const {error} = this.state;
            passToHOC(error); // <---  pass the <<error>> to the HOC component
          }
        
          render() {
            return <div> Test </div>;
          }
        }
        
        WrappedComponent.propTypes = propTypes;
        export default HocComponent(WrappedComponent);
        
        
        1. HOC 组件
        import React, {Component} from 'react';
        
        export default WrappedComponent => {
          return class extends Component {
            constructor() {
              super();
              this.state = {
                error: false,
              };
            }
            doAnything = error => {
              console.log(error); //<-- <<error === true>> from child component
              this.setState({error});
            };
            render() {
              const {error} = this.state;
              if (error) {
                return <div> ***error*** passed successfully</div>;
              }
        
              return <WrappedComponent {...this.props} passToHOC={this.doAnything} />;
            }
          };
        };
        

        React docs: https://reactjs.org/docs/lifting-state-up.html

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2019-06-13
          • 2023-02-10
          • 1970-01-01
          • 1970-01-01
          • 2017-09-04
          • 2018-01-27
          • 2016-08-17
          • 2017-08-12
          相关资源
          最近更新 更多