javascript - 反应中的功能无法按预期工作
问题描述
我正在尝试编写一个处理按钮单击的函数。我希望事情发生:
该函数获取一个字符串并将名为“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")}/>
)
}
}
为了以正确的方式调用函数并保留结果,我应该改变什么?
解决方案
问题是this.handleClick("blues")
在渲染期间执行的,它返回未定义的,类似于,具有调度 3 个异步sgenreClicked={undefined}
的副作用...setState
你可以使用一个工厂函数,它返回一个可以访问闭包变量的事件处理函数:
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")} />
推荐阅读
- linux - How do i allocate an array of bytes starting at address 0 in the LLVM IR?
- linux - 为什么相同的语言环境但一个有错误
我有相同的源来运行STAG和PROD,当复制一个日文名称的文件时,STAG出错并且PROD是no,为什么?
<java.nio.file.InvalidPathExceptio
- excel - 如何通过 VBA 附加 CSV 文件而不读取空的格式化单元格
- excel - 计算年龄时如何使文本存储为独立于计算机日期格式的日期?
- python - 无法安装 pyHook 包“找不到满足 pyHook 要求的版本”
- python - Most efficient way of converting RESTful output to dataframe
- python - How do I make a new array from values and arrays, without the new array containing an array
- apache-spark - 如何让 Spark Standalone 有效利用 AWS Autoscaling 集群?
- html - CSS文本并排对齐和垂直对齐
- python-3.x - Extending current code to include both median and mode