React 从 useEffect 中的 Redux 存储中获取状态

She*_*ixt 18 reactjs redux react-redux

useEffect钩子内的 Redux 存储中获取状态的正确方法是什么?

    useEffect(() => { 
        const user = useSelector(state => state.user);
    });
Run Code Online (Sandbox Code Playgroud)

我正在尝试获取当前状态,useEffect但我无法使用该useSelector调用,因为这会导致错误说明:

Invariant Violation: Hooks can only be called inside the body of a function component.

我想我明白为什么它打破了钩子的主要规则之一。

通过查看Redux 文档上的示例,他们似乎使用一个selectors.js文件来收集当前状态,但mapStateToProps我理解的这个参考不再需要。

我是否需要创建某种应该在useEffect钩子内调用的“getter”函数?

小智 19

不要忘记添加user作为依赖项,useEffect否则您的效果将不会获得更新值。

const user = useSelector(state => state.user);
useEffect(() => { 
   // do stuff     
}, [user]);
Run Code Online (Sandbox Code Playgroud)


El *_*mza 8

您可以将useSelector其他钩子放在组件的顶部:

const MyComponent = () => {
  ...
  const user = useSelector(state => state.user);
  ...
}
Run Code Online (Sandbox Code Playgroud)

然后你可以user在你的useEffects内部访问。

  • 这并不能确保数据在第一次渲染之前加载......这就是“useEffect”的全部要点 (7认同)
  • `useEffect` 不确保数据已加载。通常你的 redux 状态会有一个初始值,当数据加载时,你将通过调度一些动作并使用你的减速器处理它来更新状态,这将重新渲染你的组件,然后你将在里面拥有加载的数据它。 (3认同)

m00*_*007 7

我发现使用两个 useEffects 对我有用,并且使用 useState 来更新用户(或者在本例中为 currUser)。

const user = useSelector(state=>state.user);
const [currUser, setCurrUser] = useState(user);

useEffect(()=>{
  dispatch(loadUser());
}, [dispatch]);

useEffect(()=>{
  setCurrUser(user);
}, [user]);
Run Code Online (Sandbox Code Playgroud)

您必须使用 currUser 来显示和操作该对象。


Wal*_*riq 6

你有两个选择。

1 - 如果您只需要一次或“n”次调用 useEffect 时存储的值,并且不想监听 redux 中用户状态可能发生的任何更改,则使用此方法

//import the main store file from where you've used createStore()
import {store} from './store' // this will give you access to redux store

export default function MyComponent(){
   useEffect(() =>{
      const user = store.getState().user;
      //... 
   },[])
}
Run Code Online (Sandbox Code Playgroud)

2 - 如果您想听用户状态可能发生的变化,那么推荐的答案就是解决方法

const MyComponent = () => {
 //...
  const user = useSelector(state => state.user);
  
  useEffect(() => {
    //...
  },[])
 //...
}
Run Code Online (Sandbox Code Playgroud)

  • 是的,但是 useStore 是一个钩子,并且钩子不能在函数或其他钩子内部使用。因此,我们必须在组件级别声明 useStore,其中 store.getState 可以使用 in 函数访问。因此,这是仅在需要时访问商店的更好方式。 (2认同)