kir*_*imi 5 javascript reactjs react-native redux react-redux
在我的应用程序中,LoginScreen(fristScreen)可以使用facebook登录,当用户成功登录时,应用程序会收到一个Facebook access token并导航到下一个屏幕(VerifyScreen).在VerifyScreen(secondScreen)中,当我单击一个按钮时,我想facebookToken在屏幕上显示全局状态并显示.以下是我的代码:
App.js
import { createStore } from 'redux'
import { Provider } from 'react-redux'
import { createDrawerNavigator, createStackNavigator, } from 'react-navigation'
const reducer = (state = '', action) => {
switch (action.type) {
case 'UPDATE':
return { facebookToken: action.payload}
}
return state
}
const store = createStore(reducer)
class App extends Component {
render(){
return(
<Provider store={store}>
<View style={{flex:1,backgroundColor:'transparent'}}>
<AppDrawerNavigator/>
</View>
</Provider>
)
}
}
Run Code Online (Sandbox Code Playgroud)
LoginScreen.js
import { LoginButton, AccessToken } from 'react-native-fbsdk';
import {connect} from 'react-redux'
class LoginScreen extends Component{
<View>
<LoginButton
onLoginFinished={
(error, result) => {
if (error) {
console.log("login has error: " + result.error);
} else if (result.isCancelled) {
console.log("login is cancelled.");
} else {
this.props.navigation.navigate('VerifyScreen')
AccessToken.getCurrentAccessToken().then(
(data) => {
this.setState({facebookToken:data.accessToken},
() => console.log('facebookToken.state',this.state.facebookToken),
//Here I am getting undefined for 'this.props.facebookToken'
() => console.log('facebookToken.props',this.props.facebookToken),
console.log('facebook login success!'),
console.log('facebook token is:',data.accessToken.toString()))
}
)
}
}
}
onLogoutFinished={() => console.log("logout.")}/>
//I created a button to see if I could call global state. but this would give me an error "state is not defined"
<Button
title="call global state"
onPress={() => this.props.increaseCounter()}/>
</View>
function mapStateToProps(state) {
return {
facebookToken: state.facebookToken
}
}
function mapDispatchToProps(dispatch) {
return {
increaseCounter: () => dispatch({ type: 'UPDATE',payload: state.facebookToken }),
}
}
export default connect(mapStateToProps, mapDispatchToProps)(LoginScreen)
Run Code Online (Sandbox Code Playgroud)
VerifyScreen.js
import React, { Component } from "react";
import {
View,
Text,
StyleSheet,
Button
} from "react-native";
import {connect} from 'react-redux'
class VerifyScreen extends Component {
render() {
return (
<View>
<Button
title="Get facebook Access Token"
onPress={()=>
//I get undefined data when I console.log
console.log(this.state.facebookToken,'this.state.facebookToken')}/>
<Text style={{ fontSize: 20 }}>{this.props.facebookToken}</Text>
</View>
);
}
}
function mapStateToProps(state) {
return {
facebookToken: state.facebookToken
}
}
export default connect(mapStateToProps, null)(VerifyScreen)
const styles = StyleSheet.create({
container: {
flex: 1,
alignItems: 'center',
justifyContent: 'center'
}
});
Run Code Online (Sandbox Code Playgroud)
在我的LoginScreen中,当我在console.log中this.state.facbookToken获取数据时,但当我导航到nextScreen(VerifyScreen)和console.log时,我得到了undefined.
我的问题:如何从VerifyScreen调用全局状态?我对redux很新,所以我可能做错了.任何建议或意见都会有所帮助.提前致谢!
在验证屏幕中,您尝试控制台记录 this.state.facebookToken ,这绝对是未定义的。相反,尝试将代码更新为this.props.facebookToken
console.log(this.props.facebookToken,'this.props.facebookToken')}/>
Run Code Online (Sandbox Code Playgroud)
this.state旨在保存组件级别状态,当您谈论全局状态时,redux 状态取决于this.props.xxx您mapStateToProps定义的方法
更新:
您违反的问题是,
当您分派操作时,您没有将有效负载传递给减速器
increaseCounter: ()=>dispatch({ type: 'UPDATE', payload: state.facebookToken })
Run Code Online (Sandbox Code Playgroud)
然后在你的中App.js,你有以下代码
switch (action.type) {
case 'UPDATE':
return { facebookToken: state.facebookToken}
}
Run Code Online (Sandbox Code Playgroud)
如果你看上面的代码,你会注意到 Redux 的流程是这样工作的,我们尝试分派一个action,它是一个具有两个属性的操作对象,type并且payload(有效负载是可选的,或者你可以将其命名为任何你喜欢的名称),然后在你的减速器中,你可以访问payload如下
switch (action.type) {
case 'UPDATE':
return { facebookToken: action.payload };
}
Run Code Online (Sandbox Code Playgroud)
您可能想知道什么是action.payload我们在早些时候调度时提供的值dispatch({ type: 'UPDATE', payload: state.facebookToken }),所以action.payload简单地说就是state.facebookToken
额外的:
当然取决于您的用例,但通常当我们在reducer中返回一个状态时,我们希望返回所有其他状态,并且只更新更改的特定状态,例如如下所示:
console.log(action);
switch (action.type) {
case 'UPDATE':
return { ...state, facebookToken: state.facebookToken };
}
Run Code Online (Sandbox Code Playgroud)
通常,当我尝试使用 Redux 调试问题时,我会在语句console.log之前执行一个switch操作来找出我正在调度的类型以及我正在传递的有效负载,因此console.log(action)您将能够看到财产和财产type的价值payload
| 归档时间: |
|
| 查看次数: |
1529 次 |
| 最近记录: |