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

在同一页面/路由上具有相同的可重用redux反应组件的多个实例

长孙鸿
2023-03-14
问题内容

我们正在创建一个大型的前端应用程序。

我们正在使用React-Redux

我们正在创建一些可重用的组件。

这个问题是关于在同一页面/路由上具有相同的可重用redux react组件的多个实例

问题详细信息:

我们有一个Sectionheader组成部分。绑定到redux状态。

它侦听header属性reducer SectionheaderReducer

由于我们Sectionheader在页面上有2个实例,它们都倾向于显示相同的值,因为它们绑定到相同的存储状态属性。

如何使基于Redux的可重用React组件可配置?这样每个实例可以为reducer提供不同的header属性值SectionheaderReducer


问题答案:

您需要实现某种命名实例的方式。这可以像传递密钥以区分组件和减速器一样基本。

您可以ownPropsmapStateToProps函数中使用来引导映射到名称空间

const mapStateToProps = (state, ownProps) {
    let myState = state[ownProps.namespace]
    return {
        myState.value
    }
}

可以使用相同的方法将名称空间传递给 mapDispatchToProps

const mapDispatchToProps = (dispatch, ownProps) {
    return {
        myAction: (myParam) => dispatch(myAction(ownProps.namespace, myParam))
    }
}

只要记住在动作类型中使用名称空间,这样减速器就不会踩到脚趾

const myAction => (namespace, myParam) {
    return { type: `${namespace}/${MY_TYPE_CONSTANT}`, myParam }
}

并确保还对减速器进行命名空间

const myReducer = (namespace) => (state = initialState, action) => {
    switch(action.type) {
        case `${namespace}/${MY_TYPE_CONSTANT}`:
            return { ...state, action.myParam }
        default:
            return state
    {
}

现在在组合化简器时添加2个命名空间化的化简器

combineReducers({
    myInstance1 : myReducer('myInstance1')
    myInstance2 : myReducer('myInstance2')
}

最后将命名空间传递给每个实例

render() {
    return (
        <div>
            <MyComponent namespace='myInstance1' />
            <MyComponent namespace='myInstance2' />
        </div>
    )
}

免责声明: 我是以下库的主要贡献者。

redux-subspace可以提供更高级的命名空间实现,而无需为要为其具有多个实例的每个组件重新实现此模式。

创建减速器与上面类似

const reducer = combineReducers({ 
    myInstance1: namespaced('myInstance1')(myReducer)
    myInstance2: namespaced('myInstance2')(myReducer)
})

然后SubspaceProvider可以用来切换每个组件的状态

render() {
    return (
        <div>
            <SubspaceProvider mapState={state => state.myInstance1} namespace='myInstance1'>
                <MyComponent />
            </SubspaceProvider>
            <SubspaceProvider mapState={state => state.myInstance2} namespace='myInstance2'>
                <MyComponent />
            </SubspaceProvider>
        </div>
    )
}

只需确保您也将mapStateToProps功能更改为从提供程序中映射的子树开始遍历即可

const mapStateToProps = (state) {
    return {
        state.value
    }
}

如果您想减少嵌套,则还有一个高阶组件。



 类似资料:
  • 我尝试有多个路由,所以我可以从一个路由重定向到另一个路由,但是每次我添加另一个路由时,主端都会同时呈现样式和组件,我尝试过lazyLoad、Switch并在路由路径中添加“精确”

  • 目前,我有一个类分数,它允许我用三种不同的方式创建分数 对于一个整数,在这种情况下,给定的整数将是分子,分母将设置为1 有2个整数,分子和分母 最后一种方法是解析一个字符串,该字符串必须与REGEX-?\d/[1-9]\d* gcd将尽可能减少生成的分数。 我现在想实现的是,具有相同分子和分母的分数实例具有相同的引用例如。 应该返回true。 我研究了一些关于泛型和边界的章节,但我不确定这是否是我

  • 如何生成多个页面的pdf报告,每个页面上的内容相同。以下是单页报告的代码。多个页面应位于单个pdf文件中。

  • 我正在尝试配置3个驼峰路由以使用相同的JMS组件。 问题是当我“不得不”在这些不同的路径中使用相同的组件时。当我这样做时,有时会出现一个错误,告知无法连接到ActiveMQ。这是因为并发吗?如果是,我想知道是否有可能立即配置这个组件,并在没有这种并发性的情况下使用它。 当我用不同的名称定义组件时,它是有效的。E、 g:amq1、amq2和amq3。 我正在使用: 阿帕奇骆驼:2.21 代码:创建J

  • 问题内容: 我有一个Core Android Library,我在其中使用@Singleton范围定义一个CoreComponent广告,以注入CoreModule提供的类的实例。 我想从另一个依赖于核心库并且正在使用另一个组件的Android库中访问相同的@Singleton实例。 上面的代码已构建,但是@Singleton范围对于组件是“本地的”。换句话说,有两个单例实例,一个用于CoreCo

  • 问题内容: 我有两个路线组,“动漫”和“漫画”。这些URL是/ anime/或/manga/,但它们都共享完全相同的控制器和模板 (唯一不同的是用于每个模板的配色方案,但这些颜色是在检查是否通过过滤器的过滤器中确定的)正在查看的特定项目是动漫还是漫画) : 动漫陈述定义: 漫画状态定义: 如您所见,其中已经有很多重复,我一点都不喜欢。随着我不断添加新路线,重复次数只会增加 (您已经可以看到mang