Разработка на React-е
Добрый вечер, форумчане)
Подскажите плиз, сталкиваюсь всегда с одной проблемой...при проверке тестового задания, мне указывают на то что оставляю хэндлеры в разметке... понимаю что этого не должно быть, но как можно кроме этого способа и кроме AddEventListenerа отлавливать события на элементах?? |
Вот так вешаются события на элементы в реакте:
<div onClick={тут функция обработчик}></div>
Я правильно вопрос понял? |
а какие еще есть варианты? этот способ я и использую...говорят что некорректно использовать хэндлеры в разметке
|
Вот такую запись наверное некорректной посчитали
<div onclick={()=>{ тут сама функция }></div>
скорее всего имели ввиду, что функцию надо писать в компоненте и привязывать ее:
<div onClick={this.onClickHandler.bind(this)}></div>
или, если ее вне компонента поставил
<div onClick={onClickHandler()}></div>
|
а чем плохи EventListener-ы добавленные в компоненте после загрузки DOMа ?
|
Тем, что идет работа с DOM напрямую. В реакте виртуальный DOM и приложение должно быть в курсе всех обработчиков и действий с элементами, для корректного рендера. Вообще работа с ДОМом напрямую - это антипаттерн и этого надо избегать.
|
спасибо за совет, буду переучиваться)) а еще одно замечание было. которое я если честно вообще не понял... писал приложение на react+redux, подключая компоненты контейнеры через connect... мне было замечание что "гружу данные напрямую в connect"... а как иначе?? синтакссис был примерно такой:
const UserLogin = connect( mapStateToProps, mapDispatchToProps )(UserInfo); |
Правильно делать так (если через декоратор)
function mapStateToProps(state){
тут какие-то данные из state
}
function mapDispatchToProps(dispatch){
тут какие-то экшены
}
@connect(mapStateToProps, mapDispatchToProps)
тут сам компонент
|
Цитата:
тут сам компонент : контейнер или вьюха? |
Контейнер. В нем всё, что было вытащено из этих двух функций будет доступно в props. Собственно connect для того и нужен, чтобы прокидывать что нибудь в компонент. Чтобы стало более понятно, вот типичная структра реакт компонента в редакс:
import React, { Component, PropTypes } from 'react';
import { connect } from 'react-redux';
const mapStateToProps = state => {
return {
item: state.item,
color: state.color
};
};
const mapDispatchToProps = dispatch => {
return {
setItemAndColor: (value)=>dispatch(setItemAndColor(value))
};
};
@connect(mapStateToProps, mapDispatchToProps)
class MyOwnComponent extends Component {
render() {
const { item, color, setItemAndColor } = this.props;
return (
<div></div>
);
}
}
export default MyOwnComponent;
|
| Часовой пояс GMT +3, время: 02:13. |