2016-10-12 52 views
6

我得到这个错误:阵营+终极版: “<Provider>不支持更改'对飞store`”

<Provider> does not support changing store on the fly. It is most likely that you see this error because you updated to Redux 2.x and React Redux 2.x which no longer hot reload reducers automatically. See https://github.com/reactjs/react-redux/releases/tag/v2.0.0 for the migration instructions.

我有这样一个组成部分:

import React, { Component } from 'react'; 
import { 
    AppRegistry, 
    NativeAppEventEmitter 
} from 'react-native'; 
import { Provider } from 'react-redux'; 
import { createStore } from 'redux'; 
import reducers from './src/reducers'; 
import Onboarding from "./src/onboarding/Onboarding"; 
import Home from "./src/home/Home"; 
import codePush from 'react-native-code-push'; 

class Edmund extends Component { 

    ... 

    startScreen() { 
    if (this.state.screen === "HOME") { 
     return (<Home />); 
    } 

    return (
     <Onboarding /> 
    ); 
    } 

    render() { 
    return (
     <Provider store={ createStore(reducers) }> 
     { this.startScreen() } 
     </Provider> 
    ) 
    } 

AppRegistry.registerComponent('Edmund',() => Edmund) 

src/reducers/index.js文件:

import { combineReducers } from 'redux'; 

export default combineReducers({ 
    libraries:() => [] 
}); 

我的包:

{ 
    "name": "Indigo", 
    "version": "0.0.1", 
    "private": true, 
    "scripts": { 
    "start": "node node_modules/react-native/local-cli/cli.js start" 
    }, 
    "dependencies": { 
    "lodash": "^4.13.1", 
    "react": "^15.2.0", 
    "react-native": "^0.27.1", 
    "react-native-apple-pay": "0.0.0", 
    "react-native-code-push": "^1.11.0-beta", 
    "react-native-loading-spinner-overlay": "^0.3.0", 
    "react-native-navigation": "^1.0.2", 
    "react-native-paged-scroll-view": "^2.0.1", 
    "react-native-progress": "^3.0.1", 
    "react-redux": "latest", 
    "redux": "^3.0.0", 
    "underscore": "^1.8.3" 
    }, 
    "devDependencies": { 
    "eslint": "latest", 
    "eslint-config-airbnb": "latest", 
    "eslint-plugin-import": "^1.16.0", 
    "eslint-plugin-jsx-a11y": "latest", 
    "eslint-plugin-react": "latest" 
    } 
} 

我甚至没有做任何幻想,所以我不明白为什么会有这个错误。谁能帮忙?

回答

12

如果你深入到做出反应,终极版的代码有点你看这

if (store !== nextStore) { 
    warnAboutReceivingStore() 
} 

所以它似乎所有你需要做的就是外移动createStore电话。

store = createStore(reducers) 


class Edmund extends Component { 

    ... 

    startScreen() { 
    if (this.state.screen === "HOME") { 
     return (<Home />); 
    } 

    return (
     <Onboarding /> 
    ); 
    } 

    render() { 
    return (
     <Provider store={ store }> 
     { this.startScreen() } 
     </Provider> 
    ) 
    } 

没有测试过,但应该工作。

+1

Dan Abramov在[GitHub issue](https://github.com/reactjs/react-redux/issues/259)中解释了这一点。 – totymedli

0

我得到了同样的错误,解决方法是删除DevTools。

<Provider store={store} > 
    <App /> 
</Provider> 

在组件应用程序的渲染()方法,有:

<DevTools /> 

后我除去DevTools,误差消失。

这不是一个好的解决方案,仅供参考。