javascript - 为什么我的 HTML 标签中的变量没有显示出来?
问题描述
我正在尝试制作一个组件来显示数组中的随机产品。当我console log props.products[random].company
或任何其他属性时,我可以在控制台中看到它们。但是当我将它们放在 HTML 标记中时,它不会呈现。
数组的长度是 14。有随机数被渲染,但它们有时也大于 14,并且由于某种原因似乎是按顺序排列的。
这是组件的文件:
import React, { useEffect } from 'react';
import Link from 'react-router-dom';
import { connect } from 'react-redux';
import { getProducts } from '../../../actions/productsActions';
export const ProductSm = (props) => {
console.log(props.products);
return (
<div>
{
props.products.length >= 1 && setInterval(() => {
let random = Math.floor(Math.random()*props.products.length);
console.log(random);
console.log(props.products[random].company);
return (
<div>
<p>{props.products[random].company}</p>
<p>{props.products[random].name}</p>
<img src={`http://localhost:5000/${props.products[random].productImage}`} alt="productImage"/>
</div>)
}, 5000)
}
</div>
)
}
const mapStateToProps = (state) => ({
products: state.products.products,
loading: state.products.products
})
export default connect(mapStateToProps, {getProducts})(ProductSm);
这是包含 ProductSm.js 的组件:
import React, { useEffect } from 'react';
import PropTypes from 'prop-types';
import { getProducts, setLoading } from '../../../actions/productsActions';
import { connect } from 'react-redux';
import {Link} from 'react-router-dom';
import './Home.css';
import Loading from './Loading';
import Navbar from './Navbar';
import ProductSm from './ProductSm';
export const Home = (props) => {
useEffect(() => {
props.setLoading();
props.getProducts();
//eslint-disable-next-line
console.log(props.products);
console.log(props.loading);
}, []);
if(props.loading) {
return <Loading />
}
else {
return (
<div>
<Navbar />
<div className="home">
<div className="group-1">
<div className="branding">
<div className="brandName">
The
<br/>
Sole
<br/>
Store
</div>
<div>
<p>The finest designs and fits.</p>
</div>
</div>
<div className="viewProducts">
<div>
<p>
Check out our latest and greatest models
</p>
<Link className="productsBtn" to="/shoes">GO <i className="fas fa-arrow-right"/></Link>
</div>
</div>
</div>
<div className="group-2">
<div className="products">
<ProductSm />
<ProductSm />
<ProductSm />
<ProductSm />
</div>
<div className="something"></div>
</div>
</div>
</div>
)
}
}
Home.propTypes = {
products: PropTypes.array.isRequired,
loading: PropTypes.bool.isRequired
}
const mapStateToProps = state => ({
products: state.products.products,
loading: state.products.loading
});
export default connect(mapStateToProps, {getProducts, setLoading})(Home);
我真的很感激任何帮助。谢谢
解决方案
You are currently returning the result of setInterval
, not any JSX:
return (
<div>
{
props.products.length >= 1 && setInterval(() => {
The function passed to setInterval
is called asynchronously (after 5000ms in this case). So, you aren't, in fact, returning anything to render.
Instead, you probably want to track the random number as state, and trigger a re-render every 5000ms
推荐阅读
- node.js - Mongo DB mongoose schema.Save 函数正在从数据库中删除字段
- javascript - 我无法存储中间数组
- linux - 连接 Postgres Db 时出错:服务器证书与主机名不匹配
- docker - Docker RUN 与 keytool 导入到 Java 信任库成功但在映像构建期间同时失败?
- android - 撰写 LazyList 部分背景
- node.js - 节点 CLI 脚本提前退出
- docker - 如何将 docker 文件系统提取到我的本地文件系统中,这样我就不再需要使用 docker
- python - 我们可以将 mlflow 工件存储在 Azure blob 存储中,以便在 pycaret 中进行新实验吗?
- reactjs - 如何使用 Fluent UI 和 React JS 将自定义样式应用于选择组的选项
- c++ - 在彼此内部使用结构