一段时间以来,我一直在尝试从组件访问我的redux存储的状态,并且我一直都在收到此错误。我已经阅读了多篇有关如何正确地将组件与redux存储连接但没有运气的教程。以下是我的组件,redux配置和错误消息的摘要。
错误消息 不变违反:在“ Connect(HomeScreen)”的上下文或道具中找不到“ store:”。要么将根组件包装在中,要么将“ store”作为道具明确传递给“ Connect(Homescreen)”。 。 该错误位于: 在Connect(HomeScreen)中(位于Navigation.js:51)
import { AppRegistry } from 'react-native';
import App from './App';
import {Provider} from "react-redux"
import configureStore from "./src/Store/configureStore"
import React from "react"
const store= configureStore()
const RNRedux= () => (
<Provider store={store}>
<App/>
</Provider>
);
AppRegistry.registerComponent('Fluffy', () => RNRedux);
下面是配置存储区
import {createStore, combineReducers} from "redux"
import homeReducer from "./Reducers/homeReducer"
const rootReducer= combineReducers({
home: homeReducer
})
const configureStore = () => {
return createStore(rootReducer)
}
export default configureStore
下面是减速器
import {SHOW_ITEMS} from "../Actions/actionTypes"
const initialState= {
cakes:[
{
id: 1,
name:"Baked blur",
image: require("../../Assets/bake-baked-blur-461279.jpg"),
price: 40,
flavor:["chocolate", "strawberrry","vanilla", "Coffee"],
size: ["14inches","12inches","10inches","8inches","6inches"],
toppings: ["maltesers","gummybears","mint","mentos","smarties"]
},
{
id: 2,
name:"Blueberry Cake",
image: require("../../Assets/bakery-baking-blueberries-291528.jpg"),
price: 15,
flavor:["chocolate", "strawberrry","vanilla", "Coffee"],
size: ["14inches","12inches","10inches","8inches","6inches"],
toppings: ["maltesers","gummybears","mint","mentos","smarties"]
},
{
id: 3,
name:"Birthday Cake",
image: require("../../Assets/baking-berry-birthday-357748.jpg"),
price: 30,
flavor:["chocolate", "strawberrry","vanilla", "Coffee"],
size: ["14inches","12inches","10inches","8inches","6inches"],
toppings: ["maltesers","gummybears","mint","mentos","smarties"]
},
{
id: 4,
name:"Blackberry Cake",
image: require("../../Assets/berries-berry-cake-434243.jpg"),
price: 60,
flavor:["chocolate", "strawberrry","vanilla", "Coffee"],
size: ["14inches","12inches","10inches","8inches","6inches"],
toppings: ["maltesers","gummybears","mint","mentos","smarties"]
},
{
id: 5,
name:"Cheesecake",
image: require("../../Assets/berries-cake-cheesecake-85766.jpg"),
price: 70,
flavor:["chocolate", "strawberrry","vanilla", "Coffee"],
size: ["14inches","12inches","10inches","8inches","6inches"],
toppings: ["maltesers","gummybears","mint","mentos","smarties"]
},
{
id: 6,
name:"Blueberry Fudge",
image: require("../../Assets/berry-blackberry-blueberry-315707.jpg"),
price: 20,
flavor:["chocolate", "strawberrry","vanilla", "Coffee"],
size: ["14inches","12inches","10inches","8inches","6inches"],
toppings: ["maltesers","gummybears","mint","mentos","smarties"]
},
{
id: 7,
name:"Pancake",
image: require("../../Assets/birthday-birthday-cake-cake-140831.jpg"),
price: 70,
flavor:["chocolate", "strawberrry","vanilla", "Coffee"],
size: ["14inches","12inches","10inches","8inches","6inches"],
toppings: ["maltesers","gummybears","mint","mentos","smarties"]
},
{
id: 8,
name:"Vanilla Fudge",
image: require("../../Assets/birthday-birthday-cake-cake-140831.jpg"),
price: 70,
flavor:["chocolate", "strawberrry","vanilla", "Coffee"],
size: ["14inches","12inches","10inches","8inches","6inches"],
toppings: ["maltesers","gummybears","mint","mentos","smarties"]
},
{
id: 9,
name:"Strawberry Fudge",
image: require("../../Assets/blur-cake-cheesecake-219293.jpg"),
price: 70,
flavor:["chocolate", "strawberrry","vanilla", "Coffee"],
size: ["14inches","12inches","10inches","8inches","6inches"],
toppings: ["maltesers","gummybears","mint","mentos","smarties"]
},
{
id: 10,
name:"Mango Slice",
image: require("../../Assets/blur-cake-close-up-355290.jpg"),
price: 70,
flavor:["chocolate", "strawberrry","vanilla", "Coffee"],
size: ["14inches","12inches","10inches","8inches","6inches"],
toppings:
["maltesers","gummybears","mint","mentos","smarties"]
},
],
Customizables:[
{
Flavor:["chocolate", "strawberrry","vanilla", "Coffee"],
Sizes: ["14inches","12inches","10inches","8inches","6inches"],
Toppings: ["maltesers","gummybears","mint","mentos","smarties"]
}
]
}
const homeReducer = (state = initialState, action) => {
switch(action.type){
case SHOW_ITEMS:
return {
...state
}
default:
return state
}
}
export default homeReducer
下面是我连接到商店的组件
import React, { Component } from 'react';
import {View, Text, Platform, Image, StyleSheet, ScrollView, Dimensions} from "react-native"
import { connect } from "react-redux"
import Icon from "react-native-vector-icons/Ionicons"
import SpecialOffer from "../Components/homeScreenComp/SOS/specialOffers"
import initState from "../Store/LocalStore/local"
import ListItem from "../Components/homeScreenComp/listItem"
import Swiper from "../Components/homeScreenComp/specialSwiper"
const Width = Dimensions.get("window").width
class HomeScreen extends Component {
// state = initState
selectionHandler = (key) => {
// const custom = this.state.Customizables
const selPlace = this.props.cakes.find(cakes => {
return cakes.id === key
})
this.props.navigator.push({
screen: "fluffy.OrderScreen",
passProps:{
selectedCake: selPlace,
// Customs: custom
}
})
}
static navigatorStyle = {
navBarHidden: true,
drawUnderNavBar: true,
// navBarTranslucent: true
};
render() {
return (
<View style={styles.cover}>
{/* HEADER */}
<View style={styles.header}>
<View>
<Icon name={Platform.OS === "android"? "md-menu": "ios-menu"} size={30}/>
</View>
<View>
<Text style={styles.text}>Fluffy Dreams</Text>
</View>
<View>
<Icon name={Platform.OS === "android"? "md-notifications": "ios-notifications"} size={30}/>
</View>
</View>
{/* SWIPER */}
<ScrollView showsVerticalScrollIndicator={false}>
<Swiper />
{/* SPECIAL OFFERS */}
<SpecialOffer Dimension={Width}/>
{/* MARKET */}
<View style={{flex: 1}}>
<View style={{height: 50, width: Width, flexDirection: 'row', justifyContent: 'space-between', borderWidth: 2, borderColor: "black", marginTop: 10, alignItems: "center"}}>
<View style={{padding: 5, marginLeft: 5,}}>
<Text style={{ fontWeight: "bold"}}> MARKET</Text>
</View>
<View style={{padding: 5, marginRight: 5,}}>
<Icon name={Platform.OS === "android"? "md-color-filter": "ios-color-filter"} size={30}/>
</View>
</View>
<ScrollView showsHorizontalScrollIndicator={false} overScrollMode="auto" contentContainerStyle={styles.itemWrapper}>
{this.props.cakes.map((cakes, index) => (
<ListItem onPress={this.selectionHandler} key ={index} cakes={cakes} />
))}
</ScrollView>
</View>
</ScrollView>
</View>
)
}
}
const styles= StyleSheet.create({
cover:{
flex: 1,
},
header:{
backgroundColor:"red",
height: 70,
width: "100%",
flexDirection: 'row',
justifyContent: "space-between",
alignItems: 'center',
}
,
text:{
fontSize: 20,
fontWeight: "bold",
},
itemWrapper:{
alignItems: "center",
flex: 1,
width: Width-5 ,
flexDirection: 'row',
flexWrap: 'wrap',
justifyContent: "center",
}
// OfferCarousel:{
// flex:3,
// flexDirection: 'row',
// // backgroundColor: "yellow"
// }
})
const mapStateToProps= state => {
return{
cakes: state.home.cakes
}
}
export default connect(mapStateToProps)(HomeScreen)
App.js
import {Provider} from "react-redux"
import {Navigation} from "react-native-navigation"
import OnboardingScreen from "./src/screens/OnboardingScreen"
import HomeScreen from "./src/screens/HomeScreen"
import NewsScreen from "./src/screens/NewsScreen"
import ProfileScreen from "./src/screens/ProfileScreen"
import CartScreen from "./src/screens/CartScreen"
import ProfileInfoScreen from "./src/screens/ProfileInfoScreen"
import OrderScreen from "./src/screens/OrderScreen"
import configureStore from "./src/Store/configureStore"
const store = configureStore()
Navigation.registerComponent("fluffy.OnboardingScreen", ()=> OnboardingScreen,Provider,store)
Navigation.registerComponent("fluffy.HomeScreen",
()=>HomeScreen,
store,
Provider
)
Navigation.registerComponent("fluffy.NewsScreen", ()=> NewsScreen,
store,
Provider)
Navigation.registerComponent("fluffy.ProfileScreen",
()=> ProfileScreen,
Provider,
store)
Navigation.registerComponent("fluffy.CartScreen",
()=> CartScreen,
Provider,
store)
Navigation.registerComponent("fluffy.ProfileInfoScreen",
()=>ProfileInfoScreen,
Provider,
store)
Navigation.registerComponent("fluffy.OrderScreen",
()=> OrderScreen,
Provider,
store)
export default ()=> Navigation.startSingleScreenApp({
screen : {
screen: "fluffy.OnboardingScreen",
}
})
答案 0 :(得分:1)
问题出在您的modal()
文件中。您没有将App.js
文件中的默认内容导出为任何内容,因此实际上是在将提供程序包装在App.js
周围。
我不像现在使用undefined
那样使用react-native-navigation
。但是,快速浏览一下您在做什么,您需要export default Navigation;
在文件App.js
的末尾。
答案 1 :(得分:0)
不确定这是否是问题,但在导出默认主屏幕中应该有
export default connect(mapStateToProps, null)(HomeScreen)
否则它会抛出一个错误。
null代替了mapDispatchToProps,因为即使您没有连接,connect也会寻找它