【问题标题】:Connecting redux store to nextjs layout将 redux 存储连接到 nextjs 布局
【发布时间】:2019-06-21 15:50:08
【问题描述】:

我有一个简单的 nextjs 布局:

export default class AppLayout extends React.Component {
    render() {
        return (
            <>
                <Header />
                {this.props.children}
                <Footer />
            </>
        )
    }
}

我一直在尝试用 redux 商店包装它:

import React from 'react'
import Header from './header'
import Footer from './footer'
import Page from './page';
import { connect } from 'react-redux';

class AppLayout extends React.Component {
    render() {
        return (
            <>
                <Header />
                {this.props.children}
                <Footer />
            </>
        )
    }
}

const page = (props) => {
    return <AppLayout {...props} />

}

export default Page(connect(state => state)(page));

这不起作用,因为我正在使用布局丢失每个页面的正文 我做错了什么?

store.js 很简单:

import { createStore } from 'redux';
import reducer from './reducers';

export default createStore(reducer);

页面是:

import React from 'react';
import { Provider } from 'react-redux';
import store from './store/store';

const page = (Page) => {
    return (
        class PageWrapper extends React.Component {
            render() {
                return (
                    <Provider store={store}>
                        <Page />
                    </Provider>
                )
            }
        }
    )
}
export default page;

看起来商店将自己注入为道具,替换了之前每个页面都有子节点的道具……这不是很好,因为还需要之前的道具……

欢迎提出任何意见

【问题讨论】:

  • Page 是什么?否则,只需 connect(state =&gt; state)(AppLayout) 就足够了。
  • 页面 - 将代码添加到问题中。这是加载商店的地方。我需要导出布局 - 您如何建议这样做?
  • 您可以删除像const page ... 包装器这样的不必要的代码,这个组件没有做任何事情。和connect(state =&gt; state) 一样。更清晰易懂只需export default Page(connect()(AppLayout))
  • 谢谢,但仍然是同样的问题 - 如果添加商店,页面的正文会丢失,只有页脚和页眉......如果我只做export default AppLayout,正文很好,如果我连接商店,身体就会消失......这是因为商店搞砸了 {this.props.children} 这是身体被传递到的地方......
  • 啊,当然,我可以看到这个问题。基本上,当您使用 Provider 定义 const page = 包装器时,您正在调用没有 children 道具的 组件。尝试在没有包装器的情况下初始化Provider,直接在 AppLayout 组件上进行

标签: javascript reactjs react-redux next.js


【解决方案1】:

问题是因为您没有使用儿童调用AppLayout。让我解释一下:

在你的 PageWrapper 中,你定义这个:

const page = (Page) => {
  return (
    class PageWrapper extends React.Component {
        render() {
            return (
                <Provider store={store}>
                    <Page />  // --> Page does not have children, so, you never gonna see anything
                </Provider>
            )
        }
    }
  )
}
export default page;

所以,你可以做很多事情来解决这个问题,最简单的是清理代码,你可以解决这个问题:

class AppLayout extends React.Component {
  render() {
    return (
        <Provider store={store}>
          <Header />
            {this.props.children}
          <Footer />
        </Provider>
    )
  }
}

export default AppLayout

或者只是添加渲染子节点,像这样:

const page = (Page) => {
  return (
    class PageWrapper extends React.Component {
        render() {
            return (
                <Provider store={store}>
                    <Page>
                      { this.props.children }
                    </Page>
                </Provider>
            )
        }
    }
  )
}

export default page;

【讨论】:

  • 刚试了第一个cleaner版本,出现错误:` Invariant Violation: could not find "store" in the context of "Connect(AppLayout)"。要么将根组件包装在 中,要么将自定义 React 上下文提供者传递给 ,并将相应的 React 上下文使用者传递给连接选项中的 Connect(AppLayout)。`
  • 是的,是我的错,要解决它,只导出没有connect函数
  • 现在工作!非常感谢。我也尝试了第二个选项,它没有作为 ReferenceError: props is not defined 我想知道如果提供者在那里,为什么不需要连接商店?
  • 我已经编辑过了。是this.props,因为在一个类中。如果我的回答对你有希望,别忘了标记为敬畏
猜你喜欢
  • 2019-04-18
  • 1970-01-01
  • 2017-11-21
  • 1970-01-01
  • 1970-01-01
  • 2016-12-27
  • 2021-01-01
  • 2018-08-28
  • 2017-04-12
相关资源
最近更新 更多