将 redux store 连接到 nextjs 布局
Connecting redux store to nextjs layout
我有一个简单的 nextjs 布局:
export default class AppLayout extends React.Component {
render() {
return (
<>
<Header />
{this.props.children}
<Footer />
</>
)
}
}
我一直在尝试用 redux store 包装它:
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;
看起来商店将自己作为 props 注入,替换了以前的 props,每个页面都有子 props...这不是很好,因为还需要以前的 props...
欢迎任何想法
问题是因为您没有使用 children 调用 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
或者只添加渲染 children,像这样:
const page = (Page) => {
return (
class PageWrapper extends React.Component {
render() {
return (
<Provider store={store}>
<Page>
{ this.props.children }
</Page>
</Provider>
)
}
}
)
}
export default page;
我有一个简单的 nextjs 布局:
export default class AppLayout extends React.Component {
render() {
return (
<>
<Header />
{this.props.children}
<Footer />
</>
)
}
}
我一直在尝试用 redux store 包装它:
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;
看起来商店将自己作为 props 注入,替换了以前的 props,每个页面都有子 props...这不是很好,因为还需要以前的 props...
欢迎任何想法
问题是因为您没有使用 children 调用 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
或者只添加渲染 children,像这样:
const page = (Page) => {
return (
class PageWrapper extends React.Component {
render() {
return (
<Provider store={store}>
<Page>
{ this.props.children }
</Page>
</Provider>
)
}
}
)
}
export default page;