javascript - 如何将数据传递给组件?
问题描述
警告:您可能有拼写中风
嘿!我有一个非常简单的问题(也许):我应该如何将数据传递给我的组件?现在我只能看到 2 个解决方案:props(从 App 到我的组件)和 redux(mapStateToProps,mapDispatchToProps)(我们现在跳过 ContextAPI)
案例#1(道具(从应用程序到我的组件))
例如,我的网站上有一个商品清单。然后我的列表必须接收数据来呈现它。我应该通过 App、Main、SomeWrapper、SomeOtherWrapper、GoodsList(例如)传递它,不要犯错误,然后才渲染所有商品。现在,假设我需要将 onCLick 添加到 GoodsItem => 我需要通过所有组件传递 onGoodsItemClick,修复所有测试(因为 PropTypes 会警告)和 PropTypes。这有点复杂,例行公事而且不是很技术,不是吗?
案例2(redux(只通过mapStateToProps,mapDispatchToProps的需求道具))
好的,让我们看看第二种情况:排序组件。我已经为我的组件编写了连接函数。它们看起来像这样:
const mapStateToProps = (state, ownProps) => ({
...ownProps,
sortType: state.sortType,
allOffers: state.allOffers // allOffers imports only for mapDispatchToProps
});
const mapDispatchToProps = (dispatch) => ({
onSortChange: (allOffers, sortType) => {
dispatch(ActionCreator.changeSortType(sortType));
dispatch(ActionCreator.sortOffers(allOffers, sortType)); // allOffers is using only here
}
});
在这里,我必须接收 allOffers 才能将它提供给 mapDispatchToProps 以用于排序功能(也许这里有错误。据我所知,ActionCreator 无法访问存储,只能使用 args)。为什么我要接收数据,甚至不会在页面上呈现?
在这种情况下,React 开发人员会做什么?只使用一种方法?在不同的情况下使用两者?将这两种方法与修订相结合?使用第三种方法?
解决方案
我想我们同意您的“案例#1”示例是错误的方法。
您的 redux 示例(“案例 2”)表明您传递sortType
并传递allOffers
给该组件只是为了有一些地方可以调用 auseEffect
或其他东西,并且该组件根本不关心这些属性。
那么为什么要使用这个组件来调用
onSortChange()
,为什么不在父组件中处理呢?- 您可以
作为回调传递,而不是传递
sortType
和向下传递。allOffers
onSortChange
- 如果
onSortChange
在 a 中调用useEffect
,那么您可能可以将useEffect
自身向上移动到父组件中useEffect
,如果它比调用onSortChange
.
- 您可以
作为回调传递,而不是传递
sortType
并且allOffers
是 redux 状态的属性,所以可能你根本不需要传递它们,因为它们在 reducer 中可用。如果您有不同的减速器并且它们都没有同时具有两种状态,您可能会考虑- 重新设计状态/减速器
- 只将其中一个属性传递给减速器,并直接在减速器内部使用状态中的另一个
注意:直到现在,我总是为此类问题找到“干净”的解决方案,但我仍然不确定它是否总是可以完成,或者这是否可以解决。如果我的解决方案不适用于您的用例,请随时添加评论以解释原因(或相应地更新您的问题)。
推荐阅读
- angular - 以角度制作练习屏幕
- php - 带有 HTML 内容的 Codeigniter 邮件功能格式不正确
- android - 我有一个 sqlite 表,我想在每个月底从该表中删除一行。有没有办法在Android中做到这一点
- reactjs - Material UI Autocomplete 以表格格式显示建议,并附有标题
- php - 如何使用 PHP preg_match 捕获两个括号之间的字符串并忽略所有外部?
- python - 获取 Python 3 字符串中的第二个单词
- arrays - 在 C 中声明字符串的更好方法是什么?
- forms - C# 按下按钮显示面板,在它们之间切换不起作用
- python - Sqlalchemy 在使用 func.sum 时保留对象
- python - /invoice/ Flowable 处的布局错误
与单元格(0,0)