【问题标题】:Redux data is not updating in the UI after fetching data获取数据后,Redux 数据未在 UI 中更新
【发布时间】:2021-03-15 07:25:03
【问题描述】:

我现在正在制作一个 React Native 应用程序。

在我的应用中,我看到了我的个人资料屏幕 在profile screen 中,我得到了一个edit button,这将导致编辑屏幕

在我的个人资料屏幕中,我正在使用 useDispatch 请求 api。fetchAuthMember正在请求用户数据

useEffect(() => {
    async function fetchData() {
      await dispatch(fetchAuthMember(token.access_token));
      await dispatch(fetchCountryList());
    }
    fetchData();
  }, []);

我在配置文件组件中是这样渲染的

const renderItem = () => {
    return (
      <View>
        <View style={styles.profileTitle}>
          <Icon2 name="user-o" size={30} color="black" />
          <Text style={styles.titleFont}> My Profile</Text>
           <View style={styles.contentContainer}>
             <Text style={styles.firstName}>{userInfo.FirstName}</Text>
             <Text style={styles.lastName}>{userInfo.LastName}</Text>
           </View>
        </View>
      <TouchableOpacity
          style={styles.buttonHalfWidth}
          onPress={() =>
            navigation.navigate('EditProfile', {
              screen: 'EditProfile',
              params: {
                firstName: userInfo.FirstName,
                lastName: userInfo.LastName,
              },
            })
          }>
          <Icon2 name="edit" size={30} color="#0382C4" />
          <Text style={styles.buttonText}>Edit</Text>
        </TouchableOpacity>
    </View>

所以当我按下编辑按钮时。它将导航到edit screen。 在编辑屏幕中

当用户按下按钮时,我正在更新这样的数据

        let dataToSend = {
            FirstName: FirstName,
            LastName: LastName,
        };
        console.log(dataToSend)

        await dispatch(updateMemberInfo(token.access_token, dataToSend));
        await dispatch(fetchAuthMember(token.access_token));
        navigation.navigate('MyProfile');

如您所见,我正在使用async and await,并且我也在此处重用fetchAuthMember。 这将再次获取用户。之后导航到profile 页面。事情是

我的profile page 上的名字和姓氏没有更新。但是,如果我尝试在邮递员中调用它。我可以看到更新的数据。我有什么遗漏吗?

行动

 export const fetchAuthMember = (token) => (dispatch) => {
        alert('fetching member')
      axios
        .get(`${baseUri}/api/members`, {
          headers: {
            Authorization: `bearer ${token}`,
          },
        })
        .then((res) => {
          dispatch({
            type: FETCH_USERINFO,
            payload: res.data,
          });
        });
    };

export const updateMemberInfo = (token, data) => (dispatch) => {
  axios
    .put(`${baseUri}/api/members/edit`, data, {
      headers: {
        'Authorization': `bearer ${token}`,
        'Content-Type': 'application/json'
      },
    })
    .then((res) => {
      dispatch({
        type: UPDATE_USERINFO,
                payload: res.data,
      });
    }).catch((err) => {
            console.log(err)
        })
};

减速器

export const authReducer = (state = initialState, action) => {
  switch (action.type) {
    case LOGGED_IN:
      return {...state, token: action.payload, loggedIn: true};
    case LOGGED_OUT:
      return {...state, token: '', loggedIn: false};
    case FETCH_USERINFO:
      return {...state, userInfo: action.payload};
    case UPDATE_USERINFO:
      return {...state};
    default:
      return state;
  }
};

【问题讨论】:

  • dispatch 不是 async 所以不清楚你为什么要等他们。这些异步操作的作用是什么,它们如何更新您的 reducer 中的状态,以及您的 UI 如何订阅您的 redux 存储以进行更改?
  • @DrewReese 您可以使用 await dispatch(thunkAction(arg))await thunkAction(arg)(dispatch) 等待调度一个 thunk 操作重击动作。不过,要使其正常工作,thunkAction 必须返回一个承诺。
  • 您的问题似乎缺少您的操作。如果它们是 thunk 操作,请确保您返回来自它们的承诺:const thunkAction = arg =&gt; dispatch =&gt; { return asyncStuff.then((result)=&gt;dispatch(something(result)))}
  • @HMR 你是正确的 if 调度的 action 返回一个 Promise,但 OP 似乎正在处理所有效果挂钩中的异步调用,而不是 thunk 中的异步调用。目前尚不清楚这些操作在做什么,因此需要更多上下文。
  • 啊,您使用 res.data 的有效负载发送该操作,因此如果它是空的或者您不使用它,您可能需要删除它。

标签: reactjs react-native redux react-redux


【解决方案1】:

在您的操作中执行以下操作:return axios...,目前您的操作没有返回承诺(如两次评论)。

【讨论】:

  • 您好,我尝试实现您所说的,但是我收到了 promise 拒绝错误。我认为我做错了。请你帮我更新代码
  • @Kerry I am getting promise rejection error 你遇到了什么错误。我猜这是CORS错误。如果是,您需要设置一个proxy 进行开发,假设您将生产中的应用程序托管在与 api 相同的 url 上。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-17
  • 1970-01-01
  • 1970-01-01
  • 2017-04-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多