【问题标题】:Re-usable React components that modify parent state修改父状态的可重用 React 组件
【发布时间】:2018-04-20 14:21:57
【问题描述】:

只是想了解制作与父组件状态交互的可重用反应组件的最佳方法。


编辑:我遵循了Peter 的有用建议并使其更加模块化,但我仍然在从子组件更新父组件状态时遇到问题。我别无选择传递一个方法,然后必须在所有使用<Modal /> 组件的地方重复此方法?
这是不可避免的吗?
Updated codepen here


我有一个需要写入其父状态的反应组件。
<Modal /> 为例,如果显示了模态框,则其父组件将其状态更新为modal1 : ‘is-visible'。 is-visible 作为类添加到模态框。

我遇到的问题是我有 3 个函数/方法来更新状态并为模式设置动画,我需要将这些函数/方法复制到每个使用 <Modal /> 组件的组件。

codepen here

有没有办法解决这个问题? 这些与父组件对话的方法可以存在于组件本身内吗?

这样我就可以将模态组件放在 viola 中,它可以在我的应用程序周围没有重复的函数方法的情况下工作。

模态:

class Modal extends React.Component {
  constructor(props) {
    super(props);
    this.closeModal = this.closeModal.bind(this);

    this.state = {
      extraClasses: ''
    }
  }

  componentWillReceiveProps(props) {
    this.setState({ extraClasses: props.extraClasses });
  }

  closeModal() {
    this.props.closeModal();
  }

  render() {
    return (
      <div className={'c-modal ' + this.props.extraClasses}>
        <div className="c-modal__bg" onClick={this.closeModal}></div>
        <div className="c-modal__inner">
          <button className="c-modal__close-modal" onClick={this.closeModal}>X</button>
          {this.props.children}
        </div>
      </div>
    );
  }
}

&lt;ParentComponent /&gt;这里,注意3个函数/方法:

class ParentComponent extends React.Component {
  constructor(props) {
    super(props);

    this.showModal = this.showModal.bind(this);
    this.closeModal = this.closeModal.bind(this);
    this.animateModal = this.animateModal.bind(this);

    this.state = {
      // modal1: '',
      // modal2: ''
    };
  }

  animateModal(type, stateProp) {
    if (type == 'show') {
      this.setState({ [stateProp]: 'c-modal--display-block' })
      setTimeout(() => {
        this.setState({ [stateProp]: 'is-visible' })
      }, 0);
    } else if (type == 'hide') {
      this.setState({ [stateProp]: 'c-modal--display-block' })
      setTimeout(() => {
        this.setState({ [stateProp]: '' })
      }, 300);
    }
  }

  showModal(modalNum) {
    this.animateModal('show', 'modal' + modalNum)
  }

  closeModal(modalNum) {
    this.animateModal('hide', 'modal' + modalNum)
  }

   render() {
    return (
      <div>
        <h2>Start editing to see some magic happen ✨</h2>

         <button className="c-btn" onClick={() => this.showModal(1)}>show modal</button>
        <Modal extraClasses={'extraClassesHere ' + this.state.modal1} closeModal={() => this.closeModal('1')}>
          <h1>I'm a modal</h1>
          <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Doloribus fugit dicta quisquam est nihil vel, suscipit sit veritatis eum accusantium voluptas temporibus ut et, distinctio, illum assumenda sint libero voluptate.</p>
        </Modal>

      </div>
    )
  }
};

非常感谢任何帮助!

【问题讨论】:

标签: javascript reactjs


【解决方案1】:

如果您将动画显示和关闭方法移动到模态组件本身,您可以只拥有一个名为 isShown 的模态道具。当那个 isShown 道具改变时,你可以动画到它的隐藏或显示状态。如果您需要在父级进行更多控制,您还可以提供 onShown 和 onHidden 回调,这些回调可以在动画完成后触发。

如果我理解不正确,请告诉我!

【讨论】:

  • 感谢您的帮助!问题是无法从子组件更新父组件。 codepen.io/ashconnolly/pen/… 关闭模式后,父级保留 'is-shown' 状态属性。图片在这里-i.imgur.com/U6zWkcZ.png这是一个棘手的问题。非常感谢您的帮助! ?
  • 啊,我明白了,我认为在这种情况下,父母不应该关心模态的打开或关闭状态。只关注其打开或关闭状态的模式将有助于清理代码。
  • 谢谢彼得。 codepen here - codepen.io/ashconnolly/pen/5d80648d971dcb6d360506bee6ec80ea 我遇到的问题我看不到如何在不与父组件状态交互的情况下显示或隐藏子组件。有什么想法,或者是这样吗?
猜你喜欢
  • 1970-01-01
  • 2019-04-04
  • 1970-01-01
  • 2018-10-15
  • 2015-04-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-26
相关资源
最近更新 更多