react-native - 如何从自定义抽屉中调用 Redux 操作
问题描述
我正在为动态应用程序主题更改编写代码。当我从HomeScreen class
. 但我想更改 App 主题并从抽屉按钮调用操作。
我想this.props.switchTheme()
从抽屉按钮调用。使用它我可以从抽屉按钮更改应用程序主题。
请帮我这样做。
it's my action.js
export const switchTheme = (BaseTheme) => {
return (dispatch) => {
dispatch({
type : 'SWITCH_THEME',
baseTheme : BaseTheme
});
};
};
it's my App.js
export default class App extends Component {
render() {
return (
<Provider store={store}>
<Container />
</Provider>
);
}
}
const AppStackNavigator = createStackNavigator({
Home : { screen: HomeScreen },
pro : {
screen : Profile
},
});
const customDrawerComponent = (props) => {
return (
<View>
<View
style={{
height : 60,
backgroundColor : '#437564',
alignItems : 'center',
justifyContent : 'center',
paddingVertical : 5
}}
/>
<ScrollView style={{ backgroundColor: '#fff' }}>
<DrawerNavigatorItems {...props} />
</ScrollView>
</View>
);
};
const DrawerNav = createDrawerNavigator(
{
Home : {
screen : AppStackNavigator
}
},
{
drawerPosition : 'left',
contentComponent : customDrawerComponent,
contentOptions : {
activeTintColor : '#4c8572',
inactiveTintColor : 'rgba(0,0,0,0.5)'
}
}
);
function mapStateToProps(state) {
return {
theme : state.themeReducer.theme
};
}
const Container = createAppContainer(DrawerNav);
it's is my HomeScreen
class HomeScreen extends Component {
static navigationOptions = ({ navigation }) => {
return {
headerStyle : {
backgroundColor : '#4c8572'
},
headerLeft : (
<View style={{ paddingLeft: 10 }}>
<TouchableOpacity onPress={() => navigation.openDrawer()}>
<Text>Home</Text>
</TouchableOpacity>
</View>
),
headerTitleStyle : {
flex : 1,
color : '#fff',
alignItems : 'center',
justifyContent : 'center',
fontWeight : 'bold'
}
};
};
render() {
return (
<ThemeProvider theme={this.props.theme}>
<Container>
<TextContainer>
<Title>Change my theme</Title>
<TouchableOpacity
onPress={() => this.props.navigation.navigate('pro')}
>
<Title>go to Profile</Title>
</TouchableOpacity>
</TextContainer>
{this.props.theme.mode === 'light' ? (
<Button onPress={() => this.props.switchTheme(darkTheme)}>
<ButtonText>Change to dark theme</ButtonText>
</Button>
) : (
<Button onPress={() => this.props.switchTheme(lightTheme)}>
<ButtonText>Change to light theme</ButtonText>
</Button>
)}
</Container>
</ThemeProvider>
);
}
}
function mapStateToProps(state) {
return {
theme : state.themeReducer.theme
};
}
export default connect(mapStateToProps, { switchTheme })(HomeScreen);
解决方案
我以前遇到过同样的问题。您可以对抽屉执行您对 HomeScreeen 所做的操作,即 mapDispatchToProps。
只需将 customDrawerComponent 组件替换为以下代码
const _customDrawerComponent = (props) => {
return (
<View>
<View
style={{
height : 60,
backgroundColor : '#437564',
alignItems : 'center',
justifyContent : 'center',
paddingVertical : 5
}}
/>
<ScrollView style={{ backgroundColor: '#fff' }}>
<DrawerNavigatorItems {...props} />
</ScrollView>
</View>
);
};
const customDrawerComponent = connect(null, { switchTheme }(_customDrawerComponent);
推荐阅读
- javascript - ReactJS:映射和查找
- c - 如何在函数中传递 2 个值?
- dependency-management - 如何安装此依赖项?
- python - 检查一个数据框中的名称是否存在于其他数据框python中
- javascript - 通过javascript变量获取django变量
- azureml - AzureML 从具有多个文件的数据存储创建数据集 - 路径无效
- c - c - 带有链表的堆栈 - 将元素与头部错误中的元素进行比较
- angular - 使用 RxJS 更新 Observable 数组中的项目
- swiftui - 可以在 SwiftUI Watch 项目中实例化 WKInterfaceController 吗?
- reactjs - 如何更改复选框中的选择方式?