reactjs - 如何从 React 中的组件更新状态?
问题描述
我正在处理“订单列表”页面。
我有一个钩子:
const [orders, setOrders] = useState([])
目前发生的情况:
- 加载页面时 - 我使用 Apollo 获取订单
useQuery
- 在
useEffect
:一旦我收到订单,我将它们设置为setOrders
- 然后,我返回它们:
{orders.map((order) => (
<OrderComponent order={order}/>
))}
这适用于显示数据,但我希望能够从OrderComponent
.
假设我们在 OrderComponent 中有一个注释输入:
<input type="text" name="order_notes" value={order.notes}/>
问题是: 如何处理来自子组件的此类更新?
我尝试了什么:
- 在父页面上,我创建了处理程序:
const handleOrderNotes = ({ value, orderIndex }) => {
const ordersCopy = [...orders]
ordersCopy[ordersIndex].notes = value
setOrders(ordersCopy)
}
然后我把它传递给OrderComponent
了orderIndex
:
{orders.map((order, index) => (
<OrderComponent order={order} orderIndex={index} handleOrderNotes={handleOrderNotes}/>
))}
并将处理程序添加到输入中:
<input
type="text"
name="order_notes"
value={order.notes}
onChange={(value) => {
handleOrderNotes({value, orderIndex})
}}
/>
它工作得很好。但是在我开始添加越来越多的东西之后,我想在OrderComponent
. 我开始怀疑是否有更好的方法来做这些事情?
在开发过程中,我经常遇到以下错误:
错误:超过最大更新深度。当组件在 componentWillUpdate 或 componentDidUpdate 中重复调用 setState 时,可能会发生这种情况。React 限制了嵌套更新的数量以防止无限循环。
所以我相信我在这里遗漏了一些重要的东西。
刚刚开始使用 React,所以将学徒任何输入。谢谢 :)
解决方案
我可以想到两种方法来解决这个问题。您必须根据应用程序的组织/设计方式选择适合您的应用程序。
- 如果对应用程序使用 redux 或某种状态管理,那么您不需要告诉父组件,但是由于您在子组件本身中有订单索引,您可以简单地在应用商店/状态中更新该订单本身。
- 您可能希望使用每个组件包装
useMemo
并useCallback
用于将任何回调传递给这些子组件。即使您为应用程序完成了状态管理,您也应该执行第二步以避免不必要的重新渲染
推荐阅读
- php - 如何获取默认值的记录
- php - 有效调用后无法获取谷歌分析 data_mcf 数据,显示数据但调用 getConversionPathValue() 不返回任何内容
- jenkins - 阶段并行任务脚本化管道
- terminal - 制作包含引号和斜杠的文件名
- python - 即使使用 coerce=ObjectId 也不是动态选择字段 WTFORMS 的有效选择
- android - 由于磁盘加密,Android Crashlytics 在直接启动时失败
- java - springboot外部文件db配置
- java - 将文件从厨房上传到服务器并在代号一列表中显示的源代码
- vue.js - VUE - axios Post 不工作
- php - 选择 - 24 小时后的行