Есть проблемы в составном компоненте.
На this
нет bookNode
и обработчиков событий.App
- это компонент без сохранения состояния, который не имеет доступа к this
, bookNode
, а обработчики событий - реквизиты.
Это не value
, который передается в состояние обработчики, это state
, как следует из названия.
Это должно быть:
const stateHandlers = {
handleTouchStart: state => () => ({
value: state.value + 1
}),
handleTouchEnd: state => () => ({
value: state.value - 1
})
};
export const enhance = compose(
setDisplayName("App"),
withProps(props => ({
bookNode: React.createRef()
})),
withStateHandlers(state, stateHandlers),
lifecycle({
componentDidMount() {
this.props.bookNode.current.ontouchstart = this.props.handleTouchStart;
this.props.bookNode.current.ontouchend = this.props.handleTouchEnd;
}
})
);
export const App = ({ value, bookNode }) => (
<div>
<h3>Value: {value}</h3>
<button ref={bookNode}>Submit</button>
</div>
);
Вот демо .
Обычно нетпричина для доступа к DOM вручную, чтобы настроить события, потому что React обрабатывает это.Это исключает необходимость использования ссылок и жизненного цикла:
export const enhance = compose(
setDisplayName("App"),
withStateHandlers(state, stateHandlers)
);
const App = ({ value, handleTouchStart, handleTouchEnd }) => (
<div>
<h3>Value: {value}</h3>
<button onTouchStart={handleTouchStart} onTouchEnd={handleTouchEnd}>Submit</button>
</div>
);