我正在尝试编写一个处理按钮单击的函数。 我希望事情发生:
该函数获取一个字符串,并将名为“ chosenGenre”的状态更改为给定的字符串。
单击某个按钮时,它将调用该函数并返回一个字符串。
字符串/状态“ chosenGenre”已保存,因此以后可以在其他组件中使用它。
这是我写的,但是我认为单击按钮后传递字符串的方式不正确。
import React, { Component } from 'react';
import Genre from './Genre';
import './GenreSelectPage.css';
import Blues from '../Blues.png';
import Classical from '../Classical.png';
import Country from '../Country.png';
export default class GenreSelectPage extends Component{
state = {
chosenGenre: ""
}
handleClick = (genreName) => {
this.setState({chosenGenre: genreName});
}
render(){
return(
<div className = "GenreSelectPage">
<h3>Select your desired Kollab Room Genre</h3>
<Genre genrePicture= {Blues} genreClicked = {this.handleClick("blues")}/>
<Genre genrePicture= {Classical} genreClicked = {this.handleClick("Classical")}/>
<Genre genrePicture= {Country} genreClicked = {this.handleClick("Country")}/>
)
}
}
为了正确调用函数并保持结果,我应该更改什么?
答案 0 :(得分:1)
问题是this.handleClick("blues")
是在渲染过程中执行的,它返回未定义的状态,类似于genreClicked={undefined}
,具有计划3个异步setState
s的副作用...
您可以使用工厂函数来返回事件处理函数,该函数可以访问闭包变量:
makeHandleClick = (genreName) => (event) => {
this.setState({ chosenGenre: genreName });
// console.assert(this.state.chosenGenre); // FYI: not possible, setState is async
}
render() {
...<Genre genrePicture={Blues} genreClicked={this.makeHandleClick("blues")} />