2017-09-23 85 views
0

我试图设置它,以便在从一个数组映射的映像滚动时,状态会更新为该映像的坐标,从而更新Google Map。React映射数组中的OnScroll事件侦听器

<CloudinaryContext cloudName="hcjmhcjf" fetchFormat="auto"> 
    <div className="image-holder"> 
    {displayImages.map((displayImage, i) => { 
     return (
     <div 
      className="responsive" 
      key={i} 
      ref="img" 
      onScroll={this.handleScroll(this.state.images[i].location)}> 
      <div className="img"> 
      <a 
       target="_blank" 
       href={`http://res.cloudinary.com/gdbdtb/image/upload/${displayImage}.jpg`}> 
       <Image publicId={displayImage} responsive style={{width: '100%'}}> 
       <Transformation crop="scale" width="auto" responsive_placeholder="blank" /> 
       </Image> 
      </a> 
      </div> 
     </div> 
    ); 
    })} 
    </div> 
</CloudinaryContext> 

从通过一些其他的问题,阅读我设置以下生命周期方法了:

componentDidMount() { 
    const imgDiv = ReactDOM.findDOMNode(this.refs.img) 
    imgDiv.addEventListener('scroll', this.handleScroll); 
} 

componentWillUnmount() { 
    const imgDiv = ReactDOM.findDOMNode(this.refs.img) 
    imgDiv.removeEventListener('scroll', this.handleScroll); 
} 

然而,ReactDOM.findDOMNode(this.refs.img)总是返回undefined

会是怎样一种方式,我可以打电话给

handleScroll(location) { 
    this.setState({ 
     center: location 
    }) 
} 

并且在规范中有地图更新图像是否滚动?

+0

你能澄清你的要求吗?我不明白以下内容:“当从一个数组映射的图像滚动时,状态会更新为该图像的坐标” –

+0

@MatthewBarbara,所以我有一个图像阵列毗邻谷歌地图。在第一次渲染时,谷歌地图以第一张图片的坐标为中心。我想要的是当图像滚动时,谷歌地图将重新居中滚动的图像 –

+0

你可以把你的问题放在codepen或jsfiddle上吗?这将更容易理解这个问题 –

回答

0

如果这能帮助别人,我使用做出反应,航点的插件解决了这个问题:

import React, { Component } from 'react' 
import { Header, ImageBoard, AccountNav, AlbumBoard } from '../modules' 
import {Router, Route, Redirect, Link, withRouter } from 'react-router-dom' 
import { APIManager } from '../utils' 
import ReactDOM from 'react-dom' 
import {Image, CloudinaryContext, Transformation} from 'cloudinary-react'; 
import { compose, withProps, lifecycle } from "recompose"; 
const Waypoint = require('react-waypoint'); 
import { 
withScriptjs, 
withGoogleMap, 
GoogleMap, 
Marker 
} from "react-google-maps"; 


export default class Album extends Component { 
constructor(){ 
    super() 
    this.toLatLng.bind(this), 
    this.handleScroll = this.handleScroll.bind(this), 
    this.state = { 
     images: [], 
     center: { lat: 25.03, lng: 121.6 } 
    } 
} 

toLatLng (coord) { 
    const latLng = {lat: coord[1], lng: coord[0]} 
    return latLng 
} 

componentWillMount(){ 
    APIManager.get(`/api/album/${this.props.match.params.id}`, null, (err, response) => { 
     if(err){ 
      let msg = err.message || err 
      console.log(msg) 
      return 
     } 

     let images = response.result[0].albums.images 

     this.setState({ 
      images: images, 
      center: this.toLatLng(images[0].location) 
     }) 
    }) 
} 


handleScroll(location){ 
    this.setState({ 
     center: this.toLatLng(location) 
    }) 
} 


render(){ 

    const Map = compose(
      withProps({ 
      googleMapURL: "https://maps.googleapis.com/maps/api/js?key=AIzaSyAsv9Hz2-CqDOgrb4FBSkfC-4aTiJL13cI", 
      loadingElement: <div style={{ height: `100%` }} />, 
      containerElement: <div style={{ height: `calc(100vh - 100px)`, position: 'fixed', left: '70vw' }} />, 
      mapElement: <div style={{ width: `30vw`, height: `100%`}} />, 
      center: this.state.center, 
      }), 
      withScriptjs, 
      withGoogleMap, 
     )(props => 
      <GoogleMap 
      defaultZoom={14} 
      defaultCenter={props.center} 
      > 
      {this.state.images.map((image, i) => { 
       return (
        <Marker key={i} 
         position={this.toLatLng(image.location)} 
        /> 
      ) 
      })} 
      </GoogleMap> 
     ); 


    const toPublicId = (image) => { 
     return image.slice(62, image.length) 
    } 


    return(
     <div> 
      <Header /> 
      <Map /> 
      <div className="albumImageBoard"> 
       <CloudinaryContext cloudName="djswgrool" fetchFormat="auto" > 
        <div className="image-holder" ref="imgDiv"> 

         {this.state.images.map((image, i) => { 
          return (
           <div className="responsive" key={i}> 
            <div className="img"> 
             <a target="_blank" href={`http://res.cloudinary.com/djswgrool/image/upload/${toPublicId(image.url)}.jpg`}> 
              <Image publicId={toPublicId(image.url)} responsive style={{width: '100%'}} > 
               <Transformation 
                crop="scale" 
                width="auto" 
                responsive_placeholder="blank" 
               /> 
              </Image> 
             </a> 
            </div> 
            <Waypoint 
            onEnter={() => this.handleScroll(image.location)}/> 
           </div> 

         ) 
         }) 
        } 
        </div> 
       </CloudinaryContext> 
      </div> 
     </div> 
    ) 
} 

}