[英]React Redux mapstatetoprops undefined
i'm working with react, redux and firestore I'm trying to pass user to a component and then with uid pull some data from firestore.我正在使用 react、redux 和 firestore 我正在尝试将用户传递给组件,然后使用 uid 从 firestore 中提取一些数据。 but for unknown (to me) reason i always get undefined at first but on second render i get the correct data.
但出于未知(对我而言)的原因,我一开始总是不确定,但在第二次渲染时,我得到了正确的数据。
App.js:应用程序.js:
class App extends React.Component {
constructor(props) {
super(props);
this.state = {
user: {},
};
}
async componentDidMount() {
const { setCurrentUser } = this.props;
this.unsubscribeFromAuth = await FB.auth.onAuthStateChanged((user) => {
console.log('User:', user);
if (user) {
this.setState({ user });
localStorage.setItem('user', user.uid);
} else {
this.setState({ user: null });
localStorage.removeItem('user');
}
setCurrentUser(user);
});
}
render() {
return (
<Router>
<div className='App'>
<Header />
<Routes>
<Route path='/' exact element={<Page/>} />
</Routes>
<Footer />
</div>
</Router>
);
}
}
const mapStateToProps = createStructuredSelector({
currentUser: selectCurrentUser,
});
const mapDispatchToProps = (dispatch) => ({
setCurrentUser: (user) => dispatch(setCurrentUser(user)),
});
export default connect(mapStateToProps, mapDispatchToProps)(App);
user action用户操作
import { UserActionTypes } from "./user.types";
export const setCurrentUser = (user) => ({
type: UserActionTypes.SET_CURRENT_USER,
payload: user,
});
user selecter:用户选择器:
import { createSelector } from "reselect";
const selectUser = (state) => state.user;
export const selectCurrentUser = createSelector([selectUser],(user) => .currentUser
page:页:
const Page=({ currentUser }) => {
const [user, setUser] = useState([]);
const userDB = async (currentUser) => {
console.log('userDB START:', currentUser);
if (!currentUser) return;
const userUID = currentUser.currentUser.uid;
const ref = doc(firestore, 'users', userUID);
const data = await getDoc(ref);
const dataSet = await data.json();
if (data) {
//NOTE THAT I NEVER GET IN HERE
console.log('docSnap.data: ', data.data());
setUser(data.data());
} else {
console.log('No such document!');
}
};
useEffect(() => {
userDB();
}, []);
return ();
};
const mapStateToProps = createStructuredSelector({
currentUser: selectCurrentUser,
});
export default connect(mapStateToProps)(Page)
output is: output 是:
userDB START: undefined
用户数据库开始:未定义
Thank you in advance!先感谢您!
useEffect(() => {
userDB(currentUser);
}, []);
In case mapStateToProps is actually undefined like your title says如果 mapStateToProps 实际上是未定义的,就像你的标题说的那样
<Route path='/' exact element={<Page currentUser={this.state.user} />} />
Solved, based on @timotgl, thank you!已解决,基于@timotgl,谢谢!
App.js: removed localstorage because it was not it use. App.js:删除了 localstorage,因为它不是它使用的。
page:页:
const Page= ({ currentUser }) => {
const [user, setUser] = useState([]);
const userDB = async (currentUser) => {
if (!currentUser) return;
const userUID = currentUser.uid;
const ref = doc(firestore, 'users', userUID);
const data = await getDoc(ref);
const dataSet = await data;
if (dataSet) {
console.log('docSnap.data: ', dataSet.data());
setUser(dataSet.data());
} else {
console.log('No such document!');
}
};
//changes in useEffect
useEffect(() => {
setUser(userDB(currentUser));
}, [currentUser]);
return ();
};
const mapStateToProps = createStructuredSelector({
currentUser: selectCurrentUser,
});
export default connect(mapStateToProps)(Page);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.