【问题标题】:How to map array outside of render function to setState?如何将渲染函数之外的数组映射到setState?
【发布时间】:2023-03-11 20:08:01
【问题描述】:

我正在尝试映射一个已获取 API 的数组以分隔具有相同名称的单个项目,并根据该单个项目属性设置状态。例如,该数组返回多个具有不同纬度和经度的不同项目。我可以使用渲染函数内的 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>
))
)}}


谢谢

【问题讨论】:

    标签: reactjs onclick setstate array.prototype.map


    【解决方案1】:

    这是您可以将 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() 中的任何内联函数(因为每个渲染都会创建该函数的一个新实例),那么您必须为每个 parks 的项目创建一个单独的组件:

    // 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
    

    【讨论】:

    • 您对我的回答的评论是正确的。感谢您指出这一点。我一定是读得太快了。我收回我的回答。 ??
    猜你喜欢
    • 2020-06-08
    • 1970-01-01
    • 1970-01-01
    • 2020-02-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多