【问题标题】:how to implement the new react-redux v6.0.0如何实现新的 react-redux v6.0.0
【发布时间】:2019-05-12 21:14:35
【问题描述】:

我试图将 react-redux v5.X.X 迁移到 v6.0.0 并且似乎没有任何文档。 我正在使用以下版本: "react": "^16.4.2" "redux": "^4.0.0" "react-redux": "^6.0.0"

官方变更日志说。

不再支持将 store 作为 prop 传递给连接的组件。相反,您可以将自定义 context={MyContext} 属性传递给 和 。您也可以通过 {context : MyContext} 作为连接选项。 链接是here

这是我的根index.jsx

import React from 'react';
import ReactDOM from 'react-dom';
import { configureStore, history } from './Store';
import App from './App.hot';

import 'antd/dist/antd.min.css';
const reduxStore = configureStore();
ReactDOM.render(<App store={reduxStore} history={history} />, document.getElementById('root'));

这是我的app.jsx(根组件)

import React from 'react';
import PropTypes from 'prop-types';
import { Provider, connect } from 'react-redux';
import { bindActionCreators } from 'redux';
import { ConnectedRouter } from 'connected-react-router';
import Layout from './Layout';

class App extends React.Component {
  static propTypes = {
    store: PropTypes.object.isRequired,
    history: PropTypes.object.isRequired,
  };

  render() {
    const { store, profile, history } = this.props;
    return (
      <main className="app-wrapper">
        // what i understand from change log is this part 
        // i need to pass context instead of store as props. 
        <Provider store={store}>
          <ConnectedRouter history={history}>
            <Layout user={profile} />
          </ConnectedRouter>
        </Provider>
      </main>
    );
  }
}


function mapStateToProps(store) {
  return {
    ...
  };
}
function mapDispatchToProps(dispatch) {
  return bindActionCreators({
    ...
  }, dispatch);
}
export default connect(mapStateToProps, mapDispatchToProps)(App);

根据更改日志,我创建了 context 并将其传递给提供者

 const storeContext = React.createContext(reduxStore);

这是我更改后的render 函数

  render() {
    const { store, profile, history } = this.props;
    return (
      <main className="app-wrapper">
        <Provider context={storeContext}>
          <ConnectedRouter history={history}>
            <Layout user={profile} />
          </ConnectedRouter>
        </Provider>
      </main>
    );
  }

store 作为props 传递给provider 会出现以下错误

在 props 中传递 redux 存储已被删除,并且不执行任何操作。要为特定组件使用自定义 Redux 存储,请使用 React.createContext() 创建自定义 React 上下文,并将上下文对象传递给 React-Redux 的 Provider 和特定组件,例如:。你也可以传递一个 {context : MyContext} 选项来连接

作为context 传递会出现以下错误

在“Connect(App)”的上下文中找不到“store”。要么将根组件包装在 a 中,要么将自定义的 React 上下文提供者传递给连接选项中的 Connect(App),并将相应的 React 上下文消费者传递给。

我没有找到任何文档,期望这个 redux 历史文档 here 它讲述了 react-redux 中问题的所有问题和解决方案,以及 context api 如何修复它。但我不确定如何在实际项目中实际实施它。

有人遇到过同样的问题吗?或者你能告诉我如何准确地实施这个改变。

谢谢

【问题讨论】:

  • 你能分享你的Store.js吗?
  • redux api 没有变化。只有 react-redux 发生了变化。我认为没有必要分享商店@quirimmo
  • 我遇到了和你一样的问题。我设法做到了这一点:const customContext = React.createContext(null); ... &lt;Provider context={customContext} store={store}&gt; &lt;ConnectedRouter context={customContext} history={history}&gt; 但是我不断收到以下子组件的错​​误,这些子组件也需要访问 customContext。您在这方面取得了进展吗?
  • @user3632710 react-redux repo 说他们正在更新文档。所以我在等那个。现在我正在使用 react-redux 的上一个工作版本
  • @hannad rehman 好的,谢谢 :)

标签: javascript reactjs react-redux react-context


【解决方案1】:

我能够通过实际聆听错误消息的内容来解决问题。

我的代码有两个问题

  1. 我将store 作为道具传递给我的&lt;App /&gt; 组件。这就是为什么出现第一个警告/错误消息的原因。

在 props 中传递 redux 存储已被删除,并且不执行任何操作。要为特定组件使用自定义 Redux 存储,请使用 React.createContext() 创建自定义 React 上下文,并将上下文对象传递给 React-Redux 的 Provider 和特定组件,例如:。你也可以传递一个 {context : MyContext} 选项来连接

要解决这个问题,不要将整个 redux store 作为道具传递给任何组件

  1. 来自react-reduxProvider 不是根组件。错误信息说

在“Connect(App)”的上下文中找不到“store”。要么换行 Provider 中的根组件,或者将自定义的 React 上下文提供程序传递给 以及对应的 React 上下文消费者到 Connect(App) 中 连接选项

所以我跟着句子中的第二个wanring

要么将根组件包装在 Provider 中,要么传递自定义的 React 上下文

所以我将我的主根包裹在提供程序中。事情开始运作良好。

ReactDOM.render(
  <Provider store={reduxStore}>
    <App />
  </Provider>, document.getElementById('root'),
);

【讨论】:

  • 但在我的情况下,即使将根组件包装在&lt;Provider /&gt; 中,错误仍然存​​在。还有其他建议吗?
【解决方案2】:

我遇到了同样的问题,我就是这样解决的。

const MyContext = React.createContext();

class App extends Component {
  render() {
    return (
      <Provider store = {store} context={MyContext}>
        <BrowserRouter>
          <div>
            <Main context={MyContext}/>
          </div>
        </BrowserRouter>
      </Provider>
    );
  }
}

【讨论】:

    猜你喜欢
    • 2021-05-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多