【问题标题】:How to extract values from components that have been rendered in ReactJS?如何从 ReactJS 中渲染的组件中提取值?
【发布时间】:2021-12-27 01:31:53
【问题描述】:

我是 React 新手,我刚刚开始了一个新项目来学习它。目前我被困在如何从另一个组件呈现的组件中精确计算值。我将给出一个示例代码来更好地解释自己。

假设我已经构建了组件水果和蔬菜,它们每个都有

this.state = {
   price: 0,
}

以后

this.setState({price:/*randomly generated positive integer*/})

我尝试将它们封装在一个名为 Base 的新组件中。在 Base 的 render() 函数中,我有:

render() {
    return (
    <>
        <Fruit></Fruit>
        <Vegetables></Vegetables>
        <button onClick={() => this.add()}>Add Prices!</button>
    </>
    )
}

其中 add() 函数旨在添加先前呈现的水果和蔬菜价格的价格。我尝试为它们分配一个 id 并使用 DOM 来获取它们的值,但我无法访问它们的 this.state。有没有办法实现这一点,或者,在 React 中这样做的常见做法是什么?提前感谢您的任何指导!

【问题讨论】:

  • 为此,您通常会将每个子组件的价格状态带到父 Base 组件,以便您可以在父组件中更新它。您可以使用道具将单个价格值传递给子组件
  • 感谢您的回答。不过我想知道,由于我的 Base 组件只是项目中所有内容的包装器,如果我在 Base 本身中包含价格,它会不会导致更多的耦合?
  • 不是真的,因为如果您只想在给定时间在不同的屏幕上。但是您可以将 Base 组件重命名为 HomeScreen 或这些词中的其他名称。

标签: javascript reactjs react-component


【解决方案1】:

好吧,根据定义,您不应该能够在组件之外修改 React 的组件状态。 (从父母我认为没有办法afaik。但如果你想从孩子更新,你可以通过道具传递一个函数,从父母到孩子,更新父母的状态)。

解决这个问题的简单方法是在Base 组件的状态中定义价格,然后在 Base 组件中添加函数将更新 Base 状态。你可以通过道具将价格传递给水果和蔬菜。

类似的东西:

function Base() {
    const [prices, setPrices] = useState({
        fruit: 20,
        vegetable: 10,
    });

    const add = () => {
        setPrices({
            fruit: prices.fruit + 10,
            vegetable: prices.vegetable + 15
        });
    }

    return (<>
        <Fruit price={prices.fruit}></Fruit>
        <Vegetables price={prices.vegetable}></Vegetables>
        <button onClick={() => this.add()}>Add Prices!</button>
    </>);
}

function Fruit({price})
{
//----
}

function Vegetable({price})
{
//.....
}

但是,在复杂的应用程序中,通过 N 个子节点传递 props 会变得乏味。将来当您的应用程序增长时,您可能希望查看 React Contexts。 https://reactjs.org/docs/context.html

【讨论】:

  • 感谢您的示例代码和解释。我这里还有 1 个问题:如果我们以这种方式传递 props,对水果/蔬菜价格的任何修改是否会反映在它们的基础值中,从而导致 DOM 更新?
  • 您不能从组件更改道具,如果您需要从组件内部更改道具,则需要将更新父组件状态的函数作为道具传递给子组件。例如,在这种情况下,如果您想在 Fruit 或 Vegetables 中添加 Add Prices! 按钮,您可以将 add 函数作为 prop 传递给它们,并从 Fruit 或蔬菜组件内部调用传递的函数。
  • 只是要补充一点,当函数被调用时,它将导致 Base 中的状态更新,这将导致 Base 组件的 DOM 重新渲染,然后它将重新渲染所有子组件,即水果、蔬菜和按钮 I想想。
  • 嗨,我想跟进。由于我的 add() 函数涉及水果和蔬菜的价格,我想我只能在 Base 中进行计算。但是,我在 add() 之后记录了它们的价格总和,它显示了正确的值,但是 DOM 没有随着更改正确更新(在水果/蔬菜中呈现)。请问有办法解决吗?
  • 嗯,听起来你做错了什么,没有代码我无法判断你做错了什么,对不起:D
【解决方案2】:

一种常见的做法是在主组件中定义价格,然后将这些价格作为道具传递给其子组件。

否则,您可以使用 Redux 之类的状态管理库从应用程序中的任何位置访问状态(对于这种简单的情况来说,这太过分了)

【讨论】:

  • Redux 的主要目的不是将所有应用程序的状态定义在一个地方吗? To access states from anywhere 你可以使用 React 上下文吗?
  • 当然,Redux 和 React Context 都可以解决问题
  • 只是要添加一个注释,React Context 似乎是一个更简单的解决方案。
猜你喜欢
  • 1970-01-01
  • 2015-03-10
  • 1970-01-01
  • 2021-01-22
  • 2022-10-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-06-28
相关资源
最近更新 更多