如何将渲染函数之外的数组映射到 setState?
How to map array outside of render function to setState?
我正在尝试映射一个获取的数组 API 以分隔具有相同名称的单个项目,并基于该单个项目 属性 设置状态。例如,数组 returns 多个具有不同纬度和经度的不同项目。我可以在渲染函数内的 onClick 中使用一个函数来设置状态,但我知道这是不好的做法。我试过将函数移出渲染并使用 onClick={this.functionName},但这会产生奇怪的行为。我做错了什么?
这是我在渲染器之外创建的函数:
mapItem = () => {
const parks = [...this.state.parks];
parks.map(item =>
this.setState({
lat: item.latitude,
lng: item.longitude,
zoom: 16
})
);
};
render() {
return (<h2 onClick={this.mapItem}>{item.name}</h2>)
}
这个有效:
render() {
const { parks } = this.state;
return(
{parks.map(item => (
<h2 onClick={() => this.setState({lat: item.latitude,
lng: item.longitude, zoom: 16})
}>{item.name}</h2>
))
)}}
谢谢
这是将 onClick 事件处理程序移到 render()
之外的方法:
handleClick = item => {
this.setState({
lat: item.latitude,
lng: item.longitude,
zoom: 16
})
}
render() {
const { parks } = this.state
return (
<>
{parks.map(item => (
<h2
onClick={() => {
this.handleClick(item)
}}
>
{item.name}
</h2>
))}
</>
)
}
如果您试图避免 render()
中的任何内联函数(因为每次渲染都会创建该函数的一个新实例),那么您必须为每个 [=14= 创建一个单独的组件]的项目:
// ParkItem functional component
const ParkItem = ({item}) => {
const handleClick = () => {
this.props.setCoordinate({
lat: item.latitude,
lng: item.longitude,
zoom: 16
})
}
return <h2 onClick={handleClick}>{item.name}</h2>
}
class YourCurrentClass extends Component {
setCoordinate = stateObj => {
this.setState(stateObj)
}
render() {
const { parks } = this.state
return (
<>
{parks.map(item => (
<ParkItem item={item} />
))}
</>
)
}
}
export default YourCurrentClass
我正在尝试映射一个获取的数组 API 以分隔具有相同名称的单个项目,并基于该单个项目 属性 设置状态。例如,数组 returns 多个具有不同纬度和经度的不同项目。我可以在渲染函数内的 onClick 中使用一个函数来设置状态,但我知道这是不好的做法。我试过将函数移出渲染并使用 onClick={this.functionName},但这会产生奇怪的行为。我做错了什么?
这是我在渲染器之外创建的函数:
mapItem = () => {
const parks = [...this.state.parks];
parks.map(item =>
this.setState({
lat: item.latitude,
lng: item.longitude,
zoom: 16
})
);
};
render() {
return (<h2 onClick={this.mapItem}>{item.name}</h2>)
}
这个有效:
render() {
const { parks } = this.state;
return(
{parks.map(item => (
<h2 onClick={() => this.setState({lat: item.latitude,
lng: item.longitude, zoom: 16})
}>{item.name}</h2>
))
)}}
谢谢
这是将 onClick 事件处理程序移到 render()
之外的方法:
handleClick = item => {
this.setState({
lat: item.latitude,
lng: item.longitude,
zoom: 16
})
}
render() {
const { parks } = this.state
return (
<>
{parks.map(item => (
<h2
onClick={() => {
this.handleClick(item)
}}
>
{item.name}
</h2>
))}
</>
)
}
如果您试图避免 render()
中的任何内联函数(因为每次渲染都会创建该函数的一个新实例),那么您必须为每个 [=14= 创建一个单独的组件]的项目:
// ParkItem functional component
const ParkItem = ({item}) => {
const handleClick = () => {
this.props.setCoordinate({
lat: item.latitude,
lng: item.longitude,
zoom: 16
})
}
return <h2 onClick={handleClick}>{item.name}</h2>
}
class YourCurrentClass extends Component {
setCoordinate = stateObj => {
this.setState(stateObj)
}
render() {
const { parks } = this.state
return (
<>
{parks.map(item => (
<ParkItem item={item} />
))}
</>
)
}
}
export default YourCurrentClass