当前位置: 首页 > 知识库问答 >
问题:

如何将数据传递给功能组件?

子车修平
2023-03-14

作为React课程的一部分,我正在制作一个虚拟电子商店,并希望将产品从一个组件的状态传递到功能组件并在那里显示产品属性。如何将数据从状态传递到无状态组件?

我设置了一个组件ProductList,它存储产品(从api获取)和ProductDetail,它应该显示详细信息(通过id找到产品并显示它的描述、img等)。我设置了一个pp.js,它有两个路由-列表和详细信息。

pp.js:

class App extends Component {
  render() {
    return (
      <div>
        <h1>E-Commerce app</h1>
        <Route exact path="/" component={ProductList} />
        <Route path="/:productId" component={ProductDetail} />
      </div>
    )
  }
}

ProductList。js公司:

class ProductList extends Component {
  state = {
    isLoading: true,
    products: [],
  }

  async componentDidMount() {
    const products = await getProducts()

    this.setState({ products: products.data, isLoading: false })
  }

  render() {
    const { isLoading, products } = this.state
    return (
      <div>
        {isLoading && '...'}
        {products && (
          <ul>
            {products.map(item => (
              <li key={item.id}>
                <Link to={`${item.id}`}>
                  <h2>{item.attributes.name}</h2>
                  <img
                    src={item.attributes.image_url}
                    width="60"
                    alt={item.attributes.description}
                  />
                </Link>
              </li>
            ))}
          </ul>
        )}
      </div>
    )
  }
}

产品Detail.js:

const ProductDetail = ({ match }) => {
  return (
    <div>
      <p>Product ID: {match.params.productId}</p>
      <img src="" alt="" />
      <p>Product name: </p>
      <p>Product description: </p>
    </div>
  )
}

共有3个答案

扶珂
2023-03-14

第一次更改链接如下

<Link to={{
  pathname: `${item.id}`,
  state: {
    productObject: item
  }
}}>

然后更改ProductDetail组件参数

const ProductDetail = ({ match,location })

最后请像这样阅读产品名称。

<p>Product name:{location.state.productObject.attributes.name} </p>

如果有帮助,请告诉我。

谢谢

凌景辉
2023-03-14

您将需要在详情页/: productId上提出另一个请求。

请记住,如果用户直接转到productId路由,则产品数据将不存在,这就是您需要在此处请求的原因。

要进行优化,您可以使用上下文或像Redux这样的库来管理/存储数据。因此,在执行新请求之前,您可以首先检查存储中是否存在productId的数据。

狄心水
2023-03-14

您的数据处于ProductList组件的状态,据我所知,您希望在单击链接后在另一个组件中显示一个产品详细信息,对吗?

切换路由时,组件将卸载,因此会丢失数据。

为了做到这一点,您需要进行一些状态管理,如Redux、MobX或其他状态管理库,或者您可以使用上下文API,这是最近在React中引入的一个特性。

 类似资料:
  • 问题内容: 我尝试将函数传递给子组件。当用户单击每个子组件时,将调用onclick函数。此onclick函数将写入父组件。 父组件: 子组件: 在这一行: 它说没有定义handleClick …如何解决这个问题? 感谢您的回答。 问题答案: 您需要将Agents绑定到AgentsList:这是您的代码的一个简单示例,我不得不删除一些东西,但是您明白了: http://jsfiddle.net/vh

  • 问题内容: 我正在使用py.test来测试包装在python类MyTester中的某些DLL代码。为了进行验证,我需要在测试期间记录一些测试数据,然后再进行更多处理。由于我有许多test _…文件,因此我想在大多数测试中重用测试器对象的创建(MyTester的实例)。 由于tester对象是获得DLL变量和函数的引用的对象,因此我需要将DLL变量的列表传递给每个测试文件的tester对象(要记录的

  • 使用Spring数据MongoDB。我在MongoRepository上定义了这个查询: 由于我想使用运算符,我不能通过方法命名方式构建查询,所以我使用注释。 我已经调试了prints。我将该值修改为,但没有变化。

  • 在我的Angular 2路由的一个模板(FirstComponent)中,我有一个按钮 first.component.html 我的目标是实现: 按钮点击->route to另一个组件,同时保留数据,而不使用另一个组件作为指令。 这是我试过的... 第一种方法 在同一个视图中,我存储、收集基于用户交互的相同数据。 First.Component.TS 通常通过ID路由到SecondCompone

  • 问题内容: 有时,您需要升级数据库中具有数据表中许多行的数据库,或者要有一个充满数据的数组,而不是将所有这些数据放在一起作为一个字符串,然后在SQL SERVER中拆分,或者而不是在数据库中迭代该数据表。代码逐行更新数据库,还有其他方法吗?除了SQL SERVER 2005中的传统变量以外,还有其他类型的变量吗? 问题答案: 有几种方法可以做到这一点。 如果您只是插入行,那么我将创建一个包含信息的

  • 如何在不使其成为单独变量的情况下传递数组?例如,我知道这是有效的: 但我不想让数组成为变量,因为它只在这里使用。有没有办法做到这一点: