Я думаю, что в этой строке:
let delta = event.clientY + this.state.height
дельта не должна быть суммой этих значений, потому что вы изменяете размер по оси Y, и именно Y (в данном случае) должно определять новую высоту:
Я пробовал это в методе resizePanel
, и, похоже, он работает:
this.setState({ height: event.clientY })
Проблема этого подхода заключается в том, что в этом случае верхняя позиция компонента равна почти 0, и поэтому он работает совершенно безобидно.
Если вам нужно, чтобы он работал независимо от того, где находится компонент на странице, вы должны вычислить delta
как разницу между верхней позицией и event.clientY
.
Для этого я бы сохранил абсолютную верхнюю позицию компонента в методе жизненного цикла componentDidMount
:
componentDidMount() {
const currentNode = ReactDOM.findDOMNode(this)
currentNode.addEventListener('mousemove', this.resizePanel);
currentNode.addEventListener('mouseup', this.stopResize);
currentNode.addEventListener('mouseleave', this.stopResize);
this.setState({ initialY: currentNode.getBoundingClientRect().top })
}
Тогда в обработчике события настройка свойства height будет:
this.setState(prevState => ({ height: event.clientY - prevState.initialY }))