reactjs - 使用 useEffect 反应 init carousel jQuery lib
问题描述
我正在做一个项目,我必须将经典网站 (HTML/JS) 切换到 React。
除了轮播(jQuery库)的初始化有问题之外,这一切进展顺利......
需要明确的是,我有几个组件(下面的子结构):
- 家
---- 顶级产品
-------- 产品滑块
- - - - - - - - 产品
因此,在 Home 组件中,我集成了 TopProducts 组件,该组件通过 Axios 进行 API 调用以获取产品列表并将结果传递给 ProductsSlider 组件。
这工作得很好。
一旦 API 调用完成并生成组件,我需要通过 jquery 函数初始化轮播。
只有当我将此函数的调用放在 axios ".then" 函数中,并且添加到调用结果的状态变量下方时,这才有效。
像那样 :
useEffect(() => {
axios.get('products/bestsellers')
.then(response => {
setTopProducts(response.data.response);
window.carousel_slider();
});
}, []);
但是这里很不清楚(如果我在页面中有另一个轮播......),所以我想在我的 Home 组件中调用这个函数,但它不起作用,因为 Home 的 useEffect总是在渲染 TopProducts 组件之前调用...
所以我不知道在渲染所有内容时如何调用它,我看到使用 Class 组件, ComponentWillUnmount 应该可以工作,但我想使用 Hooks ...
我知道最好不要将 jQuery 与 React 一起使用,但是转换所有内容并查找可能在 react 中不存在的 jquery 库会太长......
我不知道我是否有正确的方法,有人有想法吗?
先感谢您
解决方案
我发现了问题。
这是因为 topProducts 状态是 init 且数组为空,并且 React 在渲染它之前不会等待 useEffect 结束,所以 carousel_slider() 是在空组件中执行的。
只需要在渲染前检查 topProducts 状态长度:
{topProducts.length > 0 ? (
<ProductsSlider products={topProducts}/>
) : <Spinner />}
推荐阅读
- asp.net-core - 显示包含 HTML 的文本子字符串
- python - 将大小不均匀的列表转换为 LSTM 输入张量
- python - 如何在python中读取一个大的.jl文件
- java - 使用具有两个不同延迟的 retryWhen 重新连接
- autodesk-forge - 下载压缩衍生品
- java - 在数组中存储从右上角到左下角的所有对角线
- apache-kafka - 当replica.lag.time.max.ms 较高时,生产者request.timeout.ms 是否兑现?
- git - 'git diff' 可以只输出长行中的变化吗?
- javascript - 如何在 JavaScript 中创建一个将文本增加 1px 的按钮
- c# - 使用 XmlSerializer 时,我们可以将 Flag 枚举值标记为过时吗?