Redux:mapStateToProps为什么第二个参数ownProps

时间:2018-12-05 08:18:55

标签: reactjs redux react-redux

我已经看到很多次人们将redux连接到组件,并且他们在mapStateToProps中使用第二个参数。

function mapStateToProps(state, ownProps) {
   return {
   rowData: state.table.rows[0],
   }; 
}

里面没用吗?如果子组件已经从父组件传递了道具,为什么我们要在mapStateToProps中再次映射/传递它们?

这有什么好处?

问候

4 个答案:

答案 0 :(得分:1)

您可以通过使用一些道具保留一些可能很小的商店数据子集来避免不必要的渲染。

例如,您有一个幻灯片应用程序,而Redux存储了所有幻灯片,而您的组件负责一张幻灯片。道具值包含幻灯片编号。通过仅提取特定幻灯片的存储数据,您可以使React和React-Redux更容易避免不必要的重新渲染。可能是由于其他用户在协作演示编辑器中编辑了另一张幻灯片而导致商店更改了-没有理由重新呈现您的幻灯片。

https://react-redux.js.org/api/connect#ownprops

此外,Redux是全局状态,而您的组件可以使用该组件只需要的数据。如果您打算重用您的组件,或者考虑从Redux(甚至是React)切换到其他组件,或者只是想通过将Model与View分离来遵循良好实践,那么将您的组件与本质上分离开来是有意义的尽可能多地使用单例全局变量。通过仅裁剪所需的数据,并可能将其调整为满足组件的需求,就可以执行从全局Model到本地ViewModel的映射,并且很容易将组件带到其他地方,而不必担心实现时的全局Model是什么它。通过使用例如。重新组合,您可以将其进一步发展,并使您可以自由移动的事物。

答案 1 :(得分:0)

可能会覆盖前一个字段,因此可以选择。

例如:public class FixRecyclerView extends RecyclerView { public FixRecyclerView(@NonNull Context context) { super(context); } public FixRecyclerView(@NonNull Context context, @Nullable AttributeSet attrs) { super(context, attrs); } public FixRecyclerView(@NonNull Context context, @Nullable AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); } @Override protected void onMeasure(int widthSpec, int heightSpec) { if (MeasureSpec.getMode(heightSpec) == MeasureSpec.UNSPECIFIED && MeasureSpec.getSize(heightSpec) != 0) { super.onMeasure(widthSpec, MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED)); } else { super.onMeasure(widthSpec, heightSpec); } } }

答案 2 :(得分:0)

mapStateToProps中第二个参数的使用完全取决于应用程序。通常,您可能不需要它,但是在某些情况下,选择器依赖于props来过滤出结果,使用mapStateToProps

中的props值会很有用。

您可能需要使用道具的场景

  • 假设您有一个称为used的redux状态数据,则只需要显示特定区域的用户即可作为组件的支持。您可以在mapStateToProps中使用此prop值,然后返回过滤后的结果,而不是返回整个结果并在render中过滤,这可能会降低性能

答案 3 :(得分:0)

当您想从props中提取一些值或使用mapStateToProps中的值在props的返回值中分配值时,通常会出现第二个参数,然后第二个参数争论变成现实。一种典型的用法是编写选择器,该选择器使用store和传递给组件的props中的值。