UNPKG

react-hold-height

Version:

React component to hold the highest height established by a child component even though it no longer exists in the browser window

94 lines (78 loc) 3.79 kB
react-hold-height [![Travis](https://img.shields.io/travis/brurez/react-hold-height.svg)](https://travis-ci.org/brurez/react-hold-height) [![npm](https://img.shields.io/npm/v/react-hold-height.svg)](https://www.npmjs.com/package/react-hold-height) [![npm](https://img.shields.io/npm/dw/react-hold-height.svg)](https://www.npmjs.com/package/react-hold-height) [![GitHub issues](https://img.shields.io/github/issues/brurez/react-hold-height.svg)](https://github.com/brurez/react-hold-height/issues) [![GitHub stars](https://img.shields.io/github/stars/brurez/react-hold-height.svg)](https://github.com/brurez/react-hold-height/stargazers) [![GitHub license](https://img.shields.io/badge/license-MIT-blue.svg)](https://raw.githubusercontent.com/brurez/react-hold-height/master/LICENSE) ================= React component to hold the highest height established by a child component even though it no longer exists in the browser window. #### Demos - [Basic](https://github.com/brurez/react-hold-height/blob/master/examples/basic/basic.js) - [Loading](https://github.com/brurez/react-hold-height/blob/master/examples/loading/loading.js) ## Installation npm install --save react-hold-height ## Overview & Basic Example `<HoldHeight />` components are mounted with height 0px (unless specified by the initialHeight prop). As your child component is rendered, `<HoldHeight />` adopts a minimum height (`min-height`) equal to the height of that child component. If the child component is changed and its height is different, `<HoldHeight />` performs the following logic: - If new child component height <= last child component height: `<HoldHeight />` height stays the same. - If new child component height > last child component height: `<HoldHeight />` minimum height becomes equal to new child component height. This behavior is useful in many situations, for example: - When the child component is being re-render you want to display a loading animation without the container collapsing making the footer go up causing a bad visual impression. - When working with pagination, you want the last page containing fewer items to have the same height as the other pages. ```js import React, { Component } from 'react'; import HoldHeight from 'react-hold-height'; class App extends Component { state = { page: 0 }; renderElements(pageNumber) { if (pageNumber === 0) { return ( <ul> <li>This is a long list</li> <li>of items</li> <li>and takes a lot</li> <li>of space</li> <li>when I click "Next Page"</li> <li>the button the container should</li> <li>not collapse</li> <li>making the button remain in the same place</li> </ul> ); } if (pageNumber === 1) { return ( <ul> <li>Not so many items now</li> <li>but its ok. Button stay in the same place</li> </ul> ); } } renderPaginationBtn(pageNumber) { if (pageNumber === 0) { return ( <button onClick={() => this.setState({ page: 1 })}>Next Page</button> ); } if (pageNumber === 1) { return ( <button onClick={() => this.setState({ page: 0 })}>Prev. Page</button> ); } } render() { return ( <div className="App"> <HoldHeight> {this.renderElements(this.state.page)} </HoldHeight> {this.renderPaginationBtn(this.state.page)} </div> ); } } ``` ## `<HoldHeight />` Props - `resetOnWindowResize` _(boolean)_ _(optional)_: reset `<HoldHeight />` minimum height to the initial value when the window is resized. Default is _true_. - `initialHeight` _(number)_ _(optional)_: Initial minimum height in pixels. Default is _0_.