В ответьте, как он выясняет, нужно ли повторно отображать-dom, путем тестирования ссылок на объекты/функции.Контейнерные компоненты плохие? Следует использовать вместо этого store.getState и store.dispatch?
Так что при каждом обновлении рассчитывается все JS. Значения элементов контейнеров вернуть две совершенно новые объекты друг время, один для maptDispatchToProps
и один для mapStateToProps
:
const mapStateToProps = (state, ownProps) => {
return {
active: ownProps.filter === state.visibilityFilter
}
}
const mapDispatchToProps = (dispatch, ownProps) => {
return {
onClick:() => {
dispatch(setVisibilityFilter(ownProps.filter))
}
}
}
В коде выше мы видим новый объект каждый временной содержащий active
ключ и затем новый объект содержащий новую функцию до onClick
. Ссылки на эти 3 являются совершенно новыми на каждом js-цикле. React будет сравнивать эти ссылки, а затем он будет пересчитывать js в компоненте. Но я подумал, что с сокращением не нужно было тестировать shouldComponentUpdate
, как это может быть, когда все эти 3 ссылки изменились? Укажите onClick
, что вызовет реакцию на removeEventListener
, затем добавьте onClick
назад с addEventListener
.
С уважением, как насчет функции 'onClick', возвращаемой' mapDipsatchToProps', проверка равенства на ней, несомненно, вернет разные значения? Я был в замешательстве, потому что из редукторов, если ничего не изменилось, я возвращаю 'undefined', но я получил ошибку в консоли, которая велела мне не делать этого, и вместо этого вернуть исходный параметр' state', который будет означать одну и ту же ссылку. – Noitidart
Функция 'connect()' проверяет объявление вашего 'mapDispatchToProps', чтобы увидеть, требуется ли ему один или два аргумента. Если он принимает только один аргумент, то ваш 'mapDispatch' не полагается на реквизиты, переданные компоненту, поэтому он будет запускаться только один раз. Если ваш 'mapDispatch' принимает _two_ args, это зависит от входящих реквизитов, поэтому он будет повторно запускаться при повторном рендеринге родительского компонента. В этом случае вы, вероятно, создали новый набор функций, и это приведет к повторному рендерингу реального компонента. Чтобы избежать этого, вы можете изменить структуру 'mapDispatch' и компонент. – markerikson
Спасибо @mark Я должен думать об этом больше. Огромное спасибо. – Noitidart