【问题标题】:React with imagesLoaded, and resolving a value for the final render对 imagesLoaded 做出反应,并为最终渲染解析一个值
【发布时间】:2026-01-31 08:15:02
【问题描述】:

我有一个名为 PhotoTags 的类,它有一个名为 getScalePercent() 的函数。在 getScalePercent 中,我做了一个简单的计算,涉及显示图像的宽度和高度,并返回一个值。在 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() 返回的值(当图像完全加载时)。非常感谢任何帮助。

【问题讨论】:

  • 因此您必须在done 回调中使用p 设置您的逻辑,或者从中调用一个将p 作为参数传递的函数

标签: javascript jquery reactjs jquery-deferred imagesloaded


【解决方案1】:

在图像上添加一个 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>
    }
}

【讨论】:

  • 图像开始加载或图像完全加载时是否会触发 onLoad?
  • 它在加载后触发,因此您可以使用它来显示/隐藏加载动画等。此外..您显然可以在回调中访问事件和事件目标,所以您应该能够获得您需要的所有关于宽度等的信息。编辑示例以显示这一点...
  • 谢谢!我相信这是迄今为止最正确的答案。我需要更多地思考 React。我所做的只是将 imageLoaded 状态添加到包含图像的组件中,并且仅在 imageLoaded 状态为 true 时才渲染 PhotoTags。 imageLoaded 状态通过在相关图像上触发 onLoad 的函数设置为 true。谢谢!
  • 听起来不错,是的,你需要一些时间来让你的头脑进入正确的思维方式,我也是一样,但你很快就会接受它,然后你就可以开始了。很高兴你成功了。
  • 编辑 - 我想我会在示例中添加更多细节,展示我如何处理加载图像状态/加载动画。希望对遇到此问题的人有所帮助。
【解决方案2】:

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

【讨论】:

  • 我认为你是对的。我会尝试并评论我的结果。似乎我在使用此功能时可能没有考虑“React”。
  • 感谢您的反馈,但我认为 Giuseppe 的回答,结合 imageLoaded 状态测试,更适合 React 叙述。