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

IT技术 reactjs redux react-redux
2021-03-27 20:03:56

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

    useEffect(() => { 
        const user = useSelector(state => state.user);
    });

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

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

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

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

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

6个回答

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

const user = useSelector(state => state.user);
useEffect(() => { 
   // do stuff     
}, [user]);

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

const MyComponent = () => {
  ...
  const user = useSelector(state => state.user);
  ...
}

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

在加载数据之前和之后,您需要在组件内部处理这两种情况
2021-05-31 20:03:56
我想也许我误解了这个问题。由于某个null值,我有一个组件错误我将其解释为组件的constis null但必须是默认状态是null因此,通过将我的组件设置为基于设定值有条件地呈现可以解决它:) 感谢您的帮助。
2021-06-06 20:03:56
useEffect不确保数据已加载。通常你的 redux 状态会有一个初始值,当数据被加载时,你会通过分派一些动作并用你的减速器处理它来更新状态,这将重新渲染你的组件,然后你将拥有加载的数据它。
2021-06-14 20:03:56
这并不能确保在第一次渲染之前加载数据......这是重点 useEffect
2021-06-16 20:03:56
Redux 存储在初始渲染之前调用,但使用其初始值。如果您可以使用有关您要实现的目标的更多详细信息来编辑您的问题,那么也许我可以更好地回答您。
2021-06-16 20:03:56

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

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

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

useEffect(()=>{
  setCurrUser(user);
}, [user]);

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

你有两个选择。

1 - 如果您只需要 store 中的值一次或“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;
      //... 
   },[])
}

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

const MyComponent = () => {
 //...
  const user = useSelector(state => state.user);
  
  useEffect(() => {
    //...
  },[])
 //...
}
除了导入 store,您还可以使用 useStore ( react-redux.js.org/api/hooks#usestore )
2021-05-23 20:03:56
是的,但是 useStore 是一个钩子,不能在函数或其他钩子中使用钩子。所以我们必须在组件级别声明 useStore ,其中可以使用 in 函数访问 store.getState 。因此,这是仅在需要时访问商店的更好方法。
2021-06-01 20:03:56
随着useStore需要的时候,你也只能访问存储。你只需将它作为 dep 传递给钩子并在其中调用 getState 。这比像你那样暴露商店更好的方法恕我直言。const MyComp = () => { const store = useStore(); useEffect(() => { store.getState().foo.bar }, [store]); }
2021-06-15 20:03:56
const tournamentinfofromstore=useSelector(state=>state.tournamentinfo)
useEffect(() => {
console.log(tournamentinfofromstore)
}, [tournamentinfofromstore])

所以问题是,如果你改变 useEffect 内部的状态导致重新渲染,然后又一次 useEffect 被称为“&&”,如果该组件将数据传递给另一个组件将导致无限循环。因为你也在存储该数据在子组件的状态下将导致重新渲染,结果将无限循环。!!