如何水平扩展Reactstrap折叠组件?

时间:2018-06-20 14:33:04

标签: reactjs collapse reactstrap

默认情况下,reactstrap折叠组件始终垂直折叠, 关于使其水平折叠的任何提示?

也许我想念一些东西... https://reactstrap.github.io/components/collapse/

1 个答案:

答案 0 :(得分:1)

因此,我创建了一个可以水平或垂直折叠的组件。 垂直塌陷仍在测试中,但可以用于水平塌陷。

export default class Collapse extends Component {

    static props = {       
        isOpen: PropTypes.bool.isRequired,        
        vertical: PropTypes.bool,
        elementMaxLength: PropTypes.string,

        onOpen: PropTypes.func,
        onClose: PropTypes.func,
    }

    static defaultProps = {
        vertical: false,
        elementMaxLength: '300px',
        onOpen: () => console.log('Opened'),
        onClose: () => console.log('Closed'),
    }

   constructor(props) {
       super(props);

       this.state = {
        cssTarget: '_collapseH'
       }
   }

   componentDidMount() {
        if (this.props.vertical)
            this.setState({cssTarget: '_collapseV'})

        if (this.props.isOpen)
            this.collapse();
   }

    componentDidUpdate(prevProps, prevState, snapshot) {
        if (prevProps.isOpen !== this.props.isOpen)
            this.collapse();
   }

   collapse() {
    var content = this.refs.collapseDiv;
    if (content)
       if (this.decide(content))
          this.close(content)
       else
          this.open(content)    
   }

   decide(content) {
      if (this.props.vertical)
        return content.style.maxHeight;

      return content.style.maxWidth;
   }

   open(content) {
      this.assign(content, this.props.elementMaxLength);      
      this.props.onOpen();
   }

   close(content) {
      this.assign(content, null)
      this.props.onClose();
  }

  assign(content, value) {
    if (this.props.vertical)      
      content.style.maxHeight = value;
    else
      content.style.maxWidth = value;
  }

   render() {
    return (
          <div ref='collapseDiv' target={this.state.cssTarget}> 
            {this.props.children}
          </div>
    );
  }
}

因此,基本上,我们提供带有DIV引用的DIV,以便可以使用this.refs在组件内部对其进行访问。然后,我们在DIV中渲染所有传递给该组件的子级。

要控制是否应展开或折叠,我们有一个isOpen道具,它在父组件内部通过this.setState从TRUE变为FALSE。

当我们在父级内部使用this.setState时,它将触发父级的重新渲染,也触发了Collapse组件的重新渲染。这也会触发 componentDidUpdate,我们将在其中开始动画。

要控制动画,我使用了CSS:

div[target='_collapseV'] {
  display: flex;
  flex: 1;  
  overflow: hidden;
  background-color: maroon;

  max-height: 0;
  transition: max-height 1s ease-out;
}

div[target='_collapseH'] {
  display: flex;
  flex: 1;
  overflow: hidden;
  background-color: maroon;

  max-width: 0;    
  transition: max-width 1s ease;
}

目标属性的设置与我们设置ref属性的DIV相同。如果道具 vertical设置为true,然后我们的目标att将更改为_collapseV,使组件垂直折叠。

要触发动画,我们在max-width函数内部更改max-heightassign的值,该函数在componentDidUpdate内部被调用。

唯一的缺点是您必须知道内容的最大长度(宽度或高度) 呈现在此组件内部,并设置在属性elementMaxLength中。该值不必相同,但是elementMaxLength应该大于内容长度。

就这样。

我真的不知道这是否是最好的方法,我敢肯定还有很多改进的余地。但是我认为这是一个很好的解决方案,可以很好地工作,并且您无需安装任何软件包。

正如我之前说过的,垂直塌陷还需要进行一些测试,但重点是要创建水平塌陷的东西。