ReactstrapCollapseコンポーネントを水平方向に拡張する方法は?

ルーカス・ファブレ

デフォルトでは、reactstrap折りたたみコンポーネントは常に垂直方向に折りたたまれますが、水平方向に折りたたむためのヒントはありますか?

多分私は何かが足りない... https://reactstrap.github.io/components/collapse/

ルーカス・ファブレ

そこで、水平方向または垂直方向の両方で折りたたむことができるコンポーネントを作成しました。垂直方向の折りたたみはまだテスト中ですが、水平方向の折りたたみでも機能します。

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をレンダリングし、コンポーネント内でthis.refsを使用してDIVにアクセスできるようにします。そして、このDIV内のこのコンポーネントに渡されたすべての子をレンダリングします。

展開するか折りたたむかを制御するためにthis.setState、親コンポーネント内でTRUEからFALSEに変更されるpropisOpenがあります

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;
}

ターゲット属性は、属性を設定したのと同じDIVに設定されrefます。propverticalがtrueに設定されている場合、ターゲットattは_collapseV、コンポーネントを垂直方向に折りたたむように変更されます。

アニメーションをトリガーするには、insideと呼ばれる関数のmax-widthまたは関数max-heightを変更しますassigncomponentDidUpdate

唯一の欠点は、このコンポーネント内でレンダリングされ、小道具に設定されるコンテンツの最大長(幅または高さ)を知っている必要があることですelementMaxLength同じ値である必要はありませんが、elementMaxLengthはコンテンツの長さよりも大きくする必要があります。

以上です。

これが最善の方法かどうかは本当にわかりませんし、改善の余地はたくさんあると確信しています。しかし、私は良い解決策だと思います。問題なく動作し、パッケージをインストールする必要はありません。

前にも言ったように、垂直方向に折りたたむにはまだテストが必要ですが、要点は水平方向に折りたたむものを作成することでした。

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

Reactでコンポーネントを垂直方向および水平方向に中央揃えする方法は?

分類Dev

コンポーネントを水平方向ではなく垂直方向にレンダリングする

分類Dev

Java-コンポーネントを水平方向に中央揃えし、垂直方向にスタックする方法は?

分類Dev

Reactコンポーネントを拡張する方法は?

分類Dev

Reactコンポーネントを拡張する方法は?

分類Dev

Reactコンポーネントを拡張する方法は?

分類Dev

CSSファミリーツリーを水平方向に拡張する方法は?

分類Dev

React Nativeで親の「上」に子コンポーネントを垂直方向および水平方向に配置するにはどうすればよいですか?

分類Dev

コントロールボタンを垂直方向ではなく水平方向に配置する方法-右NgxImageViewer

分類Dev

Reactのコンポーネント(垂直方向と水平方向の両方)を中央揃えにします

分類Dev

水平方向のデータをExcelの列にインポートする方法はありますか?

分類Dev

JavaのMigLayoutでコンポーネントを強制的に拡張する方法

分類Dev

CSSの水平方向に拡張するバンド

分類Dev

同じ行に他のコンポーネントがあるときに、コンポーネントを水平方向に中央に配置するにはどうすればよいですか?

分類Dev

react-nativeがTouchableOpacityコンポーネントを同じ行にどのようにレンダリングするか-水平方向

分類Dev

boxlayoutを使用して、使用可能なすべての水平方向の幅をコンポーネントでどのように埋めるのですか

分類Dev

水平方向のlinearLayoutコンテンツを全角に拡大する

分類Dev

スロットでVueコンポーネントを拡張する方法

分類Dev

このHTML / CSSを変更して、コンテナをフロートされた子に対して水平方向に拡張するにはどうすればよいですか?

分類Dev

BottomNavigationViewを水平方向のアイコンとラベルにする方法は?

分類Dev

ReactとTypescript:ジェネリックコンポーネントの小道具を拡張する方法は?

分類Dev

コンポーネントでの水平方向のポインターの動きと親コンテナーでの垂直方向のポインターの動きを処理する方法

分類Dev

コマンドバーでAppBarButtonを水平方向に配置する方法

分類Dev

Vueのコンポーネントの動作を拡張する方法

分類Dev

TypeScriptでVuetifyコンポーネントを拡張する

分類Dev

TypescriptでReact抽象コンポーネントを拡張する

分類Dev

Eclipse RCP:別のプラグインでGUIコンポーネントを拡張する方法は?

分類Dev

リピーターコントロールで画像の行を水平方向ではなく垂直方向に表示する方法

分類Dev

拡張コンポーネントでclassNameをオーバーライドする方法は?

Related 関連記事

  1. 1

    Reactでコンポーネントを垂直方向および水平方向に中央揃えする方法は?

  2. 2

    コンポーネントを水平方向ではなく垂直方向にレンダリングする

  3. 3

    Java-コンポーネントを水平方向に中央揃えし、垂直方向にスタックする方法は?

  4. 4

    Reactコンポーネントを拡張する方法は?

  5. 5

    Reactコンポーネントを拡張する方法は?

  6. 6

    Reactコンポーネントを拡張する方法は?

  7. 7

    CSSファミリーツリーを水平方向に拡張する方法は?

  8. 8

    React Nativeで親の「上」に子コンポーネントを垂直方向および水平方向に配置するにはどうすればよいですか?

  9. 9

    コントロールボタンを垂直方向ではなく水平方向に配置する方法-右NgxImageViewer

  10. 10

    Reactのコンポーネント(垂直方向と水平方向の両方)を中央揃えにします

  11. 11

    水平方向のデータをExcelの列にインポートする方法はありますか?

  12. 12

    JavaのMigLayoutでコンポーネントを強制的に拡張する方法

  13. 13

    CSSの水平方向に拡張するバンド

  14. 14

    同じ行に他のコンポーネントがあるときに、コンポーネントを水平方向に中央に配置するにはどうすればよいですか?

  15. 15

    react-nativeがTouchableOpacityコンポーネントを同じ行にどのようにレンダリングするか-水平方向

  16. 16

    boxlayoutを使用して、使用可能なすべての水平方向の幅をコンポーネントでどのように埋めるのですか

  17. 17

    水平方向のlinearLayoutコンテンツを全角に拡大する

  18. 18

    スロットでVueコンポーネントを拡張する方法

  19. 19

    このHTML / CSSを変更して、コンテナをフロートされた子に対して水平方向に拡張するにはどうすればよいですか?

  20. 20

    BottomNavigationViewを水平方向のアイコンとラベルにする方法は?

  21. 21

    ReactとTypescript:ジェネリックコンポーネントの小道具を拡張する方法は?

  22. 22

    コンポーネントでの水平方向のポインターの動きと親コンテナーでの垂直方向のポインターの動きを処理する方法

  23. 23

    コマンドバーでAppBarButtonを水平方向に配置する方法

  24. 24

    Vueのコンポーネントの動作を拡張する方法

  25. 25

    TypeScriptでVuetifyコンポーネントを拡張する

  26. 26

    TypescriptでReact抽象コンポーネントを拡張する

  27. 27

    Eclipse RCP:別のプラグインでGUIコンポーネントを拡張する方法は?

  28. 28

    リピーターコントロールで画像の行を水平方向ではなく垂直方向に表示する方法

  29. 29

    拡張コンポーネントでclassNameをオーバーライドする方法は?

ホットタグ

アーカイブ