Я столкнулся со странным поведением с preactjs, странным, потому что со мной никогда не случалось такое с реакцией.Посмотрите на эту скрипку:
http://jsfiddle.net/8s4vhknt/
Это очень простой компонент с кнопкой, которая действует как переключатель.Пожалуйста, откройте консоль браузера и просмотрите журналы консоли.
Первоначально пропеллер активного состояния имеет значение false -> НЕАКТИВНО.Когда вы в первый раз щелкаете знак вопроса, как и ожидалось, вызывается функция переключения, целью которой является кнопка ( Примечание: в моем локальном окружении цель события оказывается вместо этого элементом «.help-overlay» (который долженрендерится только после изменения состояния), есть идеи? )
Тогда состояние активного пропелла устанавливается в true, компонент снова рендерится -> ACTIVE в консоли, и кнопка меняется.
Теперь нажатие на кнопку вызовет событие onclick дважды, и, очевидно, ничего не изменится.
Я знаю, что этот материал каким-то образом связан с распространением события, и фактически, добавляяe.stopPropagation () в начале функции переключения выполняет работу .
Но я не понимаю, почему!Я имею в виду, что событие должно распространяться вверх через дом, почему, черт возьми, снова должен запускать один и тот же обработчик onclick для одного и того же элемента?
Вот почему я не прошу решения, но объяснениячто происходит, я не могу понять.
Большое спасибо.
Я опубликую здесь код компонента рекламы в скрипте.
const { h, render, Component } = preact; // normally this would be an import statement.
class Help extends Component {
constructor () {
super()
this.state = {active: false}
this.toggle = this.toggle.bind(this)
}
toggle (e) {
console.log('ONCLICK', new Date().getTime(), e.target)
this.setState(state => ({active: !state.active}))
}
render () {
if (!this.state.active) {
console.log('NOT ACTIVE')
return (
<div class='help-btn' onClick={this.toggle}>?</div>
)
} else {
console.log('ACTIVE')
return (
<div class='help-overlay'>
<div class='help-btn' onClick={this.toggle}>✕</div>
</div>
)
}
}
}
// render an instance of Clock into <body>:
render(<Help />, document.body);