Рендеринг нескольких компонентов react при загрузке страницы

#reactjs #react-functional-component #rerender

Вопрос:

У меня есть рабочий стол с тремя компонентами react, Продуктами, боковой панелью и категорией. На главном экране есть собственное действие отправки, а также планер дальности и категория. Итак, когда загружается рабочий стол, действие listProduct запускается трижды, потому что все компоненты отправляют это действие, поэтому продукты отображаются трижды.

Я хочу прекратить эту повторную визуализацию.

Рабочий стол:

 const HomeScreen = () =gt; {   const dispatch = useDispatch()   const productList = useSelector((state) =gt; state.productList)  const { loading, error, products } = productList   // console.log(products)   useEffect(() =gt; {  dispatch(listProducts(100000, ''))  }, [dispatch])   return (  lt;gt;  lt;Col style={{ maxWidth: '20%', marginLeft: '-300px', marginRight: '-100px', backgroundColor: '#f0f0f0', padding: '20px' }}gt;  lt;Rowgt;  lt;SideBar /gt;  lt;/Rowgt;  lt;Row style={{ marginTop: '30px' }}gt;  lt;Category /gt;  lt;/Rowgt;  lt;/Colgt;  {loading ? (  lt;Loader /gt;  ) : error ? (  lt;Message variant='danger'gt;{error}lt;/Messagegt;  ) : (  lt;Col style={{ marginTop: '-80px' }} gt;  lt;Rowgt;  {products.map((product) =gt; (  lt;Col key={product._id} sm={12} md={6} lg={4} xl={3}gt;  lt;Product product={product} /gt;  lt;/Colgt;  ))}  lt;/Rowgt;  lt;/Colgt;  )}  lt;/gt;  ) }   export default HomeScreen;  

Дальнобойная горка:

 const SideBar = () =gt; {   const dispatch = useDispatch()   const [value, setValue] = useState(10)  const [finalValue, setFinalValue] = useState(null)  // console.log(value)   // const productList = useSelector((state) =gt; state.productList)  // const { products } = productList   useEffect(() =gt; {  dispatch(listProducts(finalValue, ''))  }, [dispatch, finalValue])   return (  lt;gt;  lt;Form.Label column sm="6"gt;  Price Range:  lt;/Form.Labelgt;  lt;RangeSlider max={1000}  value={value}  onChange={e =gt; setValue(e.target.value)}  onAfterChange={e =gt; setFinalValue(e.target.value)}  size='sm' /gt;  lt;/gt;  ) }  export default SideBar;  

Category:

 const Category = () =gt; {   const dispatch = useDispatch()   const [value, setValue] = useState('')   // console.log(value)   useEffect(() =gt; {  dispatch(listProducts('', value))  }, [dispatch, value])   return (  lt;gt;  lt;Formgt;  lt;Form.Label column sm="6"gt;  Category:  lt;/Form.Labelgt;  {['radio'].map((type) =gt; (  lt;div key={`inline-${type}`} className="mb-3"gt;  lt;Form.Check  inline  label="Electronics"  name="group1"  type={type}  value='Electronics'  onChange={e =gt; setValue(e.target.value)}  id={`inline-${type}-1`}  /gt;  lt;Form.Check  inline  label="Clothing"  name="group1"  type={type}  value='Clothing'  onChange={e =gt; setValue(e.target.value)}  id={`inline-${type}-2`}  /gt;  lt;Form.Check  inline  label="Food amp; Beverage"  name="group1"  type={type}  value='Food amp; Beverage'  onChange={e =gt; setValue(e.target.value)}  id={`inline-${type}-3`}  /gt;  lt;/divgt;  ))}  lt;/Formgt;  lt;/gt;  ) }  export default Category  

Product:

 const Product = ({ product }) =gt; {  return (  lt;Card className='my-3 p-3 rounded' style={{ marginRight: '20px' }}gt;  lt;Link to={`/product/${product._id}`}gt;  lt;Card.Img src={product.image} variant='top' /gt;  lt;/Linkgt;   lt;Card.Bodygt;  lt;Link to={`/product/${product._id}`}gt;  lt;Card.Title as='div'gt;  lt;strong id="title" style={{ textDecoration: 'none' }}gt;{product.name}lt;/stronggt;  lt;/Card.Titlegt;  lt;/Linkgt;   lt;Card.Text as='h3'gt;${product.price}lt;/Card.Textgt;  lt;/Card.Bodygt;  lt;/Cardgt;  ) }  export default Product