2016-03-14 3 views
0

Я использую аддон CSSTransitionGroup, чтобы анимировать добавление и удаление элементов в массив. При добавлении анимация выполняется так, как ожидалось, но при удалении удаленный элемент сдвигается до конца до начала анимации. Я довольно новичок в React, но я предполагаю, что что-то происходит под капотом с тем, как React примиряет изменения массива?React CSSTransitionGroup удаленный элемент смещен до конца

http://jsfiddle.net/alalonde/0kztn19d

+0

В вашей скрипке я получаю другое поведение: заголовок слайдов сверху сверху на первом рендере, а при переключении 1-й/2-й линии страница исчезает, затем другая исчезает (без анимации). Невозможно добавить или удалить функции, которые я могу найти. – wintvelt

+0

К сожалению, неправильная скрипка! Спасибо что подметил это. – alalonde

ответ

0

Ваше заявление удалить идет неправильно из-за РЕАКТ key конкретики. См. Пояснения here динамических компонентов (это то, что у вас есть) и способы их использования с помощью клавиши.

Чтобы восстановить, изменить return заявление в картировании детей к:

return <Item key={item} item={item}/>; 

И создать новый (чистый) компонент, названный <Item>:

var Item = React.createClass({ 
    render: function() { 
    return <div>{this.props.item}</div>; 
    } 
}); 

Я попробовал это в вашей скрипке и оно работает. Надеюсь, this link предоставит вам обновленную скрипку.

BTW: В соответствии со скрипкой мои изменения бывают быстрыми и грязными: реагируйте, ожидая, что ключи будут уникальными и связаны с содержимым элемента в списке. Мой пример удовлетворяет второму требованию (пожалуйста, НЕ используйте индекс отображения в качестве ключа), но он терпит неудачу в первом случае: если вы добавите, а затем удалите, а затем добавьте, код примера создаст следующий элемент с тем же номером (не единственный), поэтому он терпит неудачу.

+0

Это привело меня на правильный путь. Ключ (har har) состоит в том, что ключи должны быть уникальными ACROSS render pass. Вот почему использование индекса не работает - если индекс изменяется между рендерами (как в случае удаления op), он больше не является допустимым ключом. – alalonde

+0

Хотя это сработает, наличие ключей, уникальных по сравнению с рендерами, очень неэффективно. Ключи должны быть уникальными для объекта, который они отображают: один и тот же элемент должен иметь один и тот же ключ в разных проходах рендеринга. (даже если он находится в другом месте в списке). См. Мой ответ на соответствующий вопрос [здесь] (http://stackoverflow.com/a/35705046/5358807) – wintvelt

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