我有1个父组件(容器)和2个子组件(列表,selectedItem),最初我呈现所有数据到容器,并发送所有数据到列表和第一个项目作为selectedItem组件.所以你好

当用户点击列表组件中的一个项目时,它会通过函数更新父项的选定项目,父项能够更新状态,但它不会重新呈现选定项目组件.

列表组件:


    import "./SelectedImage.css"

function ListSection({items, updateSelectedItem}) {
  return (
    <div className="list-section">
      <ul>
        {
          (items).map((item) => {
            return <li key={item.id} onClick={() => updateSelectedItem(item.id)}>{item.name}</li>
          })
        }
      </ul>
    </div>
  );
}

export default ListSection;


容器组件

    

    
import LeftSection from './LeftSection';
import logo from './logo.svg';
import RightSection from './RightSection ';
import SelectedItem from './SelectedItem';
import "./App.css";
import ListSection from './ListSection';
import { Component, useState } from 'react';

const products = [
  {id: 1, name: "Lime", size: ["large", "medium", "small"], category: "Juice", image: "lime-juice.jpg"},
  {id: 2, name: "Orange", size: ["large", "medium", "small"], category: "Juice", image: "orange-juice.jpg"},
  {id: 3, name: "Mango", size: ["large", "medium", "small"], category: "Juice", image: "mango-juice.jpg"},
]

function Container() {
  let [selectItem, setSelectItem] = useState(products[0]);

  function chooseSelectedItem(id) {
    let item = products.filter((value) => {
      console.log(value.id);
      return (value.id == id)
    })
    setSelectItem(item[0]);
    console.log(item[0]);
  }

  return (
    <div className="Container">
      <ListSection items={products} updateSelectedItem={chooseSelectedItem}/>
      <SelectedItem CurrentSelectedItem={selectItem}/>
    </div>
  );
}

export default Container;

已选项目组件

import QuantityBar from "./QuantityBar";
import "./SelectedImage.css"
import { useState } from "react";

function SelectedItem({CurrentSelectedItem}) {
  let [item, setItem] = useState(CurrentSelectedItem);  

  return (
    <div className="selected-item">
      {/* <img src={item.image} className="selected-image" /> */}
      {item.name}
      {/* <QuantityBar itemCount={0} /> */}
    </div>
  );
}

export default SelectedItem;

推荐答案

由于您使用useState和prop CurrentSelectedItem初始化状态,所以对CurrentSelectedItem的任何更改都不会反映在组件的状态中.

CurrentSelectedItem发生变化时,你可以使用useEffect钩子更新SelectedItem的状态:

function SelectedItem({ CurrentSelectedItem }) {
  const [item, setItem] = useState(CurrentSelectedItem);

  useEffect(() => {
    setItem(CurrentSelectedItem);
  }, [CurrentSelectedItem]);

  ...
}

或者,如果SelectedItem只依赖于CurrentSelectedItem,则可以移除SelectedItem中的局部状态,并直接使用CurrentSelectedItem作为props ,比如

function SelectedItem({ CurrentSelectedItem }) {
  return (
    <div className="selected-item">
      {/* <img src={CurrentSelectedItem.image} className="selected-image" /> */}
      {CurrentSelectedItem.name}
      {/* <QuantityBar itemCount={0} /> */}
    </div>
  );
}

Reactjs相关问答推荐

可选链和useState挂钩

如何用Reaction做交互式的MathML?

如何在REACTIVE js中动态添加或删除输入字段?

无法在REACTION TANSTACK查询中传递参数

有没有比;KeyableShell;组成部分

我如何使用 React toastify (Promise) toast 和邮箱 js

在 useSelector() 中使用 array.map() 如何导致组件在分派操作时重新渲染?

如何在 ChartJS 中创建此图表?在 NEXTjs 和 TSX 中

useRef 不关注模态

在react 中单击父级中的按钮时如何将数据从子级发送到父级?

onChange in useEffect 的最佳实践

下一个js如何从另一个组件更新组件?

将 clerk 与 supabase 集成的最佳实践

使用 react pro 侧边栏展开折叠菜单

我收到Uncaught TypeError: props.handleSelect is not a function

我正在通过 API(有效)从 MongoDB 传递数据.可视化但我不断收到此 TypeError: Cannot convert undefined or null to object

RTK 查询Mutations 在 StrictMode 中执行两次

不能在我的代码中使用 .给我一个警告!有人知道解决方案吗?

我在使用 Elements of stripe 时使用 React router v6

哪个 PrivateRouter 实现更好:高阶组件还是替换?