Как я могу назначить функцию onClick, если я решу выполнить условный рендеринг вне возврата React?
Stackoverflow хочет, чтобы я добавил еще больше описания, чем то, которое я предоставил, но я потратил 1 час на написание кода в их редакторе без помощи синтаксиса или eslint: D
section:hover {
cursor: pointer;
}
<script src = "https://cdnjs.cloudflare.com/ajax/libs/react/16.6.3/umd/react.production.min.js"></script>
<script src = "https://cdnjs.cloudflare.com/ajax/libs/react-dom/16.6.3/umd/react-dom.production.min.js"></script>
<div id = "root"/>
<script type = "text/babel">
const RotateOnClick = ( {rotated, handleChangeEvent} ) => {
if (rotated) {
return <section onClick = {handleChangeEvent}>I'M ROTATED! Click me to rotate again!</section>
} else {
return <section onClick = {handleChangeEvent}>I'm not rotated. Click me to rotate!</section>
}
}
class Rotator extends React.Component {
// Change state to true to see that it renders if toggled
state = {
isRotated: false
}
toggleRotation = () => {
// Outdated initial code when asking the question
// console.info("React doesn't like me. It will never call me :( ")
console.info("Yei, it works! React likes me again")
const { isRotated } = this.state
this.setState( {isRotated: !isRotated })
}
render() {
const { isRotated } = this.state
let conditionalRender;
if (isRotated) {
conditionalRender = <RotateOnClick rotated handleChangeEvent = {this.toggleRotation} />
} else {
conditionalRender = <RotateOnClick handleChangeEvent = {this.toggleRotation} />
}
return (
<div className = "hover">
{conditionalRender}
</div>
);
}
}
ReactDOM.render(
<Rotator />,
document.getElementById('root')
);
</script>
<RotateOnClick rotated onClick = {this.toggleRotation} />
не означает, что компонент будет реагировать на событие клика. Вы не можете назначать обработчики событий компонентам!
Вы должны передать обработчик компоненту, например.
<RotateOnClick rotated clickHandler = {this.toggleRotation} />
и используйте эту опору в рендере:
const RotateOnClick = ( {rotated, clickHandler} ) => {
if (rotated) {
return <section onClick = {clickHandler}>I'M ROTATED! Click me to rotate again!</section>
} else {
return <section onClick = {clickHandler}>I'm not rotated. Click me to rotate!</section>
}
}
Таким образом, реакция должна снова быть приятной;)