简体   繁体   English

反应 Redux mapstatetoprops undefined

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM