Реактивная функция не работает от дочернего компонента
Я пытаюсь заставить работать функцию, которая удаляет изображение, загруженное с помощью React Dropzone, и реагирует на сортировку.
У меня работает дропзона, и сортировка работает, но по какой-то причине у меня не работает функция сортировки элемента, которая удаляет этот конкретный элемент из массива. Событие onClick, похоже, не вызывает функцию.
Мой код ниже.
const SortableItem = SortableElement(({value, sortIndex, onRemove}) =>
<li>{value.name} <a onClick={() => onRemove(sortIndex)}>Remove {value.name}</a></li>
);
const SortableList = SortableContainer(({items, onRemove}) => {
return (
<ul>
{items.map((image, index) => (
<SortableItem key={`item-${index}`} index={index} value={image} sortIndex={index} onRemove={onRemove} />
))}
</ul>
);
});
class renderDropzoneInput extends React.Component {
constructor (props) {
super(props)
this.state = { files: [] }
this.handleDrop = this.handleDrop.bind(this)
}
handleDrop (files) {
this.setState({
files
});
this.props.input.onChange(files)
}
remove (index){
var array = this.state.files
array.splice(index, 1)
this.setState({files: array })
this.props.input.onChange(array)
}
onSortEnd = ({oldIndex, newIndex}) => {
this.setState({
files: arrayMove(this.state.files, oldIndex, newIndex),
});
};
render () {
const {
input, placeholder,
meta: {touched, error}
} = this.props
return (
<div>
<Dropzone
{...input}
name={input.name}
onDrop={this.handleDrop}
>
<div>Drop your images here or click to open file picker</div>
</Dropzone>
{touched && error && <span>{error}</span>}
<SortableList items={this.state.files} onSortEnd={this.onSortEnd} onRemove={(index) => this.remove(index)} />
</div>
);
}
}
export default renderDropzoneInput
2 ответа
Обновление: это было вызвано реакцией глотания на реагирующую сортировку. Настройка pressDelay
prop на элементе позволил срабатывать функции click.
Это старый вопрос, но некоторые люди, такие как я, которые все еще видят эту проблему, возможно, захотят прочитать это: https://github.com/clauderic/react-sortable-hoc/issues/111
Проблема в том, что сортируемый hoc проглатывает события onClick, как выяснил Мэтт. Но мы можем иметь обходные пути, установив pressDelay
или же distance
,
Для меня лучшим вариантом было установить минимальное расстояние для сортируемого списка, и это работало хорошо
Вы также можете использовать опору расстояния, чтобы установить минимальное расстояние, которое будет перетаскиваться до запуска сортировки (например, вы можете установить расстояние в 1 пиксель, например, так: distance={1})