javascript - 在组件状态和带有 redux 的道具中使用相同的变量名,我得到未定义道具的错误
问题描述
我有组件需要知道用户是否使用Facebook登录,所以我使用该函数mapStateToProps
将redux 状态映射到组件 props。
同时,一些组件可以让用户自己登录,所以他们需要本地state
知道用户是否登录(我无法更新组件本身内部的组件道具)。
当用户登录时,他们会发送一个loggedIn
事件。
这是最佳实践还是我做错了什么?我有这样的组件:
import ...
const FBSDK = require('react-native-fbsdk');
const {
LoginButton,
AccessToken,
LoginManager
} = FBSDK;
class Settings extends Component {
constructor(props) {
super(props);
this.state = {
isLoggedIn: false,
};
}
componentDidMount () {
this._loadInitialState();
}
async _loadInitialState() {
AccessToken.getCurrentAccessToken().then(
(data) => {
if (data) {
this.setState({
isLoggedIn: true,
});
// Dispatch loggedIn action
this.props.loggedIn();
}
}
);
}
render() {
const {navigate} = this.props.navigation;
return (
<Content>
<List style={styles.list}>
{this.state.isLoggedIn &&
<ListItem>
<Body>
...
</Body>
</ListItem>
}
<ListItem style={styles.listItem}>
<LoginButton
readPermissions={["user_friends", "email"]}
onLoginFinished={
(error, result) => {
if (error) {
alert("login has error: " + result.error);
} else if (result.isCancelled) {
alert("login is cancelled.");
} else {
AccessToken.getCurrentAccessToken().then(
(data) => { this.setState({isLoggedIn: true});
// Dispatch loggedIn action
this.props.loggedIn();
}
).catch(function(e) {
log(e); // "oh, no!"
});
}
}
}
onLogoutFinished={() => {
this.setState({isLoggedIn: false});
// Dispatch loggedOut action
this.props.loggedOut();
}} />
</ListItem>
</List>
</Content>
)
}
}
Settings.propTypes = {
isLoggedIn: PropTypes.bool.isRequired,
}
const mapStateToProps = (state) => {
return {
isLoggedIn: state.isLoggedIn,
};
};
const mapDispatchToProps = (dispatch) => ({
startup: () => dispatch(StartupActions.startup()),
loggedIn: () => dispatch({
type: LOGGED_IN
}),
loggedOut: () => dispatch({
type: LOGGED_OUT
})
});
export default connect(mapStateToProps, mapDispatchToProps, null, {pure: false})(Settings);
如您所见,该组件确实具有isLoggedIn
本地状态和isLoggedIn
道具,我需要同时更新两者。
我在问除了实践之外的原因,当我使用Facebook登录用户时,我收到了这个错误(我没有在哪里寻找,但似乎某处props
未定义):
TypeError: Cannot read property 'loggedIn' of undefined
而且我不知道它发生在哪里以及为什么会发生以及它是否取决于此代码。
解决方案
您需要绑定您的方法以访问this
方法_loadInitialState
。
最简单的方法是使用箭头函数
_loadInitialState = async() => {
完成更新后也会setState
在其回调方法中调度操作
this.setState({
isLoggedIn: true,
}, () => this.props.loggedIn());
onLogoutFinished={() => {
this.setState({isLoggedIn: false}, () => this.props.loggedOut());
}}
推荐阅读
- typescript - 将后台地理位置数据发送到服务器
- javascript - 带有select2的重复值的javascript cicle
- teechart - Techart:对数 x 轴上的结束标签
- django - /connect/ 处的 MultiValueDictKeyError
- r - 数据集每一列的分隔箱线图
- sql - sql server 中总是显示一个炉子的数据
- ruby-on-rails - 由于“'executable-hooks (= 1.6.0)' (Gem::UnsatisfiableDependencyError)”而无法启动 Rails
- c# - 当我使用 iis 将 mvc 应用程序部署到实时服务器时,为什么会收到错误“HRESULT 异常:0x800A03EC”?
- c++ - 如何为着色器的每个顶点提供 14 个浮点值?
- rust - 如何在包含将所有值转换为字符串的不同类型的切片值的枚举上实现迭代器?