MIP*_*IPB 45 reactjs react-native redux react-redux
我正在尝试使用 React-Redux 库,但标题出现错误。我用 Provider 包装了我的组件,但我仍然收到错误,只有当我实现 useDispatch() 钩子时。
该应用程序运行良好,直到我添加了 useDispatch() 行。可以删除有关调度功能的其余行,但我仍然遇到相同的错误。
如果你能帮助我,我将不胜感激。谢谢
这是我的代码:
import 'react-native-gesture-handler';
import {NavigationContainer} from '@react-navigation/native';
import Navigator from './navigation/Navigator';
import React, {useEffect, useState, useCallback} from 'react';
import {SafeAreaView, StyleSheet, Text, View} from 'react-native';
import {createStore, combineReducers} from 'redux';
import {Provider, useDispatch} from 'react-redux';
import dataReducer from './store/reducers/dataReducer';
import {CONSTANTS} from './constants/constants';
import {saveInitialData} from './store/actions/dataActions';
const App = () => {
const [fetched, setFetched] = useState(initialState);
const dispatch = useDispatch();
const saveInitialDataHandler = useCallback(data => {
dispatch(saveInitialData(data));
callback;
}, []);
const rootReducer = combineReducers({
content: dataReducer,
});
const store = createStore(rootReducer);
useEffect(() => {
fetchData();
}, []);
const fetchData = () => {
fetch(CONSTANTS.database)
.then(response => response.json())
.then(responseJSON => {
setFetched(true);
saveInitialDataHandler(responseJSON);
});
};
if (!fetched) {
return (
<Provider store={store}>
<View stlye={{flex: 1, alignItems: 'center', justifyContent: 'center'}}>
<Text></Text>
</View>
</Provider>
);
} else {
return (
<Provider store={store}>
<NavigationContainer>
<SafeAreaView style={styles.SafeAreaView}>
<Navigator></Navigator>
</SafeAreaView>
</NavigationContainer>
</Provider>
);
}
};
const styles = StyleSheet.create({
SafeAreaView: {flex: 1},
});
export default App;
Run Code Online (Sandbox Code Playgroud)
Bri*_*son 60
App必须包含在 provider 中,因为您正在使用useDispatch它。现在只是个孩子。Provider设置上下文,以便只有它的孩子可以访问它,而不是父母。
一种解决方案是为其创建一个包装器组件:
const AppWrapper = () => {
const store = createStore(rootReducer);
return (
<Provider store={store}> // Set context
<App /> // Now App has access to context
</Provider>
)
}
const App = () => {
const dispatch = useDispatch(); // Works!
...
Run Code Online (Sandbox Code Playgroud)
MD *_*hik 29
如果运行时出现此错误,npm run test则问题与您的测试文件有关。
app.test.tsx用下面的代码更新或替换您的
redux-mock-store注意:如果您还没有安装,请不要忘记安装。
import React from 'react';
import { render } from '@testing-library/react';
import App from './App';
import { Provider } from 'react-redux';
import configureStore from 'redux-mock-store';
describe('With React Testing Library', () => {
const initialState = { output: 10 };
const mockStore = configureStore();
let store;
it('Shows "Hello world!"', () => {
store = mockStore(initialState);
const { getByText } = render(
<Provider store={store}>
<App />
</Provider>
);
expect(getByText('Hello World!')).not.toBeNull();
});
});
Run Code Online (Sandbox Code Playgroud)
经过 1 个小时的搜索,我得到了这个解决方案。非常感谢OSTE
原始解决方案:Github issues/8145 和解决方案链接
使用此解决方案,如果您收到类似TypeError: window.matchMedia is not a function 的错误,请通过这种方式解决。将这些行添加到您的setupTests.ts文件中。原始解决方案链接stackoverflow.com/a/64872224/5404861
global.matchMedia = global.matchMedia || function () {
return {
addListener: jest.fn(),
removeListener: jest.fn(),
};
};
Run Code Online (Sandbox Code Playgroud)
小智 27
也许您将 Provider 导入到 App.js 文件中。Provider需要导入到index.js文件中。
/*index.js*/
import React from 'react';
import ReactDOM from 'react-dom';
import { Provider } from 'react-redux';
import { store } from './store/reduxStore';
import './index.css';
import App from './App';
import reportWebVitals from './reportWebVitals';
ReactDOM.render(
<React.StrictMode>
<Provider store={store}>
<App />
</Provider>
</React.StrictMode>,
document.getElementById('root')
);
Run Code Online (Sandbox Code Playgroud)
我在react-native应用程序的同一个index.js文件上执行了此操作。这样,您就不必导出并添加另一个文件,只是为了向提供商提供应用程序包装。
const ReduxProvider = () => {
return(
<Provider store={store}>
<App />
</Provider>
)
}
AppRegistry.registerComponent(appName, () => ReduxProvider);
Run Code Online (Sandbox Code Playgroud)