当前位置: 首页 > 面试题库 >

Typescript + Redux:在父组件中排除Redux道具

鲜于允晨
2023-03-14
问题内容

我正在为当前的Web应用程序使用Redux和Typescript。

定义通过来接收redux-actions的组件的props以及@connect从parent 接收props的最优方法是什么?例:

// mychild.tsx
export namespace MyChildComponent {

  export interface IProps {
    propertyFromParent: string;
    propertyFromRedux: string;  // !!!! -> This is the problem
    actionsPropertyFromRedux: typeof MyReduxActions;  // !!!! -> And this     
  }
}

@connect(mapStateToProps, mapDispatchToProps)
export class MyChildComponent extends React.Component <MyChildComponent.IProps, any> {

... react stuff

}

function mapStateToProps(state: RootState) {
  return {
    propertyFromRedux: state.propertyFromRedux
  };
}
function mapDispatchToProps(dispatch) {
  return {
    actionsPropertyFromRedux: bindActionCreators(MyReduxActions as any, dispatch)
  };
}




// myparent.tsx
export class MyParentComponent extends React.Component <MyParentComponent.IProps, any> {

... react stuff

    render(){
        // typescript complains, because I am not passing `propertyFromRedux`! 
        return <div><MyChildComponent propertyFromParent="yay" /></div>;
    }

}

如我所见,我有2个解决方案。

  1. 只需通过我的整个应用程序传递操作并说明状态即可。但这意味着即使需要更改一些小的子组件,我的整个应用也会重新渲染。还是在所有商店更改中侦听我的顶级组件的替代方法?然后,我将不得不为shouldComponentUpdate不是平面对象的道具编写很多逻辑

  2. 设置帕拉姆中IPropsMyChildComponent 这样的可选:

--

// mychild.tsx
export namespace MyChildComponent {

  export interface IProps {
    propertyFromParent: string;
    propertyFromRedux?: typeof MyAction;  // This is the problem
  }
}

还有另一种方法吗?在我看来,以上两种方式都太混乱了。


问题答案:

您需要拆分你的道具-
你需要一个DispatchPropsStatePropsOwnProps类型。您还必须将TypeScript的泛型用于connect

  • DispatchProps 是您的动作创造者。
  • StateProps是您的状态道具(duh)-它们来自mapStateToProps-该函数的返回类型应与此类型匹配。
  • OwnProps是您的组件接受(也许期望)的道具。可选道具应在界面中标记为可选。

我这样做的方式(没有装饰器,但是我确定它在这里适用)是

interface ComponentDispatchProps {
    doSomeAction: typeof someAction;
}

interface ComponentStateProps {
    somethingFromState: any;
}

interface ComponentOwnProps {
    somethingWhichIsRequiredInProps: any;
    somethingWhichIsNotRequiredInProps?: any;
}

// not necessary to combine them into another type, but it cleans up the next line
type ComponentProps = ComponentStateProps & ComponentDispatchProps & ComponentOwnProps;

class Component extends React.Component<ComponentProps, {}> {...}

function mapStateToProps(state, props) { 
    return { somethingFromState };
}

export default connect<ComponentStateProps, ComponentDispatchProps, ComponentOwnProps>(
    mapStateToProps,
    mapDispatchToProps
)(Component);

我认为您必须使用@connect<StateProps, DispatchProps, OwnProps>它将装饰并返回一个接受的类OwnProps

如果您看一下connectTS 中的s实现

export declare function connect<TStateProps, TDispatchProps, TOwnProps>(...): ComponentDecorator<TStateProps & TDispatchProps, TOwnProps>

interface ComponentDecorator<TOriginalProps, TOwnProps> {
    (component: ComponentClass<TOriginalProps> | StatelessComponent<TOriginalProps>): ComponentClass<TOwnProps>;
}

connect<...>返回一个ComponentDecorator,它在传递组件时(在您的情况下,将装饰器编译出来时是透明地完成的),而不管是否返回StateProps,并DispatchProps返回一个Expected
组件OwnProps

connect (非一般)收益 InferableComponentDecorator

export interface InferableComponentDecorator {
    <P, TComponentConstruct extends (ComponentClass<P> | StatelessComponent<P>)>(component: TComponentConstruct): TComponentConstruct;
}

它将尝试根据提供给组件的道具来推断道具,在您的情况下,这是所有道具的组合(从上方OwnProps变为ComponentProps)。



 类似资料:
  • 我想将自定义属性传递到我的Redux表单字段。文件中说: 传递给字段的任何自定义道具都将与输入和元对象合并到同一级别的道具对象中。 但将自定义道具传递给字段组件将引发编译错误: 类型“”的属性“myProp”不存在 在props属性中,我只能添加一组预定义的属性,如占位符或类型。传递另一个道具将抛出此错误: 键入“{name:“E-Mail”;组件:(props:any)= 是否有可能将自定义道具

  • 本文向大家介绍redux中间件相关面试题,主要包含被问及redux中间件时的应答技巧和注意事项,需要的朋友参考一下 中间件提供第三方插件的模式,自定义拦截action一> reducer的过程。变为action一〉 middlewares 一> reducer。这种机制可以让我们改变数据流,实现如异步action, action过滤,日志输出,异常报告等功能。 常见的中间件: redux一logg

  • 问题内容: 说我有一个简单的切换: 当我单击按钮时,颜色组件在红色和蓝色之间切换 我可以通过执行以下操作来达到此结果。 index.js container.js action_creator.js reducer.js 但这是很多代码的地狱,我可以用jQuery,某些类和某些CSS在5秒钟内完成一些工作。 所以我想我真正要问的是,我在这里做错了什么? 问题答案: Redux主要用于“应用程序状态

  • Button.js部分 我的问题是组件的道具似乎没有随redux商店更新。在onClick函数运行后,redux存储更新为正确的值,mapStateToProps也会以正确的状态运行,如果我尝试从prop记录状态,则仍然会获得旧值。如果我在返回JSX之前在render函数中执行相同的日志,那么我会从props中获得正确的状态,我无法理解为什么在redux存储被删除后它不会立即更新。因此,如果我将代

  • 最后,在中有一个子组件,名为。这就是问题所在。我还将从获得的项传递到。因此,数据流是(连接)>(未连接)>(连接)。 连接到Redux。它使用redux中的一些操作来更新中的项。当我在中更新时,可以很好地接收更新后的数据,但是却什么都接收不到。中的项从未更新。 我发现问题出在将连接到Redux时。如果没有连接到redux,它也会接收更新的道具,就像一样。 组件如下。我已经试着尽可能地简化它们。 D

  • 我写这个问题是因为我想请你帮助我如何在我的功能组件上使用redux。我查看了其他使用React组件的示例,但我不理解如何在功能组件中获得“存储”值。 我的想法是用我的 百货商店getState() 在我的功能组件中检查状态并与UI交互,但我无法实现。 需要帮忙吗? 例如,功能组件: 如何在标题组件中使用“存储”对象?它在我的应用程序组件上工作,只是我不知道如何在我的组件中使用它。 我的问题是: 我