2016-05-29 2 views
1

В ответьте, как он выясняет, нужно ли повторно отображать-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.

ответ

2

Вы не понимаете, как работает «неглубокое равенство». Обе функции React's PureRenderMixin и React Redux connect используют «неглубокое равенство», чтобы определить, действительно ли что-то изменилось. Это означает, что значения верхнего уровня двух объектов сравниваются, чтобы увидеть, равна ли каждая пара значений ===, а не сравнивать, если сами объекты одинаковы. Таким образом, если у меня есть:

var a = {q : 42}; 
var b = {a : a}; 
var c = {a : a}; 

Тогда В и С являются совершенно разных объектов, но неглубоко равных, потому что для них обоих, поле «а» указывает на тот же объект.

Кроме того, в случае функции React Redux connect() она в первую очередь проверяет возвращаемое значение mapStateToProps, чтобы увидеть, нужно ли обновлять упакованный компонент.

+0

С уважением, как насчет функции 'onClick', возвращаемой' mapDipsatchToProps', проверка равенства на ней, несомненно, вернет разные значения? Я был в замешательстве, потому что из редукторов, если ничего не изменилось, я возвращаю 'undefined', но я получил ошибку в консоли, которая велела мне не делать этого, и вместо этого вернуть исходный параметр' state', который будет означать одну и ту же ссылку. – Noitidart

+1

Функция 'connect()' проверяет объявление вашего 'mapDispatchToProps', чтобы увидеть, требуется ли ему один или два аргумента. Если он принимает только один аргумент, то ваш 'mapDispatch' не полагается на реквизиты, переданные компоненту, поэтому он будет запускаться только один раз. Если ваш 'mapDispatch' принимает _two_ args, это зависит от входящих реквизитов, поэтому он будет повторно запускаться при повторном рендеринге родительского компонента. В этом случае вы, вероятно, создали новый набор функций, и это приведет к повторному рендерингу реального компонента. Чтобы избежать этого, вы можете изменить структуру 'mapDispatch' и компонент. – markerikson

+0

Спасибо @mark Я должен думать об этом больше. Огромное спасибо. – Noitidart

Смежные вопросы