与 imagesLoaded 反应,并为最终渲染解析一个值

React with imagesLoaded, and resolving a value for the final render

我有一个名为 PhotoTags 的 class,它有一个名为 getScalePercent() 的函数。在 getScalePercent 中,我做了一个简单的计算,涉及显示图像的宽度和高度,以及 return 一个值。在 PhotoTags 的渲染函数中,我使用坐标数据在照片上应用元素。仅当图像已 100% 加载时,此逻辑才能正常工作。如果我刷新页面的次数足够多,我可以看到我的逻辑实际上是在正确设置坐标,但只有在图像被缓存或快速加载后才会发生。因此我想使用 imagesLoaded 来检查图像是否已加载,以便有效地使用坐标。

我的函数如下所示:

getScalePercent(){
        var p =0;
        var targetWidth = $('.expanded-image').width();
        var targetHeight = $('.expanded-image').height();
        p = (targetWidth / 1920);
        return p;
}

在我的渲染函数中,我尝试使用 imagesLoaded 检查图像是否已在使用 getScalePercent():

之前加载
render(){
   var p = 0;

   $('.expanded-image').imagesLoaded().done( function() {
        p = this.getScalePercent();
   });

   console.log(p); //But value is still 0

   //I then want to use p later in the render function

我的变量 p 没有在 imagesLoaded 的 .done 事件中被操作。我知道它与异步调用有关,而与异步调用无关,我尝试将 imagesLoaded 放入 getScalePercent() 但无济于事。我也尝试过对 getScalePercent() 和许多其他变体进行回调,但仍然无济于事。基本上我想做的是在 imagesLoaded 的 .done() 事件中触发 getScalePercent()。然后我希望能够在 PhotoTags[ 的渲染函数中使用 getScalePercent() returns (当图像完全加载时)的值=29=]。非常感谢任何帮助。

可以肯定的是,这里的问题是 DOM 元素 .expanded-image 实际上并未在第一次渲染时加载到 DOM 中。尝试将此逻辑移至 componentDidMount,它应该可以正常工作。您还需要将 p 保存在状态中,以便您可以在 componentDidMount 之外引用它,给它一个初始值,并在它发生变化时立即重新渲染您的组件。

在图像上添加一个 onLoad 事件不是更好吗,像这样:

class Test extends Component {
    constructor (props){
        super(props);
        this.state = {
            imgLoaded:false
        }
    }
    handleImgLoaded (event){
        // Do stuff
        console.log(event.target);
        this.setState({
            imgLoaded:true
        });
    }
    render (){           
        <div className={'img-wrapper-class ' + (this.state.imgLoaded ? 'img-loaded' : 'img-loading')}>
            <img src={"somesrc.jpg"} onLoad={this.handleImgLoaded.bind(this)} />
        </div>
    }
}