反应-useSelector在分派后未更新

时间:2020-08-01 00:14:29

标签: javascript reactjs react-redux react-hooks

我有一个方法将使用useSelector中的值,而另一个调度将使用useSelector中的值更新我的值,但是,似乎该值在调度后不会更新,例如< / p>

const userProfile = (props) => {
  const hasValidationError = useSelector(state => {
     state.hasValidationError;
  }

  const dispatch = useDispatch():

  const updateProfile = async (userId) => {
     dispatch(startValidation());    // <-- this would change the hasValidationError in state
     if (hasValidationError) {
        console.log('should not update user');
        await updateUser(userId);
        dispatch(showSuccessMsg());
     } else {
        conosole.log('can update user');
     }
  }
}

hasValidationError始终为假,即使值确实从状态更改了,在dispatch(startValidation())之后如何立即获取更新的值?

我还尝试了一些不同的操作,例如使用useState()和useEffect()创建本地状态值以监视全局状态

const [canUpdateUser, setCanUpdateUser] = useState(false);

useEffect(() => {
    console.log('useEffect hasValidationError :>> ', hasValidationError);
    setCanUpdateUser(!hasValidationError);
  }, [hasValidationError]);

然后使用canUpdateUser作为我的updateProfile(if (canUpdateUser))中的条件标志,但是,这似乎仅在第一次触发验证时起作用,但是之后,canUpdateUser的值为总是再次来自我的updateProfile的旧值... 我该如何解决?有什么方法可以确保在某些调度触发后从全局状态获取更新的值?

1 个答案:

答案 0 :(得分:0)

您是否可以尝试使用略有不同的方法(将两者结合),因为似乎您想听hasValidationError的更改,因此使用useEffect并依赖于该变量可以解决您的问题问题。

const userProfile = (props) => {
  const { hasValidationError } = useSelector(state => state);
  const dispatch = useDispatch():

  const [userId, setUserId] = useState();

  const updateProfile = async (userId) => {
     dispatch(startValidation());
     setUserId(userId);
  };

  useEffect(() => {
    if (hasValidationError) {
        console.log('should not update user');
        await updateUser(userId);
        dispatch(showSuccessMsg());
     } else {
        conosole.log('can update user');
     }
  }, [hasValidationError]);
}